我必须在 prolog 中模拟家谱。我有对称谓词的问题。 事实:
parent(x,y).
male(x).
female(y).
age(x, number).
规则:
blood_relation
让我头疼。这就是我所做的:
blood_relation(X,Y) :- ancestor(X,Y).
blood_relation(X,Y) :- uncle(X,Y)
; brother(X,Y)
; sister(X,Y)
; (mother(Z,Y),sister(X,Z))
; (father(Z,Y),sister(X,Z))
; (father(Z,Y),brother(X,Z)).
blood_relation(X,Y) :- uncle(X,Z)
, blood_relation(Z,Y).
我得到了我认为令人满意的结果(我有双重打印 - 我可以解决这个问题),问题是我希望这种关系是对称的。现在不是。
blood_relation(johns_father, john):yes
blood_relation(john,johns_father): no
所以..有没有办法解决这个问题。我需要查询:所有不在血缘关系中的对..
更新:
第一个陈述应该满足什么样的关系?血液关系(X,Y):-血液关系(X,Y)。
对不起..这是一个糟糕的复制/粘贴..它
blood_relation(X,Y):-ancestor(X,Y).
现在固定在上面。
以下是其他规则:
father(X,Y) :-
parent(X,Y),male(X).
mother(X,Y) :-
parent(X,Y),female(X).
brother(X,Y) :-
parent(Z,X),parent(Z,Y),
male(X).
sister(X,Y) :-
parent(Z,X),parent(Z,Y),
female(X).
grandFather(X,Y) :-
parent(Z,Y),parent(X,Z),
male(X).
grandMother(X,Y) :-
parent(Z,Y),
parent(X,Z),female(X).
uncle(X,Y) :-
mother(Z,Y),brother(X,Z).
ancestor(X,Y) :-
ancestor(X,Y).
ancestor(X,Y) :-
parent(X,Z),ancestor(Z,Y).
母亲的兄弟在叔叔的定义中。这有点奇怪。我有需要实施的规则,除此之外我不知道如何实施规则。我只是困惑。
知道如何制作blood_relation
对称吗?并且not_blood_relation
是新规则。我需要查询。这个真的让我很头疼。也许是因为关系写得像废话。
而且没有更多的事实。就这样。所有规则,所有事实。
查询..not(blood_relation(X,Y))
不起作用,我真的不知道为什么。例如查询:
age(X,Y), Y>18,
not(parent(X,Z)),write(X),nl,fail.
工作得很好