Мне нужно смоделировать генеалогическое древо в прологе.
И у меня есть проблема симметричных предикатов.
Факты:
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, joh):yes
blood_relation(john,johns_father): no
так что ... есть способ это исправить.
И мне нужен запрос: все пары, которые не находятся в blood_relation ..
Обновление:
Какими отношениями должно удовлетворять первое утверждение?
blood_relation (X, Y): - blood_relation (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.
работает просто отлично