Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

7.4. Предикат repeat

Специальный встроенный предикат repeat всегда согласуется с базой данных и всегда может быть передоказан при возврате.

В качестве примера использования repeat приведем запрос, пред­лагающий пользователю вводить значения до тех пор, пока прочи­танное системой число не превысит 100:

?- repeat,nl,write ('число?'), read(X),X100.

число ? 2

число? 100

число? 101

да

7.5. Декларативная и процедурная семантики

При составлении и написании программ на Прологе следует уста­новить, какие факты и отношения свойственны данной задаче. Они могут быть непосредственно выражены утверждениями Пролога и образуют декларативное описание задачи. Такое описание не задает порядок использования утверждений и согласования целевых утвер­ждении в пределах утверждения, не показывает, как сформирован­ные утверждения могут быть использованы для решения задачи. Пролог будет пытаться согласовать список целевых утверждений, просматривая утверждения сверху вниз и слева направо. В этом за­ключается процедурная семантика утверждений.

Иногда декларативное описание может быть выполнено как про­грамма. В других случаях нужно упорядочить утверждения таким образом, чтобы способ согласования целевых утверждений Прологом привел к решению задачи. Однако упорядочение утверждений само по себе не гарантирует получения работающей программы. Возмож­но, придется добавить некоторые детали для управления ходом вы­полнения программы: предикаты repeat, fail и отсечение (см. гл. 8). Такая информация указывает системе Пролог, как использовать факты и отношения. Полученную в результате программу следует рассматривать уже процедурно.

Характеристики процедуры

При написании или разборе процедуры необходимо определить следующие характеристики.

1) Сколько раз может быть успешно согласовано целевое утверж­дение? Когда целевое утверждение вызывает процедуру, важно знать, что случится, если механизм возврата снова приведет к этому целевому утверждению: будет ли оно согласовано вновь? должно ли оно быть согласовано?

2) Какая конкретизация переменных происходит при использо­вании каждого утверждения? Смысл вызова процедуры, независимо от побочных эффектов, заключается в том, чтобы произвести какую-либо проверку и/или осуществить конкретизацию или сцепление пе­ременных.

3) Какие возникают побочные эффекты ? Обычно это изменения, связанные с вводом в базу данных и удалением из нее, или обработка термов.

4) Какие параметры используются для входных значений и какие - для выходных? Некоторые процедуры могут иметь параметры, слу­жащие для ввода и вывода.

Пример 7.4.1. Определим процедуру дв_пол таким образом:

дв_пол(N,S) :- integer(N), var(S), S is N*2.

дв_пол(N,S) :- integer(S), var(N), N is S/2.

Здесь встроенный предикат integer успешно согласуется в том слу­чае, если его аргумент является целым числом, а предикат var - в том случае, если его аргумент является неконкретизированной перемен­ной. На запрос

?- дв_пол(5,5).

будет получен ответ

S=10

в то время как на запрос

?- дв_пол(N,8).

ответом будет

N=4

Предикат дв_пол является симметричным. В других случаях некото­рые или все параметры процедуры используются строго определен­ным образом.

Пример 7.4.2. Определим процедуру квадрат:

квадрат(N,S) :- integer(N), var(S), S is N*N.

Переменная S в процедуре будет конкретизирована как квадрат N, только в том случае, если N (входной параметр) является целым числом, а S (выходной параметр) - переменной.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]