问题要求我写一个谓词seqList(N, L)
,当L是列表[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,但列表应该返回 true seqList(3,[0,0,1,1]).有什么办法可以反转列表并验证它是否正确?
最佳答案
看来你想生成N
序列的元素 f
这样f(N) = f(N-1) + f(N-2) + f(N-3)
哪里f(X)
是X
- 序列列表的第一个元素,0
-基于。三个起始元素也必须作为规范的一部分预先设置。您似乎是从 [0,0,1, ...]
开始的。
使用 Lazy lists in Prolog? 中的方法:
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,0,1, ... 开始,写下来:
L = [0, 0, 1 | X],
既然给定了三个元素,我们只需要找出N-3
即可更多的。 写下来:
N3 is N-3,
你现在已经稍微减少了这个问题。您现在需要找到N-3
元素并将它们放入 X
列表。为此使用 worker 谓词。它还必须知道每一步的前三个数字:
worker( N3, 0, 0, 1, X).
所以只需写下工作人员必须知道的内容:
worker(N, A, B, C, X):-
如果N
是0,我们必须停止。 X
然后是一个空列表。 写下来。
N = 0, X = [] .
添加另一个子句,for when 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
谓词是你的解决方案。根据您的喜好重命名它。
关于Prolog - 从 f0 到 fN 的序列列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12000522/