Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Таунсенд Проектирование и программная реализац...doc
Скачиваний:
16
Добавлен:
12.11.2019
Размер:
4.53 Mб
Скачать
  1. : МАРКЕР ; ПРАВИЛО: ДАЕТ-МОЛОКО (ДАЕТ-МОЛОКО )

  2. Правило: имеет-волос-покров1

3 (ИМЕЕТ-ВОЛОС-ПОКРОВ ГРУБИЯН }

  1. Правило: имеет-волос-покров2 (имеет-волос-покров )

  2. ПРАВИЛО: ИМЕЕТ-РОГА (ИМЕЕТ-РОГА )

  3. ПРАВИЛО: МЛЕКОПИТАЮЩЕЕ (МЛЕКОПИТАЮЩЕЕ

  4. ДАЕТ-МОЛОКО ИМЕЕТ-ВОЛОС-ПОКРОВ } ПРАВИЛО: КОЗЕЛ1

  5. (КОЗЕЛ БОРЬКА ) ПРАВИЛО: КОЗЕЛ2 (КОЗЕЛ ГРУБИЯН )

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

  1. Предложения нуль установить предложения чтсп

  2. (ДАЕТ-МОЛОКО <§> ИМЕЕТ-ВОЛОС-ПОКРО81 @

  3. ИМЕЕТ-В0Л0С-П0КР082 ф ИМЕЕТ-РОГА @ МЛЕКОПИТАЮЩЕЕ

13 @ К03ЕЛ1 <§> К03ЕЛ2 <§> КОЗЕЛЗ @ )

U РЕШЕНИЯ НУЛЬ УСТАНОВИТЬ ЦЕЛИ НУЛЬ УСТАНОВИТЬ 15 НУЛЬ КОЗЕЛ ЦЕЛИ СПИСОК

Экран 71. Расширенная база знаний

она вносит в вершину стека флаг, предназначенный для UNTIL в слове ПОИСК. При ложном значении флага поиск продолжается, при истинном - завершается и на стек помещается следующий флаг, означающий успех или неудачу.

Для самой внешней конструкции IF-ELSE-THEN в слове (ПОИСК) «гтвь ELSE выбирается тогда, когда список ЦЕЛИ пуст. На стеке остаются два флага: первый для завершения, второй для обозначения успеха. Слово ВОЗВРАТ, стоящее перед IF-THEN, осуществляет манипуляции с флагом. При успешном завершении ВОЗВРАТА оно передает истинное значение флага, ПОИСК не завершает свое выполнение и выдает ложный флаг. Если же. воз- врат заканчивается неудачей, возвращается ложный флаг и в сте- ке остаются флаги в таком порядке: ложь-истина.

Слова НАЙТИ-ПРЕДЛОЖЕНИЕ? и ЮЗВРАТ приводятся на экране 61. Как (ПОИСК), так и ВОЗВРАТ используют слово НАЙТИ-ПРЕДЛОЖЕНИЕ?, а оно в свою очередь - слово НАЙ- ТИ-ПРЕДЛОЖЕИИЕ, изображенное на экране 60, для фактичес- кого поиска подходящего предложения. НАЙТИ-ПРЕДЛОЖЕНИЕ получает цель и указатель на ПРЕДЛОЖЕНИЯ, а затем ищет предложение, заголовок которого сопоставим с целью. Если под- ходящее предложение обнаруживается, то в стек помещается как цель, так и указатель на выбранное предложение. Поскольку ПРЕ- ДЛОЖЕНИЯ есть список предложений, каждое из которых само

204

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

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

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

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

ИМЕЕТ-ВОЛОС-ПОКРОВ)

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

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

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

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

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

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

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

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

ЦЕЛИ: НУЛЬ

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

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

(МЛЕКОПИТАЮЩЕЕ ДАЕТ-МОЛОКО

ИМЕЕТ-ВОЛОС-ПОКРОВ)

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

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

Р ис. 9.3. След поиска

является списком, указатель на ПРЕДЛОЖЕНИЯ будет стлаться на некоторый список, например такой:

((КОЗЕЛ БОРЬКА)

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

что соответствует второму фрейму на рис. 9.4.

Чтобы получить заголовок первого предложения этого "уре- занного" (посредством слова ХВОСТ) списка ПРЕДЛОЖЕНИЯ, потребуется два раза применить слово ПЕРВЫЙ. После первого применения возвратится первое предложение, после второго - его заголовок. Затем указатель на заголовок предложения в теле НАЙТИ-ПРЕДЛОЖЕНИЕ будет сравниваться (посредством = ) с

205

целью. Так как имя данной цели и указатель на нее представляет собой простую переменную Форта, то для сравнения можно вос- пользоваться операцией = . (В полном Прологе операция = замене-

6 2

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

  2. ( -> ФЛАГ ИСТИНА|ЛОЖЬ) \ ФЛАГ=ИСТИНА => УСПЕШНОЕ

2

3

4

5

6

7

8

9

10

11

12

13

14

15

\ ЗАВЕРШЕНИЕ (ПОИСК)

ЦЕЛИ @ НОЛЬ NOT IF ПОЛУЧИТЬ-ЦЕЛЬ ПРЕДЛОЖЕНИЯ @ НАЙТИ-ПРЕДЛОЖЕНИЕ?

IF ДОБАВИТЬ-ЦЕЛИ FALSE

ELSE ВОЗВРАТ

IF FALSE ELSE FALSE TRUE THEN

THEN

ELSE TRUE DUP THEN

Э кран 62. Интерпретатор правил Пролога: (ПОИСК)

Слово ВОЗВРАТ прежде всего восстанавливает цель и указа- тель на предложение (последний отмечает точку возврата в списке ПРЕДЛОЖЕНИЯ) из списка РЕШЕНИЯ, а затем устанав- ливает его в качестве нового значения в хвост списка РЕШЕНИЯ, т.е. оно продвигается по списку через два элемента, удаляя только что восстановленные цель и указатель на предложение. Да- лее, чтобы возобновить поиск цели, начиная с указателя пред-

6 0 0 \ ИНТЕРПРЕТАТОР ПРАВИЛ ПРОЛОГА

1

  1. 20 НОВСПИСОК ЦЕЛИ

  2. 20 НОВСПИСОК РЕШЕНИЯ

  3. 200 НОВСПИСОК ПРЕДЛОЖЕНИЯ 5

6 7 8 9 10 11 12 13 14 15

( -> ЦЕЛЬ)

: ПОЛУЧИТЬ-ЦЕЛЬ ЦЕЛИ @ DUP ПЕРВЫЙ SWAP ХВОСТ ЦЕЛИ SWAP УСТАНОВИТЬ ;

( ЦЕПЬ ©ПРЕДЛОЖЕНИЯ1 -> ЦЕЛЬ @ПРЕДЛОЖЕНИЯ2) : НАЙТИ-ПРЕДЛОЖЕНИЕ

BEGIN 2DUP ПЕРВЫЙ ПЕРВЫЙ DUP >R • R> НОЛЬ OR NOT WHILE ХВОСТ REPEAT

на операцией UNIFY (УНИФИКАЦИЯ), объяснение которой при- водится ниже.) Если сопоставления не произошло, а в списке еще остались элементы, то указатель хвоста предложений переместится на следующее предложение и сравнение повторится. После того как слово НАЙТИ-ПРЕДЛОЖЕНИЁ завершит свое выполнение, оно возвратит указатель. Если ни одно из сравнений не сработало, этот указатель будет ссылаться на пустой список предложений.

Слово НАЙТИ-ПРЕДЛОЖЕНИЕ? проверяет, не является ли возвращенный список (указатель) НУЛЕМ (применяя НОЛЬ) и помещает копию полученного флага (используя >R) в стек возвра- тов. Если поиск закончился неудачей, стек очищается, и флаг пе- редается снова. Если же поиск прошел успешно, то как цель, так и указатель предложения связываются в список РЕШЕНИЯ. Таким образом, структура списка РЕШЕНИЯ следующая:

(цель, указатель-предложения1 цеяь2 указатель- предложения2 ... цельn указатель-предложенияп)

На рис. 9.4 показано только первое предложение из оставшей- ся части списка ПРЕДЛОЖЕНИЯ, на которое ссылается указатель предложения.

61

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

  2. ( ЦЕЛЬ @ ПРЕДЛОЖЕНИЕ -> ФЛАГ) \ ПОИСК

  1. \ ПОДХ.ПРЕДЛОЖЕНИЯ И ПОМЕЩ. В РЕШЕН.

  2. \ ФЛАГ ИСТИНЕН, ЕСЛИ ПРЕДЛОЖЕНИЕ НАЙДЕНО

4 : НАЙТИ-ПРЕДЛОЖЕНИЕ? НАЙТИ-ПРЕДЛОЖЕНИЕ

5 DUP НОЛЬ DUP >R

  1. IF 2DR0P

  2. ELSE РЕШЕНИЯ СВЯЗЬ РЕШЕНИЯ СВЯЗЬ

  3. THEN R> NOT ;

9 : ДОБАВИТЬ-ЦЕЛИ РЕШЕНИЯ @ ХВОСТ ПЕРВЫЙ

10 ПЕРВЫЙ ХВОСТ ЦЕЛИ 2С0ЕД ;

  1. ( -> ФЛАГ) \ ФЛАГ - ЛОЖЬ, ЕСЛИ СПИСОК РЕШЕНИЯ ПУСТ

  2. : ВОЗВРАТ РЕШЕНИЯ @ DUP ПЕРВЫЙ SWAP