Prolog查询练习

Prolog查询练习,prolog,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(wo

这是我的既定条款

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
。然而我真的不明白为什么


有人能解释一下吗?

有几种方法可以帮助您理解这个特定的查询。一种方法是将目标
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