Prolog - 从f0到fN的序列表

时间:2012-08-17 05:59:30

标签: prolog

这个问题要求我写一个谓词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])。我有什么方法可以反转列表并正确验证它吗?

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). 谓词是您的解决方案。根据自己的喜好重命名。