这个问题要求我写一个谓词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])。我有什么方法可以反转列表并正确验证它吗?
答案 0 :(得分:3)
您似乎希望生成序列N
的{{1}}元素,以便f
其中f(N) = f(N-1) + f(N-2) + f(N-3)
是序列的f(X)
元素list,X
- 基于。三个起始元素也必须预先设置为规范的一部分。您似乎从0
开始。
使用Lazy lists in Prolog?的方法:
[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.
由于您从0,0,1开始,... 将其写下来:
question(N,L):-
由于给出了三个元素,我们只需要找出 L = [0, 0, 1 | X],
更多。 写下来:
N-3
你现在已经在某种程度上减少了这个问题。您现在需要找到 N3 is N-3,
个元素并将它们放入N-3
列表中。为此使用 worker 谓词。它还必须知道每一步的前三个数字:
X
只需记下 worker 必须知道的内容:
worker( N3, 0, 0, 1, X).
如果worker(N, A, B, C, X):-
为0,我们必须停止。 N
然后是一个空列表。 写下来。
X
添加另一个子句,适用于 N = 0, X = [] .
大于0的情况。
N
我们知道下一个元素是前面三个数字的总和。 写下来 。
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).
谓词是您的解决方案。根据自己的喜好重命名。