Расширение шаблона спецификаций на основе LINQ для реализации погружения
Существует много реализаций шаблона составной спецификации на основе LINQ. Я не видел тот, который использовал Subsuration.
Существуют ли такие примеры, которые были задокументированы (блоги и т. Д.) Или опубликованы с открытым исходным кодом? У меня есть идея и подтверждение концепции того, как это может работать, когда ExpressionVisitor переводит каждую спецификацию в каноническую логическую форму (CNF/DNF), но я обеспокоен тем, что это слишком сложно. Есть ли способ лучше?
1 ответ
Я обеспокоен тем, что это слишком сложно. Есть ли способ лучше?
Краткий ответ: "Нет, нет" 1
Длинный ответ: "чрезмерно сложный" отражает суть проблемы: это NP-сложный. Вот краткое неформальное доказательство, основанное на том факте, что проблема выполнимости является NP-полной:
- Предположим, что у вас есть две логические формулы,
A
а такжеB
- Вам нужно проверить, если
A
подразумеваетB
или эквивалентно¬A | B
для всех назначений переменных, по которымA
а такжеB
зависят. Другими словами, вам нужно доказательство того, чтоF = ¬A | B
это тавтология. - Предположим, что тавтологический тест может быть выполнен за полиномиальное время
- Рассматривать
¬F
обратнаяF
,F
выполнимо тогда и только тогда, когда¬F
это не тавтология - Используйте гипотетический полиномиальный алгоритм для проверки
¬F
за тавтологию - Ответ на это
F
выполнимо "является обратным ответом на" является¬F
тавтология " - Следовательно, наличие полиномиальной проверки тавтологии означало бы, что проблема выполнимости находится в
P
и чтоP=NP
,
Конечно, тот факт, что проблема является NP-трудной, не означает, что не было бы решений для практических случаев: фактически, ваш подход с преобразованием в каноническую форму может дать хорошие результаты во многих реальных ситуациях. Однако отсутствие известного "хорошего" алгоритма часто препятствует активной разработке практических решений 2.
1 с обязательным
P=NP
"отказ от ответственности.2 Если "разумно хорошее" решение не подойдет, что вполне может иметь место для вашей проблемы, если вы допустите "ложные негативы".