两个列表中具有相同索引的元素之和的Prolog列表

两个列表中具有相同索引的元素之和的Prolog列表,prolog,Prolog,我是Prolog的新手,我正在寻找一个关于如何思考解决以下问题的示例: 我们有两个列表,我们需要一个新的列表,它由两个列表中具有相同索引的元素和组合而成 ?-sm([1,2,3,4],[3,4,5,6],X). X=[4,6,8,10]. 我们应该如何解决这个问题?使用简单链表(任何语言)的唯一合适方法是首先处理头部,然后处理其余部分 因此,我们只需要取每个列表的头,处理它们,然后继续(操作的结果将成为结果列表其余部分的头) 在prolog中,这表示为: sm([],[],[]). % we

我是Prolog的新手,我正在寻找一个关于如何思考解决以下问题的示例: 我们有两个列表,我们需要一个新的列表,它由两个列表中具有相同索引的元素和组合而成

?-sm([1,2,3,4],[3,4,5,6],X).
 X=[4,6,8,10].

我们应该如何解决这个问题?

使用简单链表(任何语言)的唯一合适方法是首先处理头部,然后处理其余部分

因此,我们只需要取每个列表的头,处理它们,然后继续(操作的结果将成为结果列表其余部分的头)

在prolog中,这表示为:

sm([],[],[]). % we reached the end
sm([Head1|Rest1],[Head2|Rest2],[ResultHead|RestResult]) :-
    ResultHead is Head1 + Head2, % '=' unifies, 'is' computes !!!
    sm(Rest1,Rest2,RestResult).
我现在保持简单-我看到这个解决方案至少有两个问题,让我们以交互方式发现它们并扩展答案;-)

编辑:sm([],[])。当然是错误的(不同的arity=>不同的谓词)


已更正为sm([],[],[])。

?-sm(A,B,C):-maplist(plus,A,B,C)。
一种方法是递归。仅仅按照列表数据类型定义作为一对元素和一个列表,或者一个空列表。这是一块很难的面包。一些基本的教程和示例至少可以为您提供入门的想法。仔细看看,尤其是那些处理列表的。你会发现这很有帮助。如果你稍微研究一下,面包就不会像你想象的那样有了。:)好的,我将尝试学习更多,但Prolog似乎与典型的命令式编程语言非常不同。我们需要将每次迭代的结果附加到某个列表中,然后返回它。如何在此处(以及何处)提供另一个变量?为什么这不起作用<代码>sm([],[])。sm([Head1 | Rest1],[Head2 | Rest2],R):-resultem是Head1+Head2,append([resultem],R,R),sm(Rest1,Rest2,R)。@krzyhub
append([resultem],R,R)
永远不会成功,因为
append(A,B,C)
意味着
length(C)==length(A)+length(B)
。我通过另一个问题得到了它,但如果没有你的帮助,一切都将化为乌有。谢谢。小错误,sm([],[])缺少一个参数-[]。在prolog中,dm/2和dm/3是完全不同的谓词。