Prolog能基于可用的事实制定规则吗?

例如,如果有关于谁喜欢哪种颜色的信息,并且每个人都喜欢绿色,但不是每个人都喜欢粉色: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)....

或者,你可以将其定义为一个从其他事实中推导出颜色选择的谓词。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注