Семейное отношение Prolog, неожиданный сбой

102
10

Может ли кто-нибудь сказать мне, почему моя тетя не работает? Он просто возвращает false, когда я пытаюсь его вызвать.


Отношение дяди, которое я написал под ним, кажется, работает отлично. Я не могу понять, в чем разница. Я попробовал (не (мама (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)).

спросил(а) 2021-01-19T17:26:43+03:00 9 месяцев, 1 неделя назад
1
Решение
91

Вы спрашиваете, почему aunt(A,P) не имеет решения. Другими словами


Нет тети.



Вот систематический способ локализовать проблему с помощью нарезки программ. Поскольку программа, относящаяся к aunt/2, является чистой монотонной программой, мы можем локализовать проблему очень систематическим образом.


Ваша проблема заключается в следующем: у вас есть цель aunt(A,P), которая слишком специализирована. Теперь мы попытаемся обобщить его. Но только до тех пор, пока цель все же не удалась. Таким образом, мы получим максимальное обобщение, которое все еще терпит неудачу. Поэтому проблема должна быть где-то в оставшейся части.


Для начала позвольте мне ввести следующее определение в вашу программу:


:- op(950,fx, *).

*_.


Это позволяет "прокомментировать" цель с префиксом *. Таким образом, мы обобщим вашу программу. Давайте попробуем это с определением тети. То есть, вставьте * перед целью, перезагрузите пример и посмотрите, не портится ли он. Следующее его максимальное обобщение:


aunt(X,Y) :- sister(X,Z), * parents(Y, Z, _).
aunt(X,Y) :- sister(X,Z), * parents(Y, _, Z).

Даже это обобщение терпит неудачу! Другими словами, также sister/2 всегда терпит неудачу.

Нет сестер.



sister(X, Y) :- female(X), father(Z, X), * father(Z, Y).

И даже выше не удается!


Нет женщин с отцом.



Вы можете придерживаться этого или продолжать, заменяя цели своими определениями.


sister(X, Y) :- mother(X,_), parents(X, Z, _), * father(Z, Y).

еще одно:


sister(X, Y) :- parents(_,_,X), parents(X, Z, _), * father(Z, Y).

Таким образом, только матери могут быть сестрами, которые, безусловно, являются слишком большим ограничением.

ответил(а) 2021-01-19T17:26:43+03:00 9 месяцев, 1 неделя назад
91

Короткий ответ заключается в том, что работает uncle (тип), а aunt не потому, что ваше определение male и female является недостаточным: оно не признает людей мужчиной или женщиной, если у них есть дети. В вашем наборе фактов нет женщины (судя по имени), которая будет иметь детей и иметь родного брата, у которого есть дети. По той же причине, что scott не должен отображаться среди списка дядей.


Фиксирование это просто: вы можете либо


    отказаться от правил, определяющих пол и указать пол вместо этого, или
    замените факты parents правилом son/daughter фактов + parents и выведите пол из того факта, что кто-то является дочерью кого-то.

ответил(а) 2021-01-19T17:26:43+03:00 9 месяцев, 1 неделя назад
65

Вы вводите много избыточности и, по крайней мере, странные механизмы проверки.


Отношения 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).

ответил(а) 2021-01-19T17:26:43+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема