首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog:具有一次规则的列表上的递归

Prolog:具有一次规则的列表上的递归
EN

Stack Overflow用户
提问于 2016-02-07 19:51:33
回答 1查看 629关注 0票数 0

很可能我无法恰当地表达我的搜索关键词。我要做的是递归地计算列表中连续条目的差异,并继续将它们添加到全局计数器中。最后的挑战是循环子句,因此如果list是[5,4,3,2,1],则谓词应该返回(5-4)+(4-3)+(3-2)+(2-1)+(1-5)=0

到目前为止,我的情况如下:

代码语言:javascript
运行
复制
circularSumOfDifferences([_],0).
circularSumOfDifferences([E1,E2|List],Sum) :-
    Diff is E1-E2,
    circularSumOfDifferences([E2|List],SoD),
    Sum is Diff+SoD.

现在,我已经考虑过定义另一个谓词,在给定列表的尾部添加列表的第一个元素,并结合查询:copyHeadToTail([5,4,3,2,1],Result),circularSumOfDifferences(Result,C).调用新的列表。

这是不难理解的,但在我看来并不是很优雅。我想知道是否有一种方法只定义一个谓词circularSumOfDifferences(+L,-SoD),该谓词通过列表递归,并在结束(或开始)运行一条语句,用于该子字符串,即1-5

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-07 20:38:49

当然,您可以编写一个谓词,但是您应该注意到,列表中的每个元素X在总和中出现了两次,一次以X形式出现,一次以-X形式出现。无论您给出这个谓词的数字列表,结果始终是0。这是作业吗?很可能重点是注意到这一点,而不是试图计算实际金额:

代码语言:javascript
运行
复制
always_zero([], 0).
always_zero([X|Xs], 0) :-
    number(X),
    always_zero(Xs, 0).

如果您坚持这样做的话,您可能会想要编写谓词:

代码语言:javascript
运行
复制
circ_sum_of_diff([X|Xs], Sum) :- % must have at least one element I guess?
    circ_sum_of_diff_1(Xs, X, X, 0, Sum).

circ_sum_of_diff_1([], Last, First, SoFar, Sum) :-
    Sum is SoFar + Last - First.
circ_sum_of_diff_1([X|Xs], X0, First, SoFar0, Sum) :-
    SoFar is SoFar0 + X0 - X,
    circ_sum_of_diff_1(Xs, X, First, SoFar, Sum).

这使用了一个辅助谓词,这在Prolog程序中很常见。实际上在列表上迭代的辅助谓词有三个额外的参数:列表的解压头、最初的第一个元素(在列表末尾使用)和到目前为止的和。

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

https://stackoverflow.com/questions/35258273

复制
相关文章

相似问题

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