プロローグで家系図をシミュレートする必要があります。そして、対称述語の問題があります。 事実:
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
だから..これを修正する方法はありますか。そして、クエリが必要です: Blood_relation にないすべてのペア..
アップデート:
最初のステートメントは、どのような関係を満たす必要がありますか? 血の関係(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.
うまく動作します