我正在尝试使用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
答案 0 :(得分:1)
我发现您的代码存在三个问题。第一个是你有一个你没有使用的逻辑变量X,第二个是你的谓词list_sum
将列表作为它的第一个元素然而你给它一个谓词 connect(Head,Tail,X)
,第三个是你在添加中使用Head而显然Head是一个原子,而不是 Integer (也许你的意思是X),第四个(我正在寻找它们)是谓词连接的第二个参数是一个原子(在这种情况下代表一个节点)并且你给它一个列表。
问题的第五个问题:您似乎认为权重位于节点,它们明显位于边缘。
所以我认为你的任务问题有两个方面:
在Prolog中,编程的核心工件是谓词,而不是函数。因此,要获得给定链接的权重,请调用connect(Head,NextNode, Weight)
,它为您(通过统一)提供权重和可能的NextNode,然后递归调用将检查NextNode是否确实是列表中的下一个元素。在递归调用之后,使用Weight而不是Head,它应该更接近解决方案。
PS:可以随意创建list_sum_aux/3
并使用它。