例如,如果有关于谁喜欢哪种颜色的信息,并且每个人都喜欢绿色,但不是每个人都喜欢粉色:likes(X, green)
对所有 X 都为真,Prolog 能否以某种方式得出 likes(X, green)
对所有 X 都为真的结果?
假设还有关于人们性别的信息,形式为 female(deby). male(robert).
,如果根据数据集,所有女性但不是所有男性喜欢粉色,Prolog 能否返回类似这样的结果:likes(X, pink) :-female(X)
编辑:当我在最后一段说“我想问”时,我的意思是我的 Prolog 查询应该有这个含义。
为了清楚起见,我不想指定 Prolog 应该检查什么。用英语来说,我不想问是否每个人都喜欢绿色,而是我想问:你能基于可用的事实制定新规则吗?
事实:
male(albert).male(brett).female(chloe).female(deby).likes(albert, green).likes(brett, green).likes(chloe, green).likes(deby, green).likes(albert, pink).likes(chloe, pink).likes(deby, pink).
回答:
如果你想检查是否每个人都喜欢绿色,那么你只需要定义每个人的含义。假设它意味着“所有男性和女性”。那么你可以这样做:
everyone_likes(Color) :- everyone(Everyone), all_likes(Everyone, Color).everyone(Everyone) :- findall(E, (male(E) ; female(E)), Everyone).all_likes([Person|People], Color) :- likes(Person, Color), all_likes(People, Color).all_likes([], _).
选项 2
上述方法的替代方案是考虑否定的逻辑。如果每个人都喜欢绿色,那就是有人不喜欢绿色的对立面。在 Prolog 中表达这一点:
everyone_likes(Color) :- is_color(Color), \+ ( (male(P) ; female(P)), \+ likes(P, Color) ).
在这个版本中,我们不需要定义谁是everyone
,而是需要一个is_color
事实和/或谓词来定义有效的颜色(如果我们想让everyone_likes(X)
查询工作)。这可以简单地定义为:
is_color(pink).is_color(green).is_color(orange)....
或者,你可以将其定义为一个从其他事实中推导出颜色选择的谓词。