Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的逻辑异或_Prolog - Fatal编程技术网

Prolog中的逻辑异或

Prolog中的逻辑异或,prolog,Prolog,我对Prolog非常陌生,并试图用它解决一个逻辑难题。 我很难找到如何进行逻辑异或运算。 这里有一个非常简单的问题可以解释这种情况 假设某物只能是红色、绿色或白色中的一种。你会怎么写呢? 我尝试了下面的代码,但仍然显示color(red)是正确的 color(X) :- X = red; X = green; X = blue. color(red) :- false. color(green) :- false. color(seafoam). 我希望我能最终运行颜色(Y),并将其等同于蓝色

我对Prolog非常陌生,并试图用它解决一个逻辑难题。 我很难找到如何进行逻辑异或运算。 这里有一个非常简单的问题可以解释这种情况

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

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

我希望我能最终运行颜色(Y),并将其等同于蓝色

在大多数情况下,逻辑变量已经是独占的,因为它们只能绑定一次

您在这里定义了一个规则
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(thing,X)
给了我可能性
color(thing,blue)
失败,并且
color(X,blue)
永远不会生成
thing
(虽然它可能会生成其他内容,但在本例中它不会)