【问题标题】:Prolog Connected Edge of a graph图的 Prolog 连接边
【发布时间】:2014-02-23 18:08:01
【问题描述】:

我想创建一个谓词来检查一个节点是否可以在序言中到达图中的另一个节点。例如Connected(1,X,[[1,3],[3,4],[2,5]]) 第一个参数是我要启动的节点,第二个是我要到达的节点,第三个是边列表。到目前为止,我已经设法做到了,但是当我尝试使用 findall/3 获取我到达的所有节点时,我得到了一个无限循环。

有什么办法可以停止无限循环,或者我应该从一开始就解决问题?

到目前为止,这是我的代码:

 match([X,Y],List):- member([X,Y], List).
 match([X,Y],List):- member([Y,X], List).


go(X,Y,List):-match([X,Y],List).
go(X,Y,List):-match([X,Z],List),go(Z,Y,List).

goes(X,List,List2):-findall(Y,go(X,Y,List),List2).

我是 Prolog 的新手,我不知道我做错了什么。

【问题讨论】:

  • 边的常用表示是X-Y 而不是[X,Y]

标签: prolog graph-theory


【解决方案1】:

可能对您的代码进行更正

match([X,Y], List, Rest):- select([X,Y], List, Rest).
match([X,Y], List, Rest):- select([Y,X], List, Rest).

go(X,Y,List) :- match([X,Y],List,_).
go(X,Y,List) :- match([X,Z],List,Rest), go(Z,Y,Rest).

goes(X,List,List2) :- findall(Y, go(X,Y,List), List2).

现在匹配“消耗”一条边,然后避免无限循环

【讨论】:

    【解决方案2】:

    看看?- gtrace, goes(1,[[1,3],[3,4],[2,5]], X). 做了什么。

    对于所有递归go :- go,当它停止时,您需要一个条件。

    在您的情况下,我建议添加一个参数Traversed,它是您访问过的所有节点(或边)的列表。然后,如果您已经访问过节点,则不要再次访问它们。 因此,递归查看的元素越来越少,并且递归在某个点结束。

    许多递归都使用谓词!。看看吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多