您将如何在Prolog中表达对事实的相互排斥

  • 本文关键字:事实 Prolog prolog
  • 更新时间 :
  • 英文 :


假设您正在使用家谱数据库。一些记录丢失。你可能知道;约翰;是男性;玛丽";为女性等。

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)).

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

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

这种稍微精炼的推理是不正确的。每个都有潜在的女性,除非他们被证明是男性。它们还会是什么?

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).

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

您对许多事情都做了大量的假设。正因为如此,这个问题才变得更加复杂。

在你的情况下;不知道是男性";对于";是女性";,你说。但你也说;不知道是男性,并且嫁给了一个男性";足够了。

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

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

在你的问题中,有一些东西是从填空中得到的。是否需要female/1用于is_female/1?这取决于情况。Etc

最新更新