2009-03-24 3 views
8

Я сделал это, но его не показывает ответы Когда я спрашиваю о братья, сестры, дяди, тетиПролог Генеалогическое дерево

Это то, что я написал, что не так?

/*uncle(X, Y) :– male(X), sibling(X, Z), parent(Z, Y).*/ 
/*uncle(X, Y) :– male(X), spouse(X, W), sibling(W, Z), parent(Z, Y).*/ 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 

sibling(X, Y) :- 
     parent(Z, X), 
     parent(Z, Y), 
     X \= Y. 

sister(X, Y) :- 
     sibling(X, Y), 
     female(X). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X). 

parent(Z,Y) :- father(Z,Y). 
parent(Z,Y) :- mother(Z,Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

И еще одно, как я могу улучшить правило брата, чтобы X не был братом для себя.

ответ

5

Похоже, что некоторые из ваших аксиом ошибочны или отсутствуют, если вы пытаетесь воспроизвести диаграмму.

отсутствует:

female(jane). 

father(john, bob). 

неправильно:

father(john, sue). 

Это может привести правило родственный к конфликту. Но что я знаю о прологе

+0

+1, я не проверял эти –

3

Ваше правило брата уже проверяет, что brother(bob, bob) потерпит неудачу, потому что он вызывает sibling(X, Y), что делает проверку, чтобы убедиться, что X \= Y уже.

Кроме того, это выглядит так, как будто все работает на моей машине, но я должен был изменить черточки на этих линиях:

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

к:

aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

Да, они выглядят одинаково, но тире в верхней версии немного длиннее ... и, похоже, вызывают проблемы, когда я «консультировался» с файлом.

Я только поймал это, потому что я создал цветовую схему Prolog для Notepad ++, если кто-то заинтересован, я могу опубликовать его онлайн.

+0

более длинный тир, вероятно, эм или ан черточек, созданных некоторому смарт-текстового процессор –

+0

Да, я предполагаю, что это была копия и вставили откуда-то, кроме того, где было написано остальное :) –

1

, чтобы оптимизировать правило брата для Х, не является братом для себя.

Вы должны сделать:

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not X=Y. 
1

У вас есть сильная база данных фактов и очень важный предикат, называемый parent(X,Y). Подумайте логически о подходе.

  • Кто есть брат/сестра:
    а) мужчина/женщина, таким образом male(X) или female(X) должна быть внутри предикат
    б) X и Y имеет то же самое, но будьте осторожны, чтобы использовать либо mother или father, потому что в противном случае результат будет показан дважды.
    PS: обязательно X/=Y. =)

Ex .:
brother(X,Y):- X/=Y, male(X), father(Father,X), father(Father,Y).

  • Кто дядя/тетя (немного сложнее, но не много):
    а) Является ли мужчина/женщина.
    б) Тетка/дядя - сестра/брат мамы или папы сестры.

Ex .:
aunt(X,Y):- female(X), parent(Parent,Y),sister(X,Parent).

PS: Тетя также может рассматриваться жена брата мамы или папы (жена дяди) братьев и сестер. Но в этом случае вам нужно ввести новый факт, который выражает married_couple.

aunt(X,Y):- female(X),
parent(Parent,Y),
(sister(X,Parent); (brother(Parent,Uncle),married_couple(Uncle,X))).

Надеется, что это работает;)

1

тетей/2 предикаты не помещаются вместе, поэтому Пролог предполагает прародитель/2 тетка/2. Разместите их вместе, как показано ниже, или используйте

:- discontiguous(aunt/2). 

Вы используете супруга/2, но не определяете его. Кроме того, Prolog предполагает, что где-то должен быть предикат sibling/2 и использует father/2. Он делает это, потому что вы определяете список братьев и сестер в нижней части вашего КБ. Снова, поместите их вместе, как показано ниже.

Как указано в других ответах, вы можете использовать не (X = Y).

parent(Z,Y) :- father(Z,Y) ; mother(Z,Y). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

sibling(X,Y) :- 
    parent(A,X), 
    parent(A,Y), 
    not(X = Y). 


sister(X, Y) :- 
     sibling(X, Y), 
     female(X), 
     not(X = Y). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not(X = Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 
aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
% aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 


male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 
female(jane). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 
0

первый:

положить факты в начиная вашего кода!

и брат:

equal(X,Y) :- 
    X=Y. 

different(X,Y):- 
    not(equal(X,Y)). 

brother(X, Y) :- 
    sibling(X, Y), 
    male(X), 
    different(X,Y). 
Смежные вопросы