我制定了以下规则。
pokemonOfType(charmander, fire).
pokemonOfType(staryu, water).
typeWins(water, fire). % this should not affect the outcome,
% but who knows
pokemonWins(Winner, Loser) :-
pokemonOfType(Winner, TypeWinner),
pokemonOfType(Loser, TypeLoser),
typeWins(TypeWinner, TypeLoser).
如果我运行
?-pokemonWins(charmander, staryu).
我会得到 以下输出(假)。如果我运行 ?-not(pokemonWins(charmander, staryu)).
我也会得到错误!
发生什么事了?
在 Prolog 中,not 被实现为“否定即失败”。如果 X 失败,则 not(X) 成功;如果 X 成功,则 not(X) 失败。 not 并不意味着经典意义上的“逻辑非”。
由于这种混乱,它被认为已被弃用,并且根据 SWI 序言,不应在新代码中使用它。 https://www.swi-prolog.org/pldoc/man?predicate=not/1