У Клоксин - ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
- Название:ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
У Клоксин - ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ краткое содержание
Книга английских специалистов, содержащая описание основ логического программирования и особенностей языка Пролог – базового языка ЭВМ пятого поколения. Области применения этого языка связаны с разработкой экспертных систем, интеллектуальных баз данных, обработкой естественного языка, разработкой компиляторов ЭВМ. Книга полезна для первого ознакомления с языком Пролог.
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
При использовании трассировки Пролог-система выводит на печать информацию о последовательности отработки целей, чтобы показать, какой стадии выполнения достигла программа. При этом, для того чтобы разобраться в том, что происходит, важно понять, когда и почему определенные цели выводятся на печать. В обычных языках программирования особый интерес представляют моменты входа в подпрограммы и выхода из них. Однако Пролог допускает написание недетерминированных программ, а это вносит сложности, связанные с механизмом возврата. Дело не ограничивается последовательностью входов в утверждения и выходов из них. Механизм возврата может неожиданно вновь запустить выполнение каких-либо утверждений, чтобы построить альтернативное решение. Кроме того предикат отсечения 'Г указывает для каких целей нельзя искать другие решения. Наибольшие трудности, с которыми приходится сталкиваться начинающим программистам, связаны именно с пониманием принципов работы механизма возврата: что на самом деле происходит, когда попытка согласования цели завершается неудачей и система неожиданно начинает возвратный ход. Мы надеемся, что этот процесс достаточно подробно описан в предыдущих главах. Впрочем, в предыдущих главах рассматривалась не только последовательность обработки целей, но также и то, как происходит конкретизация переменных, как цели сопоставляются с заголовками утверждений из базы данных, и, наконец, как согласуются с базой данных подцели. В модели трассировки выполнение Пролог-программ описывается в терминах четырех видов происходящих событий: CALL(ВЫЗОВ), ЕХIT(ВЫХОД), REDО(ПЕРЕДЕЛКА), FAIL(HEУДАЧА).
Событие CALL фиксирует начало попытки Пролога согласовать цель с базой данных. На наших диаграммах это обозначено стрелкой, входящей в прямоугольник сверху.
Событие EXIT фиксирует момент, когда некоторая цель только что согласована с базой данных. На наших диаграммах это обозначается стрелкой, выходящей снизу из прямоугольника.
Событие REDO фиксирует момент, когда система возвращается к цели, пытаясь повторно согласовать ее с базой данных. На наших диаграммах это обозначается стрелкой, которая возвращается в прямоугольник снизу.
Событие FAIL фиксирует момент, когда попытка согласовать цель с базой данных заканчивается неудачно. На наших диаграммах это соответствует выходу стрелки вверх из прямоугольника.
Средства отладки сообщают нам о моментах возникновения событий этих четырех видов в ходе выполнения наших программ. Эти события будут происходить со всеми целями, которые Пролог рассматривает во время выполнения программы. Чтобы можно было различать, к каким целям относятся происходящие события, каждой цели присваивается уникальный целочисленный идентификатор, который называется его номером обращения.
Обратимся к примеру. Рассмотрим следующее определение предиката потомок:
потомок(Х,Y):- отпрыск(Х,Y).
потомок(X,Z):- отпрыск(Х,Y), потомок(Y,Z).
Этот фрагмент программы находит прямых потомков некоторого лица по заданным в базе данных фактам отпрыск,например:
отпрыск(авраам,измаил).
отпрыск(авраам,исаак).
отпрыск(исаак,исав).
. . .
Первое утверждение программы указывает, что Yявляется потомком Xесли Yесть отпрыск X, а второе утверждение указывает, что Zявляется потомком Xесли Yесть отпрыск Xи если Zявляется потомком Y. Рассмотрим вопрос:
?- потомок(авраам,Ответ), fail.
и проследим за ходом выполнения программы чтобы увидеть, когда возникают разные события указанных видов. Важно, чтобы вы попытались проследить за процессом трассировки, мысленно воссоздавая поведение цепочки доказательств, которая входит в прямоугольники, обозначающие цели и выходит из них. Время от времени мы будем представлять текущее состояние в виде диаграмм.
В заданном вопросе после первой цели следует fail. Это сделано для того, чтобы инициировать механизм возврата и тем самым, получить все возможные решения для цели потомок. Таким образом, в целом вопрос никак не может иметь положительного ответа. Однако цель нашей трассировки состоит в том, чтобы наглядно представить себе ход выполнения программы, вызванный несогласуемостью второй цели (fail).
В начале мы имеем прямоугольники, обозначающие две цели, в которые пока не входила стрелка, представляющая цепочку доказательств (см. рис. 8.1). Первое событие состоит в ВЫЗОВе (CALL) цели потомок.Это - обращение номер 1.

Риc. 8.1
(1) CALL: потомок(авраам,Ответ)
(2) CALL: отпрыск(авраам,Ответ)
Мы сопоставили с целью первое утверждение процедуры потомок и это привело к ВЫЗОВ цели отпрыск.В результате возникла ситуация, где стрелка движется вниз (см. рис. 8.2). Мы продолжаем:

Рис. 8.2.
(2) EXIT: отпрыск (авраам,измаил)
Сразу успешно согласуется первое утверждение и следует ВЫХОД (EXIT)из цели.
(1) EXIT :потомок(авраам,измаил)
Таким образом, мы согласовали первое утверждение процедуры потомок.
(3) CALL: fail
(3) FAIL: fail
(1) REDO: потомок(авраам,измаил)
Затем мы пытаемся согласовать fail,и, как и следовало ожидать, эта попытка завершается НЕУДАЧЕЙ (FAIL). Стрелка возвращается из прямоугольника failназад выше в прямоугольник потомок.Изображение этой ситуации приведено на рис. 8.3. Стрелка движется вверх. Продолжаем:

Рис. 8.3.
(2) REDO: отпрыск(авраам,измаил)
(2) EXIT: отпрыск(авраам,исаак)
Для цели отпрысквыбрано альтернативное утверждение. Поэтому стрелка может снова выйти вниз из этого прямоугольника.
(1) EXIT: потомок(авраам,исаак)
(4) CALL: fail
(4) FAIL: fail
(1) REDO: потомок(авраам,исаак)
И снова failзаставляет нас отвергнуть это решение и начать возвратный ход. Заметим, что это было совершенно новое обращение к fail(мы вошли в него заново «сверху»).
(2) REDO: отпрыск(авраам,исаак)
(2) FAIL: отпрыск(авраам,Ответ)
На этот раз мы не можем предложить другое сопоставление для цели отпрыск,и потому продолжаем возвратный ход, стрелка отступает вверх, покидая прямоугольник отпрыск.
(5) CALL: отпрыск(авраам,Y)
Здесь произошло следующее: мы выбрали второе утверждение процедуры потомоки выполнили совершенно новое обращение к отпрыск,соответствующее первой подцели (рис. 8.4). Стрелка теперь снова движется вниз. Продолжаем:
Читать дальшеИнтервал:
Закладка: