例如,如果有哪些人喜欢哪种颜色,每个人都喜欢绿色,但不是每个人都喜欢粉红色:likes(X, green)
对所有X都是正确的,Prolog可以某种方式给出likes(X, green)
为真的结果对于所有X-es?
让我们说,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).
答案 0 :(得分:2)
如果您想检查每个人是否喜欢绿色,那么您只需要定义 everyone 的含义。让我们假设它意味着所有的男性和女性"。然后你可以这样做:
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).
...
或者,您可以将其定义为谓词,从其他事实中推导出颜色选择。
答案 1 :(得分:0)
是的,您可以根据可用的事实制定新规则,但我怀疑它非常依赖于特定的Prolog实施。如果您正在使用SWI-Prolog,您可以查看文档中的第4.13章("数据库"),并了解如何使用构造谓词:assert / 1,clause / 2,clause / 3和其他。查看copy_predicate_clauses / 2的说明可能会有所帮助。