在prolog中递归求和
我试图使用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
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的第二个参数是一个原子(在本例中代表一个节点),并且你给它一个列表
第五个问题是:您似乎认为权重位于节点上,它们明显位于边上
所以我认为你的任务有两个问题:
connect(Head,NextNode,weight)
,它(通过统一)为您提供权重和可能的NextNode,然后递归调用将检查NextNode是否确实是列表中的下一个元素。在递归调用之后,使用Weight而不是Head,它应该更接近解决方案
注:请随意创建一个
列表\u sum\u aux/3
,并使用它。您的下一个问题建议您自己回答这个问题。您可以删除此问题或添加答案。这与此问题密切相关:。