prolog 中深度优先搜索输出的问题

Problem with depth first search output in prolog

提问人:John Sall 提问时间:11/9/2018 最后编辑:falseJohn Sall 更新时间:11/9/2018 访问量:131

问:

我有以下代码:

s(a, b).
s(b, c).
goal(c).

solve( N, [N] ) :-
    goal( N).

solve( N, [N1 | Sol] ) :-
    s( N, Nl),
    solve( Nl, Sol).

当我输入查询时:

solve(a, P).

它给了我:

P = [_,_,c] ? 

yes

但我想要完整的路径,例如

P = [a,b,c] ?
序言

评论

0赞 willeM_ Van Onsem 11/9/2018
你混淆了.NlN1

答:

1赞 willeM_ Van Onsem 11/9/2018 #1

在谓词中,使用两个看起来相似的变量(以图形方式):

solve( N, [N] ) :-
    goal( N).

solve( N, [N1 | Sol] ) :-
    s( N, Nl),
    solve( Nl, Sol).

这里(小写 L)看起来类似于(带 1)。事实上,Prolog 解释器识别出它只使用一次,并发出警告:NlN1N1

?- ['file.pl'].
Warning: /tmp/file.pl:8:
        Singleton variables: [N1] 
true.

该变量与主体中定义的变量无关,因此保持不统一。N1Nl

但话虽如此,如果你真的想在这里输出,你应该在“路径”构造中使用,而不是,因为否则 for 将以 , not 开头,并且会提到最后一个节点(这里)两次,所以:NN1solve(a, L)Lbac

solve( N, [N] ) :-
    goal( N).

solve(N, [N | Sol]) :-
    s(N, Nl),
    solve(Nl, Sol).

评论

0赞 John Sall 11/9/2018
谢谢,这很有帮助。你学习prolog的秘诀是什么?我们的教练没有教我们太多。
0赞 willeM_ Van Onsem 11/10/2018
@sosscs:我认为Learn Prolog Now!会很有帮助。