在简单的Prolog图中查找循环

时间:2015-12-05 00:26:50

标签: graph prolog cycle

我在使用这个简单的Prolog图时遇到了麻烦,我正在尝试测试一个周期,并且不知道为什么它不起作用。 isPath似乎有效,问题在于cycle函数,该函数应检查给定字母上是否存在循环。有人可以帮忙吗?

path(a, b).
path(a, c).
path(a, f).
path(b, e).
path(c, d).
path(d, a).
path(d, h).
path(e, f).
path(e, g).
path(e, h).
path(f, g).
path(f, b).
path(h, g).

isPath(X, X) :-
   path(X, Y).

isPath(X, Y) :-
   path(X, Z),
   isPath(Z, Y).

cycleIt(J) :-
   isPath(J, K),
   isPath(K, J).

1 个答案:

答案 0 :(得分:0)

你可以使用DCG! 你怎么能找到周期?您需要找到一个节点From,通过边缘链接到另一个节点Via,然后从Via,您需要找到一个以From结尾的路径,并且在此搜索期间您不能有循环。 所以:

cycle --> [X], {path(X, Y)},search(Y, X, []).

% the search is ended
search(From, To, _Visited)--> {path(From,To)}, [From,To].

% we try an another path using Via, which has not been already visited
search(From, To, Visited)--> {path(From,Via), \+member(Via, Visited)}, [From], search(Via, To, [Via|Visited]).

结果

 ?- phrase(cycle, A,[]).
A = [a, c, d, a] ;
A = [b, e, f, b] ;
A = [c, d, a, c] ;
A = [d, a, c, d] ;
A = [e, f, b, e] ;
A = [f, b, e, f] ;
false.