【问题标题】:Logical exclusive or in PrologProlog 中的逻辑异或
【发布时间】:2019-11-18 20:07:17
【问题描述】:

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

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

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

我希望我最终可以运行 color(Y) 并将其等同于蓝色。

【问题讨论】:

    标签: prolog


    【解决方案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(尽管它可能会生成其他东西,但在本例中不会)。

    【讨论】:

      猜你喜欢
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多