我试图表达一个更复杂的逻辑难题,并总结出我在这个微不足道的问题上失败的地方:
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) 可以为真。此外,上面的代码没有与汽车颜色无关的上下文,这使得“知识库”本身显然是无稽之谈。但这只是让我回到 - 如何正确表达它?
有人可以告诉我这必须如何完成吗?也许从上面的伪解决方案推断我的想法出了问题?
与关系数据库一样:
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.