Prolog可以根据现有的事实制定规则吗?

时间:2014-04-23 11:46:01

标签: prolog logic artificial-intelligence

例如,如果有哪些人喜欢哪种颜色,每个人都喜欢绿色,但不是每个人都喜欢粉红色: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).

2 个答案:

答案 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的说明可能会有所帮助。