在prolog中递归求和

在prolog中递归求和,prolog,Prolog,我试图使用Prolog通过递归找到路径的和。我需要传递一个图的节点列表,然后让它返回它们的权重之和 这是我尝试过的,但我不确定我是否走上了正确的道路 connect(a,b,5). connect(b,c,8). connect(a,d,10). connect(d,e,6). connect(d,f,11). connect(d,g,4). connect(b,d,2). connect(b,e,9). connect(c,d,4). connect(c,f,5). connect(e,g,2

我试图使用Prolog通过递归找到路径的和。我需要传递一个图的节点列表,然后让它返回它们的权重之和

这是我尝试过的,但我不确定我是否走上了正确的道路

connect(a,b,5).
connect(b,c,8).
connect(a,d,10).
connect(d,e,6).
connect(d,f,11).
connect(d,g,4).
connect(b,d,2).
connect(b,e,9).
connect(c,d,4).
connect(c,f,5).
connect(e,g,2).
connect(f,g,1).

list_sum([], 0).
list_sum([Head | Tail], TotalSum) :-    
   list_sum(connect(Head,Tail,X), Sum1),
   TotalSum is Head + Sum1.
示例目标:

list_sum([a,b,c],Sum).
Sum = 13

我发现你的代码有三个问题。第一个是您有一个未使用的逻辑变量X,第二个是您的谓词
list\u sum
list作为其第一个元素,但您给它一个谓词
connect(Head,Tail,X)
,第三个是在加法中使用Head,而显然Head是一个原子,而不是一个整数(这里你可能指的是X),第四个(我在查找它们的同时)是谓词connect的第二个参数是一个原子(在本例中代表一个节点),并且你给它一个列表

第五个问题是:您似乎认为权重位于节点上,它们明显位于边上

所以我认为你的任务有两个问题:

  • 检查给定给您的路径是否实际上是一条路径(即每个元素与下一个元素之间存在连接)
  • 如果它确实是一条路径,那么将沿途连接的权重相加
  • 在Prolog中,编程的核心工件是谓词,而不是函数。因此,为了获得给定链接的权重,您调用
    connect(Head,NextNode,weight)
    ,它(通过统一)为您提供权重和可能的NextNode,然后递归调用将检查NextNode是否确实是列表中的下一个元素。在递归调用之后,使用Weight而不是Head,它应该更接近解决方案


    注:请随意创建一个
    列表\u sum\u aux/3
    ,并使用它。

    您的下一个问题建议您自己回答这个问题。您可以删除此问题或添加答案。这与此问题密切相关:。