我正在尝试理解Prolog中递归是如何工作的。考虑下面的程序。
edge(a,b).
edge(b,c).
edge(c,d).
edge(a,d).
edge(c,e).
path(d).
path(Vertex) :- edge(Vertex, Next), write(Next), path(Next).运行路径(A)。
输出:
?- path(a).
bcd
true ;
ed
true;
false我不太明白的是这个程序的循环部分。所以我们从a开始,然后到b,c和d,一旦我们看到d,我们就停止。我无法理解第四行中的输出'ed‘。为什么它会变成e,d,然后返回true。我也不明白在查询另一个结果时,运算符“;”是如何工作的。这是否意味着获得下一个可能的结果?
另一个例子:下面的程序写入从一个节点到另一个节点的所有可能的路径。我不明白循环是如何在这个程序中显示不同的路径列表的。
link( a, b ).
link( a, d ).
link( b, c ).
link( d, e ).
link( e, c ).
link( e, f ).
link( f, a ).
link( f, g ).
link( f, j ).
link( g, h ).
link( h, i ).
link( i, j ).
not( X ) :- X, !, fail.
not( _ ).
writeallpaths( Node, Node ) :-
write( Node ), write( ' is ' ), write( Node ), nl.
writeallpaths( Node, Next ) :-
listpath( Node, Next, [Node], List ),
write( Node ), write( ' to ' ), write( Next ), write( ' is ' ),
writepath( List ),
fail.
writepath( [] ) :-
nl.
writepath( [Head|Tail] ) :-
write( ' ' ), write( Head ), writepath( Tail ).
listpath( Node, End, Outlist ) :-
listpath( Node, End, [Node], Outlist ).
listpath( Node, Node, _, [Node] ).
listpath( Node, End, Tried, [Node|List] ) :-
link( Node, Next ),
not( member( Next, Tried )),
listpath( Next, End, [Next|Tried], List ).发布于 2017-12-04 16:59:30
我也不明白在查询另一个结果时运算符';‘是如何工作的。这是否意味着获得下一个可能的结果?
是。发生的情况是,当您进入;找到解决方案"bcd“后,Prolog会尝试寻找替代解决方案。在您的例子中,它“返回”(回溯)到"c“,因为它有到"e”的替代路径,并从那里继续搜索,直到它到达"d“。显然,它不会打印整个解决方案"bced",因为Prolog不会返回到最开始,而是只打印到"c",所以只打印"c“之后的节点。
此外,您可以始终使用trace/0谓词,它允许您详细查看Prolog如何执行代码。
https://stackoverflow.com/questions/47626322
复制相似问题