обработка нарезки в прологе - PullRequest
0 голосов
/ 22 января 2011

Может кто-нибудь объяснить, пожалуйста, обработку следующей команды:

max(X,Y,Max) :- X >= Y, !, Max = X ; Max = Y. 

Не могу понять, что именно означает ! в середине, заранее спасибо

Ответы [ 2 ]

3 голосов
/ 23 января 2011

The! (вырезать) означает, что если вы продвинулись так далеко (успешно в текущей цели), не делайте никаких возвратов (рассмотрите альтернативные способы достижения текущей цели), которые могли быть открыты до размещения разреза.

В вашем примере сокращение используется, чтобы кратко выразить, как определить Макс X и Y. То есть, как только вы добьетесь успеха с подцелью X >= Y, правильная альтернатива больше не вызывает сомнений (поэтому объедините Макса с X).

Сложная вещь - это приоритет , (представляющий логическое И) и ; (представляющий логическое ИЛИ). Последний связывается более слабо, чем первый, поэтому альтернативная подцель, объединяющая Макс с Y, может быть достигнута только в случае неудачи X >= Y (альтернатива для текущей цели не будет рассматриваться, если пропущено прохождение).

2 голосов
/ 23 января 2011

Я думаю, что ответ был дан совершенно ясно.

Ну, я просто немного заключу из вашего примера. Здесь мы можем «предположить», что есть два правила:

max(X, Y, Max) :- X >= Y, !, Max = X.
max(X, Y, Max) :- Max = Y.

Зачем это надо ставить !? Это потому, что без этого вы можете запросить что-то вроде max(5,4,Max) и результат будет

Max = 5;
Max = 4;

Почему это происходит? Потому что система Пролог находит всевозможные ответы. Когда придет !, он перестанет находить других.

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