【发布时间】: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