при попытке написать простую программу для решения проблемы SAT игрушки, я столкнулся со следующей проблемой: я не могу опустить голову.Ocaml оценивает булевский список на один логический
У меня есть переменная типа, которая определяется следующим образом:
type prefix =
| Not
| None
type variable =
| Fixed of (prefix * bool)
| Free of (prefix * string)
, из которого можно построить раздел списка переменных типа и формулу списка п типа. По существу это сводится к тому, чтобы иметь формулу в либо CNF, либо DNF (это меньше связано с проблемой). Когда сейчас пытается упростить положение, что я делаю следующее:
- Фильтр всех фиксированных переменных из положения, которое дает список
- упрощать переменные (Fixed (нет, правда) => Fixed (None, ложь))
Теперь у меня есть список, содержащий только Фиксированные переменные, которые я теперь хочу, чтобы объединить в одно фиксированное значение, делая что-то вроде этого
let combine l =
match l with
| [] -> []
| [x] -> [x]
| (* Get the first two variables, OR/AND them
and recurse on the rest of the list *)
Как мне достичь желаемого поведения на функциональном языке? Мой опыт в OCaml не такой уж большой, я скорее начинающий. Я пробовал делать x :: xs :: rest -> x < ||> xs < ||> комбинировать отдых, но это не работает. Где < ||> является обычным оператором для ИЛИ переменных.
Благодарим за помощь.