以下是我给出的条款
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
。但是我真的不明白为什么。
有人可以解释一下吗?
答案 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
。
不确定我同意这种推理。