递归地在prolog中找到总和

时间:2016-03-09 05:18:36

标签: 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).
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

1 个答案:

答案 0 :(得分:1)

我发现您的代码存在三个问题。第一个是你有一个你没有使用的逻辑变量X,第二个是你的谓词list_sum列表作为它的第一个元素然而你给它一个谓词 connect(Head,Tail,X),第三个是你在添加中使用Head而显然Head是一个原子,而不是 Integer (也许你的意思是X),第四个(我正在寻找它们)是谓词连接的第二个参数是一个原子(在这种情况下代表一个节点)并且你给它一个列表。

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

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

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

    PS:可以随意创建list_sum_aux/3并使用它。