Пролог Родословная

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

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

/*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 ответов

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

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

female(jane).

father(john, bob).

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

father(john, sue).

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

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

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

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

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

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

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

Напр.:
brother(X,Y):- X/=Y, male(X), father(Father,X), father(Father,Y).

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

Напр.:
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))).

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

Предикаты вашей тети / 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).

Первый:

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

и для брата:

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

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

brother(X, Y) :-
  sibling(X, Y),
  male(X),
  different(X,Y).
Другие вопросы по тегам