Prolog查询练习

时间:2014-07-25 01:48:38

标签: prolog

以下是我给出的条款

beats(rock, scissors).
beats(scissors, paper).
beats(paper, rock).

better(battleaxe, scissors).
better(lightsabre, battleaxe).
better(boulder, rock).
better(adamantium, boulder).
better(palisade, paper).
better(nanomesh, palisade).

uses(wolverine, adamantium).
uses(vader, lightsabre).
uses(conan, battleaxe).
uses(richard, rock).

win(X,Y) :- beats(X,Y).
win(X,Y) :- better(X,Y).
win(X,Y) :- better(X,'underscore here'), beats('underscore here',Y). 
win(X,Y) :- better(X,A), better(Y,B), win(A,B).
win(X,Y) :- uses(X,A), uses(Y,B), !, win(A,B).

play(X,Y,X) :- win(X,Y).
play(X,Y,Y) :- win(Y,X).

问题是询问我会从

得到什么结果
?- win(X, nanomesh).

答案应该是X = lightsabre。但是我真的不明白为什么。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

有几种方法可以尝试理解这个特定的查询。一种方法是将 false 目标添加到您的程序中,这样您仍然可以获得相同的答案。通过添加 false ,该程序是专门的。如果它仍然得到相同的答案,我们知道负责的部分在可见区域。 删除部分表示您现在可以完全忽略的条款。

beats(rock, scissors) :- false.
beats(scissors, paper).
beats(paper, rock) :- false.

better(battleaxe, scissors).
better(lightsabre, battleaxe).
better(boulder, rock) :- false.
better(adamantium, boulder) :- false.
better(palisade, paper).
better(nanomesh, palisade).

win(X,Y) :- beats(X,Y).
win(X,Y) :- false, better(X,Y).
win(X,Y) :- false, better(X,'underscore here'), beats('underscore here',Y).
win(X,Y) :- better(X,A), better(Y,B), win(A,B).

?- win(lightsabre, nanomesh).

所以你有两个链:

nanomesh   -> palisade  -> paper` 
lightsabre -> battleaxe -> scissors

最后scissors击败了paper

不确定我同意这种推理。