Prolog问题建模:具有不同颜色的对象

Prolog问题建模:具有不同颜色的对象,prolog,Prolog,我对编写Prolog还不熟悉,我想知道如何以一种对以后的推理有用的方式声明以下属性 有N个对象 每个物体都有一种颜色 有三种可能的颜色:红、绿、蓝 假设有两个对象:对象1为红色,对象2为不同的未指定颜色。如何向Prolog询问对象2的可能颜色?我希望是绿色和蓝色 到目前为止,我的代码是: object(obj_1). object(obj_2). color_value(red). color_value(green). color_value(blue). color(Obj, Val

我对编写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包括
红色
。所以我在做错事

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

我怀疑我使用颜色和不同颜色的方式有问题。

您对
color/1
的定义为
color(\uu,red)
color(obj\u 1,\u)
提供了冗余的解决方案。您的
color(Obj,Val)
子句需要排除
Obj
Obj_1
Val
红色的情况

一种过于简单的方法可能是:

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

也请考虑“DavidTonhofer关于风格的评论”: 您对
color/1
的定义为
color(\uu,红色)
color(obj\u 1,\uu)
提供了冗余的解决方案。您的
color(Obj,Val)
子句需要排除
Obj
Obj_1
Val
红色的情况

一种过于简单的方法可能是:

color(Obj, Val) :-
    dif(Obj, obj_1),
    dif(Val, red),
    object(Obj),
    color_value(Val).
color(obj_1, red).
也请考虑“DavidTonhofer关于风格的评论”: 就样式而言,
color(Obj,Val):-object(Obj),color\u-value(Val)。
是一种类型。在这种情况下,你真的不需要它。更糟糕的是,它干扰了建立关于“对象-颜色”关系的事实。因为当你问“obj_1是否有颜色<代码>绿色<代码>”时,Prolog会找到
颜色(obj,Val):-object(obj),color_值(Val)。
并说是,因为
obj_1
是一个对象,
绿色
是一种颜色。而你真的想说“obj_1的颜色是红色的,没有其他颜色:
color(obj_1,red)。
Stylewise,
color(obj,Val):-object(obj),color_value(Val)。
是一种类型。在这种情况下,你真的不需要它。更糟糕的是,它干扰了建立关于“对象-颜色”关系的事实。因为当你问“obj_1是否有颜色<代码>绿色<代码>”时,Prolog会找到
颜色(obj,Val):-object(obj),color_值(Val)。
并说是,因为
obj_1
是一个对象,
绿色
是一种颜色。而你真的想说“obj_1的颜色是红色,没有其他颜色”:
color(obj_1,红色)。