Я хотел бы проанализировать строку с пропозициональной формулой в CNF для DIMACS, таким образом, вложенный список int в haskell. Формат подходит для привязок haskell picosat, которые кажутся более производительными, чем другие варианты решения SAT.
Проблема в том, что мой код, который реализовал это, слишком сложен, и теперь я ищу возможную ошибку, которую невозможно найти.
(Мой подход состоял в том, чтобы использовать пакет haskell hatt, изменить пакет, чтобы он использовал строки вместо отдельных символов для имен переменных, проанализировать выражение с помощью hatt, а затем преобразовать полученное выражение в формат DIMACS.)
Я хочу разобрать строку, представляющую пропозициональную формулу в нотации CNF (см. пример ниже). Результатом должен быть вложенный список целых чисел. Таким образом, результат должен подходить для solveAll
, являющегося частью haskell picosat. привязки.
Вход:
-- "&" ... conjunction
-- "|" ... disjunction
-- "-" ... not operator
let myCNF = "GP & (-GP | Ma) & (-Ma | GP) & (-Ma | TestP) & (-Ma | Alg) & (-Ma | Src) & (-Ma | Hi) & (-Ma | Wg | X | Y) & -Z"
Результат:
-- DIMACS format
-- every Variable (e.g., "GP") gets a number, say GP gets the int num 1
-- in case of not GP (i.e., "-GP") the int number representing the variable is negative, thus -1
-- Note: I hope I didn't do a type
let myresult = [[1], [-1, 2], [-2, 1], [-2, 3], [-2, 3], [-2, 5], [-2, 6], [-2, 7, 8, 9], [-10]]
let myvars = ["GP", "Ma", "TestP", "Alg", "Src", "Hi", "Wg", "X", "Y", "Z"]
-- or alternativly the variables are stored in an associative array
let varOtherWay = (1, GP), (2, Ma) (3, TestP), (4, Alg), (5, Src), (6, Hi), (7, Wg), (8, X), (9, Y), (10, Z)