Prolog 在序言中如何表达事实的互斥性?

Prolog 在序言中如何表达事实的互斥性?,prolog,Prolog,假设您正在使用系谱数据库。一些记录丢失了。你可能知道名为“约翰”的人是男性,名为“玛丽”的人是女性,等等 male(X) :- first_name(X, "John"). female(X) :- first_name(X, "Mary"). 对于有异国情调或外国名字的人来说,他们的性别可能不清楚,但一定是其中之一。婚姻(本世纪以前)是在异性之间进行的 female(X) :- wed(X, Y), male (Y). male (X) :-

假设您正在使用系谱数据库。一些记录丢失了。你可能知道名为“约翰”的人是男性,名为“玛丽”的人是女性,等等

male(X)   :- first_name(X, "John").
female(X) :- first_name(X, "Mary").
对于有异国情调或外国名字的人来说,他们的性别可能不清楚,但一定是其中之一。婚姻(本世纪以前)是在异性之间进行的

female(X) :- wed(X, Y), male  (Y).
male  (X) :- wed(X, Y), female(Y).
知道某人的性别是男性还是女性(即使你不知道是哪个)是解读身份和关系的一个重要小道消息

您将如何在Prolog中对这些知识进行编码



这是不正确的,因为它使你得出结论,除非能证明每个人都是男性,否则他们都是女性。

你对很多事情都做了大量假设。由于这个原因,这个问题比它需要的更复杂

在你的例子中,你说,“不知道是男性”对于“是女性”是不够的。但你也会说,“不知道是男性,而且嫁给了男性”就足够了

在一些假设的程序中(我们在你的问题中没有,所以它不是真正可复制的),你可能会写:

is_female(X) :- female(X).
is_female(X) :- \+ is_male(X), married_to(X, Y), is_male(Y).
在你的问题中,有一些东西来自于填空。是否需要
女性/1
是否需要女性/1
?视情况而定。等

不正确,因为这让你得出结论,每个人都是女性,除非他们能被证明是男性

这种稍加精炼的推理是正确的。每个人都有可能是女性,除非他们被证明是男性。他们还会是什么

possibly_female(Person) :-
    person(Person),
    \+ proven_male(Person).
possibly_female(Person) :-
    proven_female(Person).

possibly_male(Person) :-
    person(Person),
    \+ proven_female(Person).
possibly_male(Person) :-
    proven_male(Person).
尽管如此,根据你想做什么,使用三向男性/女性/未知划分可能比使用已知/可能的性别划分更简单:

unknown_gender(Person) :-
    person(Person),
    \+ proven_female(Person),
    \+ proven_male(Person).

(关于性别二元性的许多警告适用于现实世界,但如果你真的基于二元性假设建模历史数据库,那么使用该模型是合理的。)

我太缺乏咖啡了,无法深入思考这一点,但你需要放弃编程逻辑和Prolog的偶尔建模,转而使用meta,使用Prolog作为编程语言,并实现另一种逻辑,用于不同的建模。这应该引起人们的兴趣:(Gerd Wagner,1991年)。它是这本薄而有力的书的一部分,书的后面有一页的元解释器。@DavidTonhofer是的,每次你觉得应该写一个问题的时候都读一本书,这确实是一个好主意。“啊,勇敢的新世界,有这样的人在那里。”。每次我想写答案的时候,我也应该做10个俯卧撑(也许5个做评论);我会被骗的。任何以“假设那个”和代码片段开头的问题都比一个包含最小但完整且可复制的代码示例的问题严重。@TA_实习生阅读abook总比沉溺于无知要好。MaxB似乎主要针对理论方面,因此这一建议并非不合时宜。没必要为此生气。事实上,你会如何回答这个归结为“我想要强烈的否定”的问题。@DavidTonhofer你似乎误解了我评论的基调。我完全同意读一本书比问一本书好。这也是我的评论,即使在仔细阅读之后。俯卧撑也是如此,做运动肯定比花时间在网上和陌生人聊天要好。俯卧撑总比没有俯卧撑好,而一个评论经常被误解,我甚至会说没有评论总是比任何评论好。问题的问题是,它将几个事情(排他性、性别、系谱)混为一谈,最后根本不清楚这个问题是关于什么的。尽管如此,“TA_intern”在字典中,“排他性”的一个意思是“排除或有权排除”,所以这里它指的是男性(X)和女性(X)。我希望这能澄清误解。”但你也会说,“不知道自己是男性,而且嫁给了男性”就够了。”——你从哪里得到的?第一个前提似乎是不必要的,同样的,
\+is\u male(X)
@MaxB我不知道你当时想要实现什么。我想我不应该回答太复杂而我无法理解的问题。
unknown_gender(Person) :-
    person(Person),
    \+ proven_female(Person),
    \+ proven_male(Person).