Предикат брата в законе Пролог не работает - PullRequest
0 голосов
/ 12 сентября 2018

Вот соответствующий код:

married(X,Y) :- wife(X,Y);husband(X,Y).

parent(X,Y) :- father(X,Y) ;mother(X,Y).

brother(X,Y) :-
man(X),
parent(Z,X),
parent(Z,Y),
X \= Y.

brother_in_law(X,Y) :-
brother(X,Z),married(Z,Y).

Я гуглил и, похоже, другие использовали точный код для предиката зятя, так что все должно быть в порядке? Я проверил другие предикаты, и они тоже кажутся хорошими ... не уверен, что происходит.

Кроме того, не работая, я имею в виду, что при проверке не подтверждается соответствующее отношение.

1 Ответ

0 голосов
/ 12 сентября 2018

Посмотрите на след, и вы увидите проблему:

?- trace,  brother_in_law(prins-daniel, Y).
   Call: (9) brother_in_law(prins-daniel, _11346) ? creep
   Call: (10) brother(prins-daniel, _11680) ? creep
   Call: (11) man(prins-daniel) ? creep
   Exit: (11) man(prins-daniel) ? creep
   Call: (11) parent(_11678, prins-daniel) ? creep
   Call: (12) father(_11678, prins-daniel) ? creep
   Fail: (12) father(_11678, prins-daniel) ? creep
   Redo: (11) parent(_11678, prins-daniel) ? creep
   Call: (12) mother(_11678, prins-daniel) ? creep
   Fail: (12) mother(_11678, prins-daniel) ? creep
   Fail: (11) parent(_11678, prins-daniel) ? creep
   Redo: (11) man(prins-daniel) ? creep
   Fail: (11) man(prins-daniel) ? creep
   Fail: (10) brother(prins-daniel, _11680) ? creep
   Fail: (9) brother_in_law(prins-daniel, _11346) ? creep
false.

Кто отец prins-daniel?У тебя нет факта для этого.Кто такая мать?У вас нет фактов для этого тоже.В результате вы не можете найти братьев, поэтому запрос не выполняется.

Означает ли это, что вы упускаете факты или код?Кодекс гласит, что X и Y являются зятями, если у X есть брат Z, который женат на Y. Это единственный способ иметь зятя?

Примечание: prins-danielне является атомом в Прологе, как это было бы в Лиспе.Это термин:

?- write_canonical(prins-daniel).
-(prins,daniel)

Ситуация усугубляется более длинными терминами:

?- write_canonical(johann-georg-av-hohenzollern).
-(-(-(johann,georg),av),hohenzollern)

Просто что-то, о чем нужно знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...