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