显示路径的Prolog

显示路径的Prolog,prolog,meta-predicate,Prolog,Meta Predicate,我有以下简单的图表: x y z 示例查询: ?- path(x,z,P). P = [x, y, z] ; % works as expected false. ?- path(z,x,P). false. % unexpectedly fails! 如何使上述查询成功?如果要处理无向图: 首先,我们通过定义谓词edge/2来记录已知事实: edge(x

我有以下简单的图表:

x y z

示例查询:

?- path(x,z,P).
P = [x, y, z] ;                   % works as expected
false.

?- path(z,x,P).                        
false.                            % unexpectedly fails!
如何使上述查询成功?

如果要处理无向图:


首先,我们通过定义谓词
edge/2
来记录已知事实:

edge(x,y).
edge(y,x).
edge(y,z).
edge(z,y).
然后我们使用
edge/2
与类似的方法结合使用:

下面这个非常一般的查询怎么样?基于边/2的所有可能路径是什么

?- path(edge,Path,From,To).
  From = To,         Path = [To]
; From = x , To = y, Path = [x,y]
; From = x , To = z, Path = [x,y,z]
; From = y , To = x, Path = [y,x]
; From = y , To = z, Path = [y,z]
; From = z , To = y, Path = [z,y]
; From = z , To = x, Path = [z,y,x]
; false.

再倒过来。但是为什么呢?如果我想知道从z到x的路径是否可行。如果我问这个问题,我什么也得不到。如果不使用reverse和vanillaprolog,我如何做上述工作?
edge(x,y).
edge(y,x).
edge(y,z).
edge(z,y).
?- path(edge,Path,x,z).              % one direction
  Path = [x,y,z]
; false.

?- path(edge,Path,z,x).              % other direction
  Path = [z,y,x]
; false.
?- path(edge,Path,From,To).
  From = To,         Path = [To]
; From = x , To = y, Path = [x,y]
; From = x , To = z, Path = [x,y,z]
; From = y , To = x, Path = [y,x]
; From = y , To = z, Path = [y,z]
; From = z , To = y, Path = [z,y]
; From = z , To = x, Path = [z,y,x]
; false.