Листинг 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).

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: