Обработка тела фразы

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

Тело правила "дядя"

Тело правила "дядя" образовано составным запросом «брат(джон, В)», «отец(В,W)». Первая подцель - «брат (джон, В)» - помещается в стек запросов так:

(4)

- Активные запросы — — Фразы программы —

? - дядя (джон, W). ------> дядя (джон,W). -

брат (джон. В),

отец (В, W).

? - брат (джон, В). ------> брат (даниэль, кеннет).

брат (джон, билл).

Теперь новый запрос - «брат (джон, В)» - является активным запросом. Исходный запрос — "дядя" - однако все еще находится в стеке в ожидании завершения обработки тела правила "дядя". Запрос "брат" теперь указывает на начало множества фраз "брат".

Если попытка унификации будет неудачной, то переход к следующей фразе

Если попытка унификации запроса с заголовком фразы закончится неудачей, то интерпретатор перейдет к анализу следующей фразы соответствующего множества. Этот процесс будет продолжаться до тех пор, пока не обнаружится фраза, которую можно будет унифицировать с запросом. Если интерпретатор достигнет конца множества фраз, не обнаружив фразу, поддающуюся унификации, то запрос завершится неудачей.

Обработка подцели "брат"

Интерпретатор предпринимает попытку унифицировать подцель «брат (джон, В)» с фразой «брат (данизль, кеннет)». Эта попытка заканчивается неудачей, так как «джон» не унифицируется с « даниэль». Затем интерпретатор переходит к анализу следующей фразы "брат":

(5)

- Активные запросы - - Фразы программы-

? - дядя (джон, W). ----- > дядя (джон, W): -

брат (джон, В),

отец (В, W).

брат (даниэль, кеннет).

? - брат (джон, В). - - - - - -> брат (джон, билл).

Запрос «брат (джон, В)» унифицируется с фразой «брат (джон, билл)», в результате чего конкретизируется переменная В. Эта переменная получает значение «билл». После выполнения данной унификации состояние интерпретатора станет таким:

(6)

- Активные запросы - - Фразы программы -

? -дядя (джон, W). ------> дядя (джон, W): -

брат (джон, билл),

отец (билл, W).

брат (даниэль, кеннет).

? - брат (джон, билл). ----- -> брат (джон, билл).

В результате последней унификации переменная В получает значение «билл». Это значение будет использоваться при каждом употреблении переменной В в правиле "дядя".

Подцель "брат" дает положительный результат

Фраза «брат (джон, билл)» является фактом (у нее пустое тело), поэтому подцель "брат" сразу же оказывается успешной. Теперь интерпретатор помещает в вершину стека вторую подцель правила "дядя"- «отец (билл. W)».

(7)

- Активные запросы - - Фразы программы -

? - дядя (джон, W). ------> дядя (джон. W): -

брат (джон, билл),

отец (билл, W).

брат (даниэль, кеннет).

? - брат (джон, билл). ------> брат (джон, билл).

? -отец (билл, W). -------> отец (билл, даниэль).

отец (билл, кеннет).

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие