Я понимаю, что существуют общепринятые алгоритмы приведения заданного булево-логического выражения к КНФ или ДНФ. Я нашел несколько веб-сайтов об этом, но ничего такого, что я мог бы использовать для создания программы на Haskell вокруг этого.
Это не домашняя работа, и я не прошу кого-нибудь написать мне код — я просто ищу какой-то ресурс, которому я могу следовать, чтобы помочь мне создавать свои функции.
Мне кажется, что я должен определить тип данных Exp
, который имеет дело с Or Exp Exp
, And Exp Exp
, и т.д., и т.д.. а затем создайте стандартные «правила» (Де Моргана, Modus Ponens, Modus Tollens, какие у вас есть), чтобы использовать их для многократного применения к Exp
, пока я не достигну точки где я не получаю дальше.
(Поскольку я играл с Agda и т. д., я, как правило, писал все на Haskell, прежде чем переводить на Agda. Так что да, если вы больше знакомы с выражением чего-либо на Agda, тогда я тоже это пойму))
Exp
равен толькоAnd
илиOr
, то вам на самом деле нужен только один из законов Де Моргана (от этого выбора зависит, достигнете ли вы CNF или DNF). В чем именно заключается ваш вопрос? - person Karolis Juodelė   schedule 26.07.2014and, or, not
. Это не добавляет сложности. Кроме того, я что-то напутал в правилах. Вам нужны оба Де Моргана. Вместо этого вам нужен один дистрибутив. - person Karolis Juodelė   schedule 26.07.2014toCNF
для дочерних элементов и объединяете результаты. Очевидно,toCNF (And a b) = And (toCNF a) (toCNF b)
. Вам также нужно сопоставитьNot (And a b)
иNot (Or a b)
для Де Моргана. СопоставлениеOr
— это, конечно, самая интересная часть, но это всего лишь распределение. Если вы сочтете это сложным, я предлагаю сначала написать функцию, которая применяет Де Моргана до тех пор, пока все отрицания не будут литералами. Это проще, но в основном то же самое. - person Karolis Juodelė   schedule 26.07.2014