这个问题要求我编写一个谓词seqList(N, L),当L是list [f0, . . . , fN]时,它是满足的。
在哪里fN = fN-1 + fN-2 + fN-3
我的代码是比较给定列表的头,比较时将返回true或false。
seqList(_,[]).
seqList(N,[H|T]) :-
N1 is N - 1,
seq(N,H),
seqList(N1,T).但是,只有当值反转时,它才有效,例如,seqList(3,1,1,0,0)将返回true,但是列表应该为seqList(3,0,0,1,1)返回me true。有什么方法可以让我逆转列表并正确地验证它吗?
发布于 2012-08-18 14:27:31
您似乎希望生成序列f的f元素,例如f(N) = f(N-1) + f(N-2) + f(N-3),其中f(X)是序列列表0-based的X-th元素。这三个启动元素也必须作为规范的一部分预先设置。你似乎是从[0,0,1, ...]开始的。
seqList(N,L):- N >= 3, !,
L=[0,0,1|X], N3 is N-3, take(N3, seq(0,0,1), X-[], _).
next( seq(A,B,C), D, seq(B,C,D) ):- D is A+B+C.现在,所有这些函数都可以进行融合和内联,从而得到一个递归定义。
但你可以直接做。你只需要把问题写下来,就能拿回答案。
question(N,L):- 既然你从0,1开始.写下来:
L = [0, 0, 1 | X],由于这三个元素是给定的,所以我们只需要更多地了解N-3。写下来:
N3 is N-3,您现在已经在一定程度上减少了问题。现在您需要找到N-3元素并将它们放到X列表中。为此使用工人谓词。它还必须在每一步都知道前面的三个数字:
worker( N3, 0, 0, 1, X).因此,只需写下工人必须知道的:
worker(N, A, B, C, X):-如果N是0,我们必须停止。然后,X是一个空列表。把它写下来.
N = 0, X = [] .添加另一个子句,用于N大于0时。
worker(N, A, B, C, X):-
N > 0, 我们知道下一个元素是前面三个数字的和。把它写下来,。
D is A + B + C,列表中的下一个元素是参数列表的顶部元素(最后一个参数)。写下来:
X = [D | X2 ],现在要添加的元素少了一个。写下来:
N2 is N - 1, 要找到列表的其余部分,最后三个数字是B, C,和D。其余部分由worker 以完全相同的方式找到:
worker( N2, B, C, D, X2).就这样。question谓词是您的解决方案。按你的喜好重新命名。
https://stackoverflow.com/questions/12000522
复制相似问题