Листинг 4.1. программа, иллюстрирующая применение метода резолюции

 

predicates

likes(symbol,symbol)

food(symbol,symbol)

 

clauses

S2 likes(bill,pizza):-

food(pizza,italiano).

S3 food(pizza,italiano).

 

 

S2 и S3 –родительские предложения

В качестве S1 будет выступать цель goal: likes(bill,pizza), которая поступит на компилятор в виде отрицания.

Опровержение отрицания демонстрируется так: допущение отрицания цели ведет к противоречию.

likes(bill,pizza) подаем на вход системы резолютивного вывода. Система должна опровергнуть это отрицание при помощи других предложений программы.

 

 

Рис. 4.1. Применение принципа резолюции

 

 

Для верхнего случая : S1: A.

S2:A:-B.

S: B

 

Для нижнего случая : S1: A

S2:A

S: противоречие

В данном примере оказалось достаточно двух шагов вывода. Если предположить, что мы не отказываемся от предложений S2 и S3, и сами они не являются противоречивыми, то отсюда следует, что они совместно противоречат S1, то есть подтверждают отрицание S1, а следовательно, ответ –ДА.

В общем виде:

S1: (A1,..,An)

S2: Aк:-B1,..,Bm где 1<=к<=n

Некий предикат Ak из отрицания S1 совпадает с головой правила S2.В этой ситуации шаг вывода заменяет Ak в S1 на подцель из S2, и в качестве резольвенты получаем s: (A1,..,Ak-1,B1,..,Bm,Ak+1,..,An).

 

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

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