Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Таунсенд Проектирование и программная реализац...doc
Скачиваний:
15
Добавлен:
12.11.2019
Размер:
4.53 Mб
Скачать
  1. ХВОСТ ПЕРВЫЙ ХВОСТ РЕШЕНИЯ DUP @ ХВОСТ ХВОСТ

  2. УСТАНОВИТЬ НАЙТИ-ПРЕДЛОЖЕНИЕ? DUP

  3. If добавить-цели then ;

Э краны 60, 61. Интерпретатор правил Пролога: ПОЛУЧИТЬ-ЦЕЛЬ, НАЙТИ-ПРЕДЛОЖЕНИЕ, НАЙТИ-ПРЕДЛОЖЕНИЕ? и ВОЗВРАТ

206

207

ЦЕЛИ: (КОЗЕЛ) РЕШЕНИЯ: НУЛЬ

ЦЕЛИ: (БОРЬКА) РЕШЕНИЯ: (КОЗЕЛ БОРЬКА)

ЦЕЛИ: (ГРУБИЯН) РЕШЕНИЯ: (КОЗЕЛ ГРУБИЯН)

ЦЕЛИ: (МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА) РЕШЕНИЯ: (КОЗЕЛ МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА)

ЦЕЛИ: (ДАЕТ-МОЛОКО ИМЕЕТ-ВОЛОС-ПОКРОВ ИМЕЕТ-РОГА) РЕШЕНИЯ: (МЛЕКОПИТАЮЩЕЕ ДАЕТ-МОЛОКО

ИМЕЕТ-ВОЛОС ПОКРОВ) (КОЗЕЛ МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА)

ЦЕЛИ: (ИМЕЕТ-ВОЛОС-ПОКРОВ ИМЕЕТ-РОГА) РЕШЕНИЯ: (ДАЕТ-МОЛОКО)

(МЛЕКОПИТАЮЩЕЕ ДАЕТ-МОЛОКО ИМЕЕТ-ВОЛОС- ПОКРОВ)

(КОЗЕЛ МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА)

ЦЕЛИ: (ГРУБИЯН ИМЕЕТ-РОГА)

РЕШЕНИЯ: (ИМЕЕТ-ВОЛОС-ПОКРОВ ГРУБИЯН)

(ДАЕТ-МОЛОКО)

(МЛЕКОПИТАЮЩЕЕ ДАЕТ-МОЛОКО . ИМЕЕТ-ВОЛОС-ПОКРОВ)

(КОЗЕЛ МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА)

ЦЕЛИ: (ИМЕЕТ-РОГА)

РЕШЕНИЯ: (ИМЕЕТ-ВОЛОС-ПОКРОВ)

(ДАЕТ-МОЛОКО)

(МЛЕКОПИТАЮЩЕЕ ДАЕТ-МОЛОКО ИМЕЕТ-ВОЛОС-ПОКРОВ)

(КОЗЕЛ МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА)

ЦЕЛИ: НУЛЬ

РЕШЕНИЯ: (ИМЕЕТ-РОГА ИМЕЕТ-ВОЛОС-ПОКРОВ)

(ДАЕТ-МОЛОКО)

(МЛЕКОПИТАЮЩЕЕ ДАЕТ-МОЛОКО ИМEЕТ-ВОЛОС-ПОКРОВ)

(КОЗЕЛ МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА)

УСПЕШНОЕ ЗАВЕРШЕНИЕ

Рис. 9.4. Еще одна трасса выполнения слова ПОИСК с возвратом в первых двух фреймах

208

ложения, ВОЗВРАТ вызывает слово НАЙТИ-ПРЕДЛОЖЕНИЕ. При успешном завершении поиска новые цели из подобранного предложения посредством вызова ДОБАВИТЬ-ЦЕЛИ добавляются к списку ЦЕЛИ. Если подходящего предложения не оказалось, поиск завершается неудачей. ВОЗВРАТ возвращает в стек флаг, означающий успех или неудачу.

Теперь нам осталось лишь объяснить два второстепенных слова из определения ПОИСК. Слово ДОБАВИТЬ-ЦЕЛИ выбира- ет цели из списка, на который ссылается первый указатель предложения, и присоединяет его к списку ЦЕЛИ. Достижение це- лей в списке РЕШЕНИЯ нетривиально - чередованием слов ПЕР- ВЫЙ и ХВОСТ. Выражение РЕШЕНИЯ @ ХВОСТ осуществляет перемещение за первую цель в списке РЕШЕНИЯ, возвращая в качестве результата оставшуюся часть данного списка. Затем слово ПЕРВЫЙ возвращает список, содержащий предложения, - урезан- ный посредством слова ХВОСТ список ПРЕДЛОЖЕНИЯ. Следую- щее вхождение слова ПЕРВЫЙ возвращает первое предложение из этого списка, а последнее слово ХВОСТ перемещается за заголо- вок. Оставшаяся часть представляет собой список, содержащий цели первого предложения.

Слово ПОЛУЧИТЬ-ЦЕЛЬ восстанавливает первый элемент из списка ЦЕЛИ и удаляет его, превращая этот список в его хвост. Помимо перечисленных слов, нам требуются три списка, которые занимают небольшой объем памяти и показаны на экране 60.

Кроме собственно слова ПОИСК, на экранах с 63 го по 65-й описаны несколько дополнительных слов для пользовательского интерфейса и отладки. В Прологе запрос цели может быть осуще- ствлен следующим образом:

?- цель

Здесь приводится еще одно похожее слово, которому, правда, нужно задавать список целей. Чтобы доказать цель, нужно набрать:

?-(ЦЕЛЬ)

Слово ?- для получения списка целей, находящихся в списке ЦЕЛИ, использует слово ЧТСП. Это слово опустошает список РЕШЕНИЯ, подготавливая его для нового поиска. Ответом на запрос будет лиое УСПЕХ, либо НЕУДАЧА- Если вы хотите уви- деть следы поиска, то можно встроить в ?- слово СЛЕД (как было показано ранее), для чего необходимо выполнить переустановку вектора вычисления ВЫВОД на СЛЕД:

СЛЕД IS ВЫВОД

В исходном состоянии вектор ВЫВОД установлен на слово ПОИСК, которое не оставляет следов.

209

63

О Ч ИНТЕРПРЕТАТОР ПРАВИЛ ПРОЛОГА 1

2 ( -> ФЛАГ) \ ФЛАГ * ИСТИНА => УСПЕХ

3 : ПОИСК