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

Интерпретатор пытается унифицировать подцель «отец (билл, W)» с фразой «отец (билл, даниэль)». Эта попытка приводит к успеху, в результате чего конкретизируется переменная W. Она получает значение «даниэль». Теперь состояние интерпретатора таково:

(8)

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

? -дядя (джон, даниэль). ------> дядя (джон, даниэль): -

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

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

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

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

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

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

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

W = даниэль

Обратите внимание на то, что после отыскания первого ответа весь стек активных запросов сохраняется.

Неудача запроса и возврат назад

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

Указание интерпретатору вернуться назад - ввод символа;

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

Другой ответ на запрос "дядя "

Предположим, что после получения первого ответа "W = даниэль" на запрос "дядя" пользователь вводит символ ; . Подцель "отец", стоящая в вершине стека, принудительно делается неудачной, а конкретизация переменной W, осуществленная при последнем успехе этой цели, теряет свою силу. Интерпретатор переходит к попытке унифицировать данную подцель со следующей доступной фразой "отец":

(9)

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

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

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

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

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

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

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

? -отец (билл, W), ------> отец (билл, кеннет).

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

(10)

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

? - дядя (джон, кеннет). ------> дядя (джон. кеннет): -

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

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

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

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

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

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

Здесь запрос "дядя" опять оказывается успешным. Интерпретатор выведет новое значение переменной W:

W= кеннет

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