Расширение набора правил – работа с составными высказываниями
Для упрощения мы ограничимся утверждениями в виде простых дизъюнкций или конъюнкций вида:
Т(А) v Т(В)
…или:
F(A) ^ T(B),
Но не будем использовать более сложные утверждения в форме:
F(B) ^ (T(А) v T) B))
Для решения большинства интересных головоломок вполне достаточно простых выражений.
Наибольшие сложности при модификации нашей программы связаны с обработкой дизъюнктивных выражений, поскольку вывод о наличии противоречия может быть сделан только после завершения анализа всех членов операндов дизъюнкции. Например, нет противоречия между F(A) и Т(А) v F(B). Противоречие, которое обнаружится при обработке первого операнда дизъюнкции ДЛ) в предположении F(A), будет локальным в контексте Т(А). Но если мы вернемся к исходной дизъюнкции и попробуем проанализировать контекст F(B), то никакого противоречия обнаружено не будет, и, следовательно, интерпретация найдена.
Реализовать такой анализ локальных и глобальных противоречий можно, добавив в шаблон объекта claim атрибут context:
(def template claim (multifield content (type SYMBOL)) (multifield reason (type INTEGER) (default 0)) (field scope (type SYMBOL)) (field context (type INTEGER) (default 0)))
Значение 0 в поле context означает, что мы имеем дело с глобальным контекстом, значение 1 – с локальным контекстом левого операнда, а значение 2 – с локальным контекстом правого операнда дизъюнкции. Пусть, например, анализируется дизъюнкция:
T(A) v F(B)
Причем Т(А) будет истинным в контексте 1, a F(B) – истинным в контексте 2. В этом случае все выражение будет истинным глобально, т.е. в контексте 0.
Структуру объекта world также нужно модифицировать – внести в нее поле context. Это позволит отслеживать ход вычислений. Пусть, например, объект world имеет вид:
(world (tag 1) (scope truth) (context 2)).
Это означает, что данный "мир" создан следующей парой предположений:
- истинно высказывание, имеющее идентификатор (tag), равный 1, и
- правый операнд утверждения, которое содержится в этом высказывании, имеет значение "истина".
Новый вариант шаблона объекта world приведен ниже.
Объект world представляет контекст, сформированный определенными предположениями о правдивости или лживости персонажей.
Объект имеет уникальный идентификатор в поле tag, а смысл допущения – истинность или лживость – фиксируется в поле scope.
В поле context сохраняется текущий контекст анализируемого операнда дизъюнкции.
0 означает глобальный контекст дизъюнкции, 1 означает левый операнд, 2 означает правый операнд, (deftemplate world (field tag (type INTEGER) (default 1)) (field scope (type SYMBOL) (default truth)) (field context (type INTEGER) (default 0)))