【问题标题】:Prolog problem modeling: objects with different colorsProlog问题建模:不同颜色的对象
【发布时间】:2020-01-17 05:58:06
【问题描述】:

我是编写 Prolog 的新手,想知道如何以对以后推理有用的方式陈述以下属性。

  • 有 N 个对象。
  • 每个对象都有颜色。
  • 有三种可能的颜色:红色、绿色、蓝色

假设有两个对象:对象 1 是红色的,对象 2 具有不同的、未指定的颜色。我如何向 Prolog 询问对象 2 的可能颜色?我希望是绿色和蓝色。

到目前为止我的代码:

object(obj_1).
object(obj_2).

color_value(red).
color_value(green).
color_value(blue).

color(Obj, Val) :- object(Obj), color_value(Val).
color(obj_1, red).

different_color(O1, O2) :- color(O1, X), color(O2, Y), X \= Y.
different_color(obj_1, obj_2).

当我查询obj_2 的可能颜色时,Prolog 包含red。所以我做错了。

color(obj_2, A).
A = red ;
A = green ;
A = blue.

我怀疑我使用 color 和 different_color 的方式有问题。

【问题讨论】:

  • Stylewise,color(Obj, Val) :- object(Obj), color_value(Val). 是一种打字。在这种情况下你真的不需要它。更糟糕的是,它会干扰建立关于“对象-颜色”关系的事实。因为当你问“obj_1 是否有颜色green”时,Prolog 会找到color(Obj, Val) :- object(Obj), color_value(Val). 并说是,因为obj_1 是一个对象,而green 是一种颜色。而你真的想说“obj_1 的颜色是 red 而没有其他颜色”:color(obj_1, red).

标签: prolog


【解决方案1】:

您对color/1 的定义为color(_, red)color(obj_1, _) 提供了冗余解决方案。 color(Obj, Val) 的子句需要排除 Objobj_1Valred 的情况。

一种简单的方法可能是:

color(Obj, Val) :-
    dif(Obj, obj_1),
    dif(Val, red),
    object(Obj),
    color_value(Val).
color(obj_1, red).

另外,请考虑@DavidTonhofer 关于风格的评论。 :)

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多