Проблемы с запросами в Прологе - PullRequest
1 голос
/ 06 декабря 2011
% facts
mother(john, dana).
father(john, david).
mother(chelsea, dana).
father(chelsea, david).
mother(jared, dana).
father(jared, david).
% queries
father(X,Y) :- father(X,Y), write(Y). 
mother(X,Y) :- mother(X,Y), write(Y).
parent(X,Y) :- father(X,Y);mother(X,Y).
sibling(X,Y) :- parent(X,Z), parent(Y,Z), write(Y).

У меня проблемы с получением этих запросов.когда я набираю команду отца, он правильно скажет мне да или нет, но не будет выполнять команду записи (то же самое с матерью).«родитель» вообще не работает для меня (поэтому брат и сестра тоже не работают).Кроме того, если я наберу в сестру (X, Y).Мне нужно, чтобы все братья и сестры ... например, брат (Джон, Челси).Мне нужно вывести всех возможных братьев и сестер (также Джаред).Дайте мне знать, где я иду не так, я действительно не вижу проблемы с моей логикой здесь.Спасибо!

1 Ответ

1 голос
/ 06 декабря 2011

По сути, вы можете удалить предикаты матери и отца, которые не являются фактами.Это бесконечные петли.Так как parent использует их, а sibling использует parent, все ваши предикаты - это бесконечные циклы.

Чтобы увидеть, что происходит, вы можете сделать это:

?- trace, father(john, X).

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

Когда две проблемные проблемы устранены, яполучить правильное поведение:

?- father(john, X).
X = david.

?- parent(john, X).
X = david ;
X = dana.

?- sibling(john, X).
john
X = john ;
chelsea
X = chelsea ;
jared
X = jared ;
john
X = john ;
chelsea
X = chelsea ;
jared
X = jared.

Теперь, чтобы улучшить предикат вашего брата, вы можете сказать, что кто-то не является его родным братом, и что если у вас есть один общий родитель, этого достаточно (он удалит дубликаты): брат / сестра (X, Y): - отец (Y, Z), отец (X, Z), X = \ = Y.

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