【发布时间】:2010-09-26 22:33:58
【问题描述】:
我需要编写一组子句,它们接受一个整数列表并返回一个所有元素都加倍的列表。
例如:
?- double([[1,2],[3]], X).
Yes
X = [2,4,6]
我有一组名为 mega_append 的子句,它们从列表列表中返回单个列表。
例如:
?- mega_append([[1,2],[3]], X).
Yes
X = [1,2,3]
这是我的进度(m_a 是 mega_append 的缩写):
double([],[]).
double(List,[H1|T1]) :-
m_a(List,[H2|T2]),
H1 is 2 * H2,
double(T2, T1).
我将尝试解释我认为它是如何工作的。我将第一个列表展平并将其拆分为头部和尾部(H2 和 T2)。我将第二个列表分成头部和尾部(H1 和 T1)。我检查以确保 H1(加倍值)等于 H2(原始值)的 2 倍。如果是,那么我检查列表的其余部分。最终,如果它们都正确匹配,我应该留下两个空列表,它们应该匹配第一个子句并返回是。
当只有一个值时有效(例如:double([[1]], X))。谁能提供任何关于我做错了什么的见解?我的逻辑或代码不正确吗?
【问题讨论】:
-
如果 mega_append 得到一个列表而不是列表列表会怎样?前任。 ?- mega_append([2,3], X).
标签: prolog