По сути, вы можете удалить предикаты матери и отца, которые не являются фактами.Это бесконечные петли.Так как 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.