Пролог Родословная
Я сделал это, но это не показывает ответы Когда я спрашиваю о братьях, сестрах, дядях, тетях
Это то, что я написал, что не так?
/*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).