Пролог Семейные отношения, неожиданный сбой
Кто-нибудь может сказать мне, почему мои отношения с тетей не работают? Он просто возвращает ложь всякий раз, когда я пытаюсь это назвать.
Дядя отношения, которые я написал под ним, кажется, работает отлично. Я не могу понять, в чем разница. Я пытался (не (мама (X,Y)). В конце тоже, но это ничего не меняет.
/* FACTS */
parents(david, george, noreen).
parents(jennifer, george, noreen).
parents(georgejr, george, noreen).
parents(scott, george, noreen).
parents(joanne, george, noreen).
parents(jessica, david, edel).
parents(clara, david, edel).
parents(michael, david, edel).
parents(laura, georgejr, susan).
parents(anna, scott, siobhan).
/* Relationships */
father(X, Y) :- parents(Y, X, _).
male(X) :- father(X, _).
mother(X, Y) :- parents(Y, _, X).
female(X) :- mother(X, _).
grandfather(X, Y) :- father(X, Z), father(Z, Y).
grandfather(X, Y) :- father(X, Z), mother(Z, Y).
grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
grandmother(X, Y) :- mother(X, Z), father(Z, Y).
brother(X, Y) :- male(X), father(Z, X), father(Z, Y).
sister(X, Y) :- female(X), father(Z, X), father(Z, Y).
aunt(X,Y) :- sister(X,Z), parents(Y, Z, _).
aunt(X,Y) :- sister(X,Z), parents(Y, _, Z).
uncle(X, Y) :- brother(X, Z), parents(Y, Z, _), not(father(X,Y)).
uncle(X, Y) :- brother(X, Z), parents(Y, _, Z), not(father(X,Y)).
3 ответа
Вы вводите много избыточности и, по крайней мере, странные механизмы проверки.
father
а также mother
отношения подразумевают, что вы указываете parents/3
отношения как parents(child,father,morther)
, Я не понимаю, почему вы определяете два запроса.
Что пойдет не так, так это то, что отношения брата и сестры будут успешными brother(X,X)
, Можно избежать этого с X \= X
, это в основном то, что вы решите в предложении тетя.
Кроме того, вам нужно будет предоставить дополнительную информацию. male
а также female
отношения разрешаются только тогда, когда человек (X
) имеет детей. Однако, если у вас нет детей, вы можете быть тетей или дядей.
Это должно работать:
/* FACTS */
parents(david, george, noreen).
parents(jennifer, george, noreen).
parents(georgejr, george, noreen).
parents(scott, george, noreen).
parents(joanne, george, noreen).
parents(jessica, david, edel).
parents(clara, david, edel).
parents(michael, david, edel).
parents(laura, georgejr, susan).
parents(anna, scott, siobhan).
/* Relationships */
parent(X,Y) :- parents(Y,X,_).
parent(X,Y) :- parents(Y,_,X).
father(X, Y) :- parents(Y, X, _).
male(michael).
male(X) :- father(X, _).
mother(X, Y) :- parents(Y, _, X).
female(joanne).
female(jessica).
female(jennifer).
female(clara).
female(laura).
female(anna).
female(X) :- mother(X, _).
grandfather(X, Y) :- father(X, Z), father(Z, Y).
grandfather(X, Y) :- father(X, Z), mother(Z, Y).
grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
grandmother(X, Y) :- mother(X, Z), father(Z, Y).
brother(X, Y) :- male(X), father(Z, X), father(Z, Y), X \= Y.
sister(X, Y) :- female(X), father(Z, X), father(Z, Y), X \= Y.
aunt(X,Y) :- sister(X,Z), parent(Z,Y).
uncle(X, Y) :- brother(X, Z), parent(Z,Y).
Вы спрашиваете, почему aunt(A,P)
не имеет никакого решения. Другими словами
Там нет теток.
Вот систематический способ локализовать проблему с помощью программной нарезки. Поскольку программа актуальна для aunt/2
это чисто монотонная программа, мы можем локализовать проблему очень систематическим образом.
Ваша проблема заключается в следующем: у вас есть цель aunt(A,P)
это слишком специализировано. Теперь попробуем обобщить это. Но только до тех пор, пока цель все еще не достигнута. Таким образом, мы получим максимальное обобщение, которое все еще не выполнено. Поэтому проблема должна быть где-то в оставшейся части.
Для начала позвольте мне ввести следующее определение в вашу программу:
:- op(950,fx, *).
*_.
Это позволяет "закомментировать" цель с префиксом *
, Таким образом, мы обобщим вашу программу. Давайте попробуем это с определением тети. То есть вставить *
перед целью перезагрузите пример и посмотрите, не сработает ли он до сих пор. Ниже приводится его максимальное обобщение:
тетя (X,Y):- сестра (X, Z), *родители (Y, Z, _). тетя (X,Y):- сестра (X, Z), *родители (Y, _, Z).
Даже это обобщение не удается! Итак, другими словами, также sister/2
всегда терпит неудачу.
Там нет сестер.
сестра (X,Y):- женщина (X), отец (Z, X), *отец (Z, Y).
И даже выше не получается!
Нет женщин с отцом.
Вы можете придерживаться этого или продолжить, заменив цели их определениями.
сестра (X,Y):- мать (X,_), родители (X, Z, _), *отец (Z, Y).
еще один:
сестра (X,Y):- родители (_,_,X), родители (X, Z, _), *отец (Z, Y).
Таким образом, только матери могут быть сестрами, что, безусловно, является слишком большим ограничением.
Короткий ответ: uncle
работает (вроде) и aunt
не потому, что ваше определение male
а также female
Недостаток: он не распознает людей мужчиной или женщиной, если у них нет детей. В вашем наборе фактов нет женщины (судя по имени), которая имела бы детей и имела бы родного брата, у которого есть дети. По той же причине, что scott
не должен появляться в списке дядей.
Исправить это просто: вы можете
- отбросить правила, которые определяют пол и вместо этого указать пол, или
- заменить
parents
факты сson
/daughter
факты +parents
править и вывести пол из того, что кто-то является чьей-то дочерью.