我必须在序言中模拟家谱。
我有对称谓词的问题。Facts:
parent(x,y).
male(x).
female(y).
age(x, number).
Rules:
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
那么..有没有办法解决这个问题。
我需要查询:所有不在 Blood_relation 中的对..
Update:
第一个语句应该满足什么类型的关系?
血液关系(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
是一个新规则。我需要查询。这个实在是让我很头疼。也许是因为关系写得像垃圾。
没有更多的事实了。就这样。所有规则,所有事实。
query.. not(blood_relation(X,Y))
不起作用,我真的不知道为什么。
例如查询:
age(X,Y), Y>18,
not(parent(X,Z)),write(X),nl,fail.
工作得很好