如何解决在Prolog中查找连接到顶点的所有节点
我对寻路算法很好奇,所以我看了一下 Dijkstra 的。我使用 this 视频作为指导(这也是我绘制图表的基础)。这是我正在使用的图表:
我现在希望能够找到给定顶点的所有连接。我认为我应该为此使用 findall
,我尝试在下面的 all_connections
目标中使用它。但是,对于 main
,我的输出是 [b,b,b]
。为什么会这样?这是没有意义的。如果您明白我做错了什么,请告诉我。
connection(s,c,3).
connection(c,l,2).
connection(l,i,4).
connection(l,j,4).
connection(i,6).
connection(i,k,4).
connection(j,4).
connection(k,e,5).
connection(e,g,2).
connection(g,h,2).
connection(h,f,3).
connection(f,d,5).
connection(d,a,4).
connection(b,3).
connection(b,s,2).
connection(b,1).
connection(a,7).
are_connected(A,B,score) :-
connection(A,score);
connection(B,A,score).
all_connections(A,Z) :-
findall(A,are_connected(A,_,_),Z).
main :-
all_connections(b,X),write(X).
解决方法
恭喜您解决了问题。如果您将解决方案作为答案发布,我们可以为它点赞。
这是对其他事情的评论:由于您是一个相对初学者,现在是学习良好编码约定的最佳时机。具体来说,这是:
are_connected(A,B,Score) :-
connection(A,Score);
connection(B,A,Score).
非常糟糕。 Prolog 的析取是一个非常强大但经常令人困惑的工具。当您使用它时,使用应该真正突出。否则很容易将您的代码误认为:
are_connected(A,Score),connection(B,Score).
按照你写的方式,分号很容易在行尾漏掉。经验法则:永远不要在行尾使用 ;
。
替代方案:
are_connected(A,Score).
are_connected(A,Score) :-
connection(B,Score).
(此转换仅有效,因为您的定义的整个主体都是分离的。)
are_connected(A,Score) :-
( connection(A,Score)
; connection(B,Score) ).
或者:
are_connected(A,Score) :-
(
connection(A,Score)
;
connection(B,Score)
).
你懂的。这些变体中的每一个都清楚地表明您所做的与使用连词非常不同。
,以下是我解决问题的方法:
are_connected(A,S) :-
connection(A,S)
;
connection(B,S).
非常感谢 Isabelle 为我提供有关正确约定的建议。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。