首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >下列Prolog程序中的意外行为

下列Prolog程序中的意外行为
EN

Stack Overflow用户
提问于 2017-12-04 12:03:36
回答 1查看 42关注 0票数 0

我正在尝试理解Prolog中递归是如何工作的。考虑下面的程序。

代码语言:javascript
运行
复制
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)。

输出:

代码语言:javascript
运行
复制
?- path(a).
bcd
true ;
ed
true;
false

我不太明白的是这个程序的循环部分。所以我们从a开始,然后到b,c和d,一旦我们看到d,我们就停止。我无法理解第四行中的输出'ed‘。为什么它会变成e,d,然后返回true。我也不明白在查询另一个结果时,运算符“;”是如何工作的。这是否意味着获得下一个可能的结果?

另一个例子:下面的程序写入从一个节点到另一个节点的所有可能的路径。我不明白循环是如何在这个程序中显示不同的路径列表的。

代码语言:javascript
运行
复制
 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 ).
EN

回答 1

Stack Overflow用户

发布于 2017-12-04 16:59:30

我也不明白在查询另一个结果时运算符';‘是如何工作的。这是否意味着获得下一个可能的结果?

是。发生的情况是,当您进入;找到解决方案"bcd“后,Prolog会尝试寻找替代解决方案。在您的例子中,它“返回”(回溯)到"c“,因为它有到"e”的替代路径,并从那里继续搜索,直到它到达"d“。显然,它不会打印整个解决方案"bced",因为Prolog不会返回到最开始,而是只打印到"c",所以只打印"c“之后的节点。

此外,您可以始终使用trace/0谓词,它允许您详细查看Prolog如何执行代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47626322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档