序言:如果可以在图中遍历两个节点

时间:2019-01-09 19:34:45

标签: prolog

这是我得到的问题:

  

定义Prolog谓词路径(X,Y,G),其中path(-,-,+)为   当在有向图G中存在从节点X到节点Y的路径时为true,   其中的图形由边的列表表示,每个边由   源和目标节点的两元素列表。

这是示例输出:

 ?- path(b,Y,[[a,b],[b,c],[b,d],[d,e]]).
 Y = c ;
 Y = d ;
 Y = e ;
 no
 ?- path(X,b,[[a,b],[b,c],[b,d],[d,e]]).
 X = a ;
 no
 ?- path(c,e,[[a,b],[b,c],[b,d],[d,e]]).
 yes

这与我在网上看到的其他示例不同,在这些示例中,节点遍历是诸如以下事实:

canTraverse(a,b).

canTraverse(b,c).

所以我很困惑。

这是我到目前为止所得到的:

path(X, Y, G) :-
    (
        G = [CurrentPair | EverythingElse],
        CurrentPair = [X1 , Y1| _],
        =(X, X1),
        =(Y, Y1)
    ) 
    ;
    path(X, Y, EverythingElse).

如果两个节点X和Y一起在一对/列表中,这似乎可以工作。但是我不确定如何使它遍历节点。

1 个答案:

答案 0 :(得分:0)

图形是有向的,没有循环。

基本情况可以为path(X, Y, G) :- member([X,Y],G).,而递归情况可以说是存在从X到Y的路径,从X到某个中间音符然后找到从中间到Y的路径。