首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog -从f0到fN的序列列表

Prolog -从f0到fN的序列列表
EN

Stack Overflow用户
提问于 2012-08-17 05:59:30
回答 1查看 674关注 0票数 2

这个问题要求我编写一个谓词seqList(N, L),当L是list [f0, . . . , fN]时,它是满足的。

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

我的代码是比较给定列表的头,比较时将返回true或false。

代码语言:javascript
运行
复制
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)返回me true。有什么方法可以让我逆转列表并正确地验证它吗?

EN

回答 1

Stack Overflow用户

发布于 2012-08-18 14:27:31

您似乎希望生成序列ff元素,例如f(N) = f(N-1) + f(N-2) + f(N-3),其中f(X)是序列列表0-based的X-th元素。这三个启动元素也必须作为规范的一部分预先设置。你似乎是从[0,0,1, ...]开始的。

使用Lazy lists in Prolog?的方法

代码语言:javascript
运行
复制
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.

现在,所有这些函数都可以进行融合和内联,从而得到一个递归定义。

但你可以直接做。你只需要把问题写下来,就能拿回答案。

代码语言:javascript
运行
复制
question(N,L):- 

既然你从0,1开始.写下来:

代码语言:javascript
运行
复制
    L = [0, 0, 1 | X],

由于这三个元素是给定的,所以我们只需要更多地了解N-3写下来:

代码语言:javascript
运行
复制
    N3 is N-3,

您现在已经在一定程度上减少了问题。现在您需要找到N-3元素并将它们放到X列表中。为此使用工人谓词。它还必须在每一步都知道前面的三个数字:

代码语言:javascript
运行
复制
    worker( N3, 0, 0, 1, X).

因此,只需写下工人必须知道的

代码语言:javascript
运行
复制
worker(N, A, B, C, X):-

如果N是0,我们必须停止。然后,X是一个空列表。把它写下来.

代码语言:javascript
运行
复制
    N = 0, X = [] .

添加另一个子句,用于N大于0时。

代码语言:javascript
运行
复制
worker(N, A, B, C, X):-
    N > 0, 

我们知道下一个元素是前面三个数字的和。把它写下来,

代码语言:javascript
运行
复制
    D is A + B + C,

列表中的下一个元素是参数列表的顶部元素(最后一个参数)。写下来:

代码语言:javascript
运行
复制
    X = [D | X2 ],

现在要添加的元素少了一个。写下来:

代码语言:javascript
运行
复制
    N2 is N - 1, 

要找到列表的其余部分,最后三个数字是B, C,D。其余部分由worker 以完全相同的方式找到:

代码语言:javascript
运行
复制
    worker( N2, B, C, D, X2).

就这样。question谓词是您的解决方案。按你的喜好重新命名。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12000522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档