С логической точки зрения, главная ошибка в этой программе заключается в неполноте .
Рассмотрим, например, самый общий запрос :
?- parents(X, Y, C).
X = c1,
Y = m1.
Итак, не сообщается о решении для c2
.
Но такое решение существует, что можно увидеть с помощью:
?- parents(<b>c2</b>, Y, C).
Y = m2.
Итак, что это , есть решение или нет?
Такие ошибки почти неизменно возникают, если вы используете (->)/2
и другие конструкции, которые нарушают логическая чистота вашего кода.Пожалуйста, смотрите логическая чистота для получения дополнительной информации.
Следовательно, с логической точки зрения, я могу только рекомендовать избегать таких конструкций, поскольку они побеждают основное преимуществоначальный логический язык программирования: способность логически рассуждать о своих программах .
Вместо этого сосредоточьтесь на четком описании отношений, которые вы хотите описать,и укажите условия, которые делают их правдой.Это позволит вам разумно использовать ваши программы Prolog.
EDIT : я вижу, вы предпочитаете неработающую программу.Для этой цели я рекомендую ignore/1
.ignore(Goal)
вызывает Goal
как once(Goal)
, а успешно .Вы можете использовать это, чтобы упростить вашу программу и при этом убедиться, что она остается неполной.