逻辑独占或Prolog

时间:2019-11-18 20:07:17

标签: prolog

我对Prolog还是很陌生,并试图用它解决一个逻辑难题。 我在找出如何进行逻辑异或时遇到麻烦。 这是一个非常简单的问题,可以解释这种情况。

假设某物只能为红色,绿色或白色中的一种。一个人怎么写呢?  我尝试了下面的代码,但它仍然说color(red)是正确的。

color(X) :- X = red; X = green; X = blue.
color(red) :- false.
color(green) :- false.
color(seafoam).

我希望我最终可以使用color(Y)并将其等同于blue。

1 个答案:

答案 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(尽管它可能会生成其他内容,但在此示例中不会)。