似乎您想要生成N
序列的元素,f
使得序列列表的第 -th 元素在哪里f(N) = f(N-1) + f(N-2) + f(N-3)
,-based。三个起始元素也必须作为规范的一部分预先设置。你似乎从.f(X)
X
0
[0,0,1, ...]
使用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( N3, 0, 0, 1, X).
因此,只需写下工人必须知道的内容:
worker(N, A, B, C, X):-
如果N
为0,我们必须停止。X
然后是一个空列表。写下来。
N = 0, X = [] .
添加另一个子句,for whenN
大于 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
谓词是您的解决方案。根据自己的喜好重命名。