2

这个问题要求我写一个谓词seqList(N, L),当 L 是列表时满足[f0, . . . , fN]

在哪里fN = fN-1 + fN-2 + fN-3

我的代码是比较给定列表的头部,比较时将返回真或假。

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,列表应该返回 true ])。有什么方法可以让我反转列表并正确验证它吗?

4

1 回答 1

3

似乎您想要生成N序列的元素,f使得序列列表的第 -th 元素在哪里f(N) = f(N-1) + f(N-2) + f(N-3),-based。三个起始元素也必须作为规范的一部分预先设置。你似乎从.f(X)X0[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谓词是您的解决方案。根据自己的喜好重命名。

于 2012-08-18T14:27:31.193 回答