我正在对 Prolog 进行破解(使用 SWI-Prolog),一切都按我的意愿进行,即逻辑计算正确,它找到了正确的解决方案,但整个回溯的事情让我很困惑。
这是代码:
tall(X) :- skinny(X) ; eatless(X).
eatless(X) :- playsmore(X).
playsmore(X) :- hasxbox(X) ; hasplaystation(X).
skinny(a).
vegetarian(a).
hasxbox(b).
eatsburger(c).
hasplaystation(d).
list_all_tall :- forall(tall(Tall), writeln(Tall)).
很基础的东西。这是我的查询结果:
?- tall(a).
true ; % Note 1
false.
?- tall(b).
true ; % Note 2
false.
?- tall(c).
false.
?- tall(d).
true.
正如您从注释 1 和 2 中看到的那样,它等待我点击;
继续,然后将第一个解决方案视为 null 并最终输出 false。
我可以使用削减来更好地控制这种行为,但我也希望以下命令能够正常工作:
?- tall(X).
X = a ;
X = b ;
X = d.
和:
?- list_all_tall.
a
b
d
true.
这两个命令完全按照我想要的方式给出了解决方案。它只是注释 1 和注释 2 的那些让我陷入困境。tall(X).
有没有一种方法可以让and的功能保持现在的list_all_tall.
状态,同时根据我的喜好修复tall(a).
and的功能tall(b).
,即true.
在我询问tall(a).
或之后程序应该以 a 退出tall(b).
如果不是直接给出答案,而是有人可以实际解释我如何自己修复它,我将不胜感激,因为也许我在 Prolog 中的思维方式是完全不同的。
PS:没有针对高、瘦、胖、吃汉堡、玩电子游戏、素食者的冒犯。