我对Prolog还是很陌生,并试图用它解决一个逻辑难题。 我在找出如何进行逻辑异或时遇到麻烦。 这是一个非常简单的问题,可以解释这种情况。
假设某物只能为红色,绿色或白色中的一种。一个人怎么写呢?
我尝试了下面的代码,但它仍然说color(red)
是正确的。
color(X) :- X = red; X = green; X = blue.
color(red) :- false.
color(green) :- false.
color(seafoam).
我希望我最终可以使用color(Y)并将其等同于blue。
答案 0 :(得分:1)
在大多数情况下,逻辑变量已经是排他的,因为它们只能绑定一次。
您在此处定义了包含四个正文的规则color/1
。当您使用未实例化的变量查询时,Prolog将尝试依次绑定每个变量:
?- color(X).
X = red ;
X = green ;
X = blue ;
X = seafoam.
现在,这里有一些令人讨厌的向后不正确之处,因为红色既是颜色,也不是颜色。
?- color(red).
true ;
false.
看起来像foo(...) :- false.
的谓词对我来说常常是可疑的,因为Prolog的部分魔力在于生成解决方案,而像我在玩引擎游戏一样,显性的失败往往也让我读懂。
这里的问题是您正在将集合“颜色”的定义与事物可能的颜色集合混合在一起。如果我想说的东西只能是红色,绿色或白色,我可能会说:
color(thing, red).
color(thing, green).
color(thing, white).
然后我仍然可以拥有color(blue)
,因为即使我的东西不能是蓝色,也存在蓝色。当我想产生事物的可能颜色时,color(thing, X)
给了我无限可能。 color(thing, blue)
失败,并且color(X, blue)
将永远不会生成thing
(尽管它可能会生成其他内容,但在此示例中不会)。