我该如何表达并解决这个琐碎的逻辑难题?

问题描述 投票:0回答:1

我试图表达一个更复杂的逻辑难题,并总结出我在这个微不足道的问题上失败的地方:

  • a
    Car
    可以是
    red
    green
    blue
  • bmw
    不是
    red
    也不是
    blue
  • 解决方案
    bmw
    green

但是我如何在 Prolog 中表达这一点呢?我认为有一个几乎逐字的表述,这也是我的目标。只是陈述事实和规则然后询问。我尝试了几种不同的选择。这将是一次尝试:

is_(Car,Color) :- 
Color = red; 
Color = green; 
Color = blue.

is_(bmw,red) :- false. 
is_(bmw,blue) :- false.

但是查询

is_(bmw, C)
将产生所有三种颜色,而不是仅
green
:

?- is_(bmw,C).
C = red ;
C = green ;
C = blue ;
false.

我有点明白为什么这不起作用。但也有点不是。

上述伪解本身等价于:

f(X,a).
f(X,b).
f(X,c).
f(r,a) :- false.
f(r,b) :- false.

然后:

?- f(r,X).
X = a ;
X = b ;
X = c ;
false.

我的意思当然是……事实是析取相关的(OR),因此 f(r,a) 可以为真。此外,上面的代码没有与汽车颜色无关的上下文,这使得“知识库”本身显然是无稽之谈。但这只是让我回到 - 如何正确表达它?

有人可以告诉我这必须如何完成吗?也许从上面的伪解决方案推断我的想法出了问题?

prolog
1个回答
0
投票

与关系数据库一样:

car_manu(bmw).

car_color_general(red).
car_color_general(green).
car_color_general(blue).

car_manu_not_color(bmw, red).
car_manu_not_color(bmw, blue).

car_manu_color(Manu, Color) :-
    car_manu(Manu),
    car_color_general(Color),
    % Ensuring that Manu and Color are instantiated, before using \+
    \+ car_manu_not_color(Manu, Color).

swi-prolog 的结果:

?- car_manu_color(Manu, Color).
Manu = bmw,
Color = green ;
false.
© www.soinside.com 2019 - 2024. All rights reserved.