- •Глава 1
- •Глава 2 системы, основанные на знаниях
- •Глава 3
- •Глава 4 представление знаний
- •Глава 5 инженерия знаний
- •Глава 6
- •Часть 2
- •Variable имя_переменной
- •60 11 /Mod swap drop
- •16 Base ! ,
- •If a then или if a else в then
- •1 Of a endof
- •2 Of в endof 3 of с endof drop endcase
- •Слова literal (в), слова ; (с). Переменная ip переводится словом периода выполнения в положение сброшенного указателя
- •Глава 7 обработка списков
- •И ыный
- •Глава 8 методы программирования
- •Рекурсии)
- •Глава 9
- •Правило: имеет-волос-покров1
- •Правило: имеет-волос-покров2 (имеет-волос-покров )
- •Предложения нуль установить предложения чтсп
- •Р ис. 9.3. След поиска
- •If добавить-цели then ;
- •4 Begin (поиск)
- •10 Else
- •Глава 10
- •Глава 11
- •Begin dup ноль not
- •While r@ связь
- •If 2drop
- •If получить-цель @ найти-предложение?
- •If добавить-цели false
- •If false else false true then
- •Имёет-рыже-корич-окрас имеет-темиые-пятна ) 14
- •Глоссарий
- •Часть I. Экспертные системы - системы, основанные на знаниях
- •Часть 2. Построение систем,
: МАРКЕР ; ПРАВИЛО: ДАЕТ-МОЛОКО (ДАЕТ-МОЛОКО )
Правило: имеет-волос-покров1
3 (ИМЕЕТ-ВОЛОС-ПОКРОВ ГРУБИЯН }
Правило: имеет-волос-покров2 (имеет-волос-покров )
ПРАВИЛО: ИМЕЕТ-РОГА (ИМЕЕТ-РОГА )
ПРАВИЛО: МЛЕКОПИТАЮЩЕЕ (МЛЕКОПИТАЮЩЕЕ
ДАЕТ-МОЛОКО ИМЕЕТ-ВОЛОС-ПОКРОВ } ПРАВИЛО: КОЗЕЛ1
(КОЗЕЛ БОРЬКА ) ПРАВИЛО: КОЗЕЛ2 (КОЗЕЛ ГРУБИЯН )
ПРАВИЛО: КОЗЕЛЗ (КОЗЕЛ МЛЕКОПИТАЮЩЕЕ ИМЕЕТ-РОГА )
Предложения нуль установить предложения чтсп
(ДАЕТ-МОЛОКО <§> ИМЕЕТ-ВОЛОС-ПОКРО81 @
ИМЕЕТ-В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
\ ИНТЕРПРЕТАТОР ПРАВИЛ ПРОЛОГА
( -> ФЛАГ ИСТИНА|ЛОЖЬ) \ ФЛАГ=ИСТИНА => УСПЕШНОЕ
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
20 НОВСПИСОК ЦЕЛИ
20 НОВСПИСОК РЕШЕНИЯ
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
\ ИНТЕРПРЕТАТОР ПРАВИЛ ПРОЛОГА
( ЦЕЛЬ @ ПРЕДЛОЖЕНИЕ -> ФЛАГ) \ ПОИСК
\ ПОДХ.ПРЕДЛОЖЕНИЯ И ПОМЕЩ. В РЕШЕН.
\ ФЛАГ ИСТИНЕН, ЕСЛИ ПРЕДЛОЖЕНИЕ НАЙДЕНО
4 : НАЙТИ-ПРЕДЛОЖЕНИЕ? НАЙТИ-ПРЕДЛОЖЕНИЕ
5 DUP НОЛЬ DUP >R
IF 2DR0P
ELSE РЕШЕНИЯ СВЯЗЬ РЕШЕНИЯ СВЯЗЬ
THEN R> NOT ;
9 : ДОБАВИТЬ-ЦЕЛИ РЕШЕНИЯ @ ХВОСТ ПЕРВЫЙ
10 ПЕРВЫЙ ХВОСТ ЦЕЛИ 2С0ЕД ;
( -> ФЛАГ) \ ФЛАГ - ЛОЖЬ, ЕСЛИ СПИСОК РЕШЕНИЯ ПУСТ
: ВОЗВРАТ РЕШЕНИЯ @ DUP ПЕРВЫЙ SWAP