Я читаю Изучите Пролог прямо сейчас! глава о сокращениях и в то же время Программирование на языке Prolog для искусственного интеллекта Братко, глава 5: Управление обратным отслеживанием. Сначала казалось, что сокращение - это простой способ имитировать предложение if-else, известное из других языков программирования, например
# Find the largest number
max(X,Y,Y):- X =< Y,!.
max(X,Y,X).
Однако, как отмечено в строке, этот код завершится ошибкой в тех случаях, когда все переменные создаются, даже если мы ожидаем false
, например.
?- max(2,3,2).
true.
Причина ясна: первое правило не работает, второе не имеет больше связанных условий, поэтому оно будет успешным. Я понимаю это, но затем предлагается решение (вот swish):
max(X,Y,Z):- X =< Y,!, Y = Z.
max(X,Y,X).
И я не понимаю, как мне это читать. Я думал, что !
означает: «если все, что предшествует этому !
, верно, прекратить завершение, включая любые другие правила с тем же предикатом». Однако это не может быть правильным, потому что это означало бы, что создание экземпляра Y = Z
происходит только в случае сбоя, что было бы бесполезно для этого правила.
Так как же следует читать отрывок «по-человечески»? И, в качестве дополнения, как мне прочитать предложенное решение для max/3
выше?
!/0
всегда работает успешно. Следовательно, ошибка в ваших рассуждениях проистекает из смешения понятий завершение, неудача, успешное выполнение и прекращение поиска. дерево. Эта путаница отражена в формулировке прекращения действия. Чтобы ответить на ваш вопрос: «Человеческий» способ читать!/0
- это сказать: С этого момента я больше не могу понимать все последствия того, что я делаю. Это потому, что быстро становится слишком сложно рассуждать о программах, содержащих такие нечистые конструкции. - person mat   schedule 02.12.2016!
, является истинным, перестаньте помнить о любых других правилах с тем же предикатом (чтобы продолжить, в случае неудачи) - и продолжайте на то, что у вас есть как на единственную правду. поэтому, поскольку вы успешно достигли этого!
, поскольку все, что было до этого, было true, создание экземпляраY = Z
происходит только в случае успех, а не неудача. - person Will Ness   schedule 02.12.2016