【问题标题】:How would you express mutual exclusion of facts in Prolog?你会如何在 Prolog 中表达事实的互斥?
【发布时间】:2020-12-29 06:24:19
【问题描述】:

假设您正在使用家谱数据库。一些记录丢失。你可能知道叫“John”的人是男性,叫“Mary”的人是女性,等等。

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 中编码这些知识?


female(X) :- person(X), not(male(X)).

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

【问题讨论】:

  • 我太缺咖啡了,无法深入思考这个问题,但你需要放弃 Prolog 的逻辑编程和偶尔建模,转而使用 Prolog 作为编程语言和在顶部为不同的建模实现另一个逻辑。这应该很有趣:Logic programming with strong negation and inexact predicates(Gerd Wagner,1991)。它是薄而强大的书Vivid Logic 的一部分,它的背面有一个单页元解释器。
  • @DavidTonhofer 是的,每次感觉应该写一个关于 SO 的问题时读一本书确实是个好主意。 “哦,勇敢的新世界,没有这样的人”。每次我想在 SO 上写一个答案时,我也应该做 10 个俯卧撑(也许 5 个用于评论);我会被劫持。
  • 任何以“假设”和代码片段开头的问题都比具有最小但完整且可重现的代码示例的问题更糟糕。
  • @TA_intern 读书比沉迷于无知要好。 MaxB 似乎相当多地针对理论方面,所以这个建议并不过分。没必要为此大发雷霆。实际上,您将如何回答归结为“我想要强烈否定”的问题。
  • @DavidTonhofer 您似乎误读了我评论的语气。我完全同意阅读一本书比询问 SO 更好。这也是我的评论所说的,即使在仔细阅读之后也是如此。俯卧撑也是如此,绝对比花时间在互联网上与陌生人聊天更好。上推总是比不上推好,而评论经常被误解,以至于我什至会说没有评论总是比任何评论更好。

标签: prolog


【解决方案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).

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

【讨论】:

  • 问题的问题在于将几件事(排他性、性别、家谱)混为一谈,最后根本不清楚问题是什么。尽管如此,还是很好地尝试了答案。
  • @TA_intern 从字典上看,“排他”的意思之一是排除或有权排除”所以这里指male(X)female(X) 排除彼此。我希望这能消除误解。
【解决方案2】:

你对很多事情都做了很多假设。正因为如此,这个问题比它需要的要复杂得多。

你说,在你的情况下,“不知道是男性”对于“是女性”来说是不够的。但你也说,“不知道是男性并且嫁给了男性”就足够了。

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

is_female(X) :- female(X).
is_female(X) :- \+ is_male(X), married_to(X, Y), is_male(Y).

有些东西来自于填写你问题中的空白。 is_female/1 是否需要female/1 ?这取决于。等等

【讨论】:

  • “但你也说,“不知道是男性并且与男性结婚”就足够了。” -- 你从哪里得到的?第一个前提似乎没有必要,\+ is_male(X) 也是如此。
  • @MaxB 我不知道你想达到什么目标。我想我不应该回答太复杂以至于我无法理解的问题。
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2023-03-22
  • 1970-01-01
  • 2019-01-13
相关资源
最近更新 更多