Prolog - 从 f0 到 fN 的序列列表

标签 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]).有什么办法可以反转列表并验证它是否正确?

最佳答案

看来你想生成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/

相关文章:

prolog:如何用 global_cardinality 判断列表至少有 N 个等于 M 的元素(M,N 是整数)

prolog - Prolog 的 DCG 问题

prolog - SICStus 序言 : Find all solutions

Prolog查找所有匹配条件的子集

prolog - 删除 SWI-Prolog 中的元素或列表

prolog - 如何卡住变量列表的目标?

list - 将现有列表写入 Prolog 中的新列表

Prolog - 获取语法错误 - 预期的运算符(operator)

prolog - prolog 定义中的输入/输出参数

prolog - 在 Prolog 中递归后返回一个值