Пролог Родословная - PullRequest
8 голосов
/ 25 марта 2009

Я сделал это, но ответы не отображаются Когда я спрашиваю о братьях, сестрах, дядях, тетях

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

/*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).

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

Ответы [ 6 ]

5 голосов
/ 25 марта 2009

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

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

female(jane).

father(john, bob).

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

father(john, sue).

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

3 голосов
/ 25 марта 2009

Ваше правило брата уже проверяет, что 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 ++, и если кому-то интересно, я могу опубликовать ее в Интернете.

1 голос
/ 10 мая 2016

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

:- discontiguous(aunt/2).

Вы используете spouse / 2, но не определяете его. Более того, Пролог предполагает, что где-то должен быть предикат sibling / 2, и использует папу / 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).
1 голос
/ 11 октября 2013

У вас есть мощная база данных фактов и очень важный предикат под названием 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),<br> parent(Parent,Y),<br> (sister(X,Parent); (brother(Parent,Uncle),married_couple(Uncle,X))).

Надеюсь, это работает;)

1 голос
/ 21 апреля 2009

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

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

brother(X, Y) :-
      sibling(X, Y),
      male(X),
      not X=Y.
0 голосов
/ 05 июня 2017

первый:

поместите ваши факты в начало вашего кода!

и для брата:

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

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

brother(X, Y) :-
  sibling(X, Y),
  male(X),
  different(X,Y).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...