При попытке решить логические задачи на компьютере обычно сначала конвертируют их в CNF, потому что лучшие алгоритмы решения ожидают ввода CNF.
Для логики высказываний правила учебника для этого преобразованияпросто, но если вы примените их как есть, результатом будет один из очень редких случаев, когда программа сталкивается с double экспоненциальным потреблением ресурсов, не будучи специально созданным для этого:
a <=> (b <=> (c <=> ...))
с N переменными генерирует 2 ^ 2 ^ N предложений, одно экспоненциальное увеличение при преобразовании эквивалентности в AND / OR, а другое при распределении OR в AND.
Решение этой проблемы состоит в переименовании подтерминов.Если мы переписаем вышеприведенное как что-то вроде
r <=> (c <=> ...)
a <=> (b <=> r)
, где r
- это свежий символ, который определен равным подтерму - в общем, нам может понадобиться O (N) таких символов -экспоненциальных взрывов можно избежать.
К сожалению, это сталкивается с проблемой, когда мы пытаемся расширить ее до логики первого порядка.Используя нотацию TPTP, где ?
означает «существует», а переменные начинаются с заглавных букв, рассмотрим
a <=> ?[X]:p(X)
По общему признанию, этот случай достаточно прост, так что нет реальной необходимости переименовывать подтерм, но необходимоиспользуйте простой случай для иллюстрации, поэтому предположим, что мы используем алгоритм, который просто автоматически переименовывает аргументы оператора эквивалентности;эта точка обобщается на более сложные случаи.
Если мы попробуем описанный выше трюк и переименуем подтерм ?
, мы получим
r <=> ?[X]:p(X)
Экзистенциальные переменные преобразуются в символы Сколема, поэтомукак
r <=> p(s)
Исходная формула затем расширяется до
(~a | r) & (a | ~r)
, что по построению эквивалентно
(~a | p(s)) & (a | ~p(s))
Но это не правильно!Предположим, что мы не сделали переименование, а просто расширили первоначальную формулу, как было, мы получили бы
(~a | ?[X]:p(X)) & (a | ~?[X]:p(X))
(~a | ?[X]:p(X)) & (a | ![X]:~p(X))
(~a | p(s)) & (a | ~p(X))
, что критически отличается от версии, которую мы получили с переименованием.
проблема в том, что эквивалентность требует как положительной, так и отрицательной версий каждого аргумента, но применение отрицания к терминам, которые содержат универсальные или экзистенциальные кванторы, структурно изменяет эти термины;вы не можете просто инкапсулировать их в определение, а затем применить отрицание к определенному символу.
В результате этого, когда у вас есть эквивалентность, а аргументы могут содержать такие квантификаторы, вам действительно нужно повторяться через каждый аргументдважды, один раз для положительной версии, один раз для отрицательной.Этого достаточно, чтобы вернуть экзистенциальный взрыв, которого мы надеялись избежать путем переименования.Насколько я понимаю, эта проблема не связана с тем, как работает конкретный алгоритм, а с характером задачи.
Итак, мой вопрос:
Учитывая входную формулу, которая можетсодержат произвольную вложенность эквивалентности и квантификаторов, есть ли какой-нибудь алгоритм, который будет корректно превращать это в CNF с полиномиальным, а не экспоненциальным числом предложений?