微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Prolog中查找连接到顶点的所有节点

如何解决在Prolog中查找连接到顶点的所有节点

我对寻路算法很好奇,所以我看了一下 Dijkstra 的。我使用 this 视频作为指导(这也是我绘制图表的基础)。这是我正在使用的图表:

Image

我现在希望能够找到给定顶点的所有连接。我认为我应该为此使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?