Шаг 6. Относительно универсума [{a, b, c} {a, b, c, d} {a, d}]
|
|
|
{b,c} |
{c,d} |
{a} |
|
|
|
|
{a,b} |
{a,c} |
. |
|
R = R [XYV] = |
||||||
2 |
1 |
|
|
|
|
|
|
|
|
|
{c} |
{a,b,d} |
|
|
|
|
|
|
|
|
Шаг 7. У D-системы R2 третий атрибут бесконфликтный, поэтому в соответствии с теоремой 3.5. достаточно проверить непустоту D-системы
|
|
|
|
|
{a,b} |
{a,c} |
|
. У этой D-системы второй атрибут монотонный, поэтому |
|
|
{c} |
|
||
|
{a,b,d} |
|
||
D-система непуста и, следовательно, C R не выполняется.
Пусть D-система R задана в универсуме {0, 1}n, где n – число атрибутов или переменных в соответствующей формуле исчисления высказываний. В такой модели алгоритм проверки включения C-кортежа в C-систему имеет некоторые особенности по сравнению с общим алгоритмом. Пусть заданы в универсуме {0, 1}n C-кортеж C и C-система R.
Алгоритм 3.2 (проверка включения C-кортежа в C-систему в универсуме {0, 1}n):
1)проверить, существует ли в R такой C-кортеж Ci, для которого C Ci. Если существует, то выход с ответом "да";
2)вычислить R0 = C R;
3)если R0 = , то выход с ответом "нет";
4)если R0 содержит один C-кортеж, то выход с ответом "нет";
5)в C-системе R0 выделить проекцию R0 , соответствующую фиктивным
атрибутам C-кортежа C;
6) проверить непустоту полученной D-системы R0 . Если D-система пуста, то ответ "да", в противном случае – "нет".
Рассмотрим пример. Здесь для экономии места компоненты {0} и {1} записываются в АК-объектах как 0 и 1 соответственно. Пусть заданы
C = [0 1 0] и
|
|
1 |
|
|
0 |
R = |
0 |
1 |
0 |
|
|
|
0 |
|
1 |
. |
|
|
|
0 |
|||
|
|
|
1 |
1 |
|
|
0 |
|
115
Шаг 1. Условие не выполнено.
0 1 1 0
Шаг 2. R0 = 0 0 1 1 0 .
0 1 1 0
Шаги 3 и 4. Условия не выполнены.
|
1 |
|
Шаг 5. R = |
0 |
1 . |
0 |
|
|
|
|
1 |
|
|
|
|
|
0 |
|
|
|
= 1 |
|
; система непуста, ответ – "нет". |
|
Шаг 6. |
R0 |
0 |
||
|
|
|
0 |
|
|
|
|
|
|
Обоснование корректности алгоритма. Шаги 1, 2 и 3 очевидны. Шаг 4: если условие не выполнено на шаге 1, то для C-системы R0, содержащей единственный C-кортеж, возможен только один вариант: R0 C, в силу чего неверно C R0. Шаги 5 и 6: после шага 2 во всех атрибутах R0, совпадающих с нефиктивными атрибутами C, компоненты равны соответствующим компонентам C. В оставшихся атрибутах, чтобы выполнялось C R0, должен
содержаться частный универсум. Следовательно, R0 пусто.
Стоит отметить, что в случае, когда C – элементарный кортеж или может быть разложен на небольшое число элементарных кортежей (т.е. число фиктивных атрибутов сравнительно невелико), то для проверки включения достаточно ограничиться шагом 1 алгоритмов 3.1 и 3.2.
На основе этих алгоритмов легко построить алгоритм проверки включения одной C-системы в другую (проверяется включение каждого C-кортежа первой C-системы во вторую).
3.4. Алгоритм решения задачи "Выполнимость КНФ"
Важность задачи "Выполнимость КНФ" в системах искусственного интеллекта обусловлена следующими причинами.
Во-первых, это основная NP-полная задача в теории сложности вычислений, поскольку доказано, что любая задача класса NP при
116
использовании рациональной системы кодирования может быть представлена в виде некоторой КНФ, причем преобразование условий любой задачи класса NP в КНФ занимает полиномиальное время.
Во-вторых, на основе теоремы 1.6 как для исчисления высказываний, так и для исчисления предикатов был сформулирован принцип резолюции, который широко применяется в машинных реализациях систем искусственного интеллекта. Согласно этому принципу формула F1 ... Fn G преобразуется в КНФ, и логический вывод сводится к решению задачи выполнимости КНФ.
Таким образом, задача выполнимости КНФ занимает ведущее место в практических приложениях теории логического вывода и в теории сложности вычислений, а выявление новых классов КНФ с полиномиально распознаваемым свойством выполнимости представляется актуальным направлением исследований.
В АК любая D-система изоморфна некоторой КНФ, и задача выполнимости сводится к ответу на вопрос о пустоте или непустоте соответствующей D-системы. Один из возможных вариантов ответа на этот вопрос – преобразование D-системы в альтернативный класс с получением С-системы, описывающей множество выполняющих подстановок КНФ. Но этот вариант нерационален, особенно в случаях, когда D-система не пуста, так как здесь определяется множество всех элементарных кортежей, в ней содержащихся, хотя достаточно найти единственный.
Предлагается использовать следующий метод. На первом этапе с помощью соотношений, изложенных в подразделе 3.2, выявляется существование монотонных (при их наличии задача решается за полиномиальное время) или бесконфликтных (что позволяет уменьшить размерность D-системы) блоков. Когда эти способы исчерпаны, можно выполнить задачу преобразования D-системы в C-систему, но изменить порядок выполнения операций. Обычно вначале все D-кортежи исходной D-системы преобразуются в ортогональные C-системы, после чего последовательно находится пересечение этих C-систем. Для решения задачи выполнимости вместо поиска пересечения промежуточных C-систем в целом можно искать последовательное пересечение C-кортежей из разных C-систем до тех пор, пока не придем к последней C-системе или не прервем операцию после получения пустого C-кортежа. В последнем случае выбирается другая последовательность операций, и так до тех пор, пока не
117
доказан положительный результат или не перебраны все возможные сочетания пересечений C-кортежей, чтобы убедиться в пустоте исходной D-системы. Такой метод значительно сокращает трудоемкость алгоритма решения задачи, особенно когда осуществляется ортогонализация и используются определенные критерии, позволяющие за счет изменения порядка выполнения операций получать большое количество отрицательных результатов (пустых C-кортежей) на первых этапах вычислений [Кулик, 1993].
Здесь рассматривается еще один во многих случаях более эффективный вариант алгоритма решения задачи выполнимости [Кулик, 1995], где используется алгоритм проверки включения C-системы в C-систему, изложенный в предыдущем разделе.
Алгоритм 3.3. (проверка выполнимости D-системы):
Пусть R – D-система, в которой отсутствуют монотонные и бесконфликтные блоки и содержится множество D-кортежей {D1, D2, ..., Dm}. Очевидно, что R = D1 D2 ... Dm.
1. Выберем какой-либо D-кортеж (например, D1) и выполним следующее преобразование:
D1 D2 ... Dm = D1 D2 ... Dm = D1 \ (D2 ... Dm ).
Подвыражение R1 = D2 ... Dm есть C-система, равная дополнению D-системы D2 ... Dm.
2. Выбранный D-кортеж D1 преобразуем по теореме 3.1 в ортогональную C-систему R0. Тогда исходную D-систему можно записать в виде R0 \ R1.
3. Для проверки выполнимости R достаточно проверить включение R0 R1. При положительном ответе R = , а при отрицательном – R .
Предположим, что на шаге 3 проверка включения некоторого C-кортежа Ci из R0 в C-систему R1 производится по алгоритму 3.1 (или 3.2) из подраздела 3.3. Если при этом достигнут последний шаг, то необходимо проверить выполнимость промежуточной D-системы Rk, имеющей меньшую размерность, чем исходная D-система R. Для проверки можно снова применить алгоритм 3.3, используя показанное выше преобразование Rk = Rk0 \ Rk1.
Ясно, что при совестном применении алгоритмов 3.3 и 3.1 (или 3.2) осуществляется обход дерева решения. Процедура завершается, если
118
(i)проверка включения хотя бы одного C-кортежа Cj, содержащегося в промежуточной C-системе Rk0, в C-систему Rk1 окажется безуспешной – в этом случае исходная D-система выполнима;
(ii)все проверки оказались успешными – D-система невыполнима. Докажем корректность алгоритма. Если в каком-либо узле дерева решения
подтверждается включение |
C-кортежа из Rk0 в C-систему Rk1, то в одном из |
C-кортежей C-системы R0 |
содержится по крайней мере один элементарный |
кортеж, не входящий в R1. |
Отсюда следует, что R0 \ R1 и соответственно |
R . С другой стороны, если все возможные проверки успешны, то
R0 \ R1 = R = .
В качестве примера определим выполнимость D-системы
{c} |
|
|
|
{a} |
{b} |
R[XYZ] = {c} |
{a,c} |
|
|
{b} |
|
|
{a} |
|
{b} {a,c}
,
заданной в универсуме {a, b, c}3. Пусть R0 |
= ]{c} {b}[ = {c} |
|
|
(c |
|
{a,b} |
|
{b} |
|
учетом ортогонализации). Тогда |
|
|
|
|
{b,c} {a,c}
{a,b} {b} R1 = {a,c}
{b,c}
{b}
.
Найдем сначала включение C1 = [{c} ] в R1. Здесь уже на шаге 1 алгоритм завершается успешно, так как по теореме 2.3 C1 включен в третий C-кортеж C-системы R1.
Проверим включение C2 = [{a, b} {b}] в R1. Шаг 1. Условие не выполнено.
|
|
|
|
|
{b} {a,c} |
{b} |
|
{a,b} {b} |
{b} |
||
Шаг 2. R2 = C2 R1 = |
{a} |
|
{b} . |
|
|
|
|
{a,b} {b,c} |
{b} |
||
Шаги 3 и 4. Условия не выполнены.
119