infixl 6 :& ; infixl 5 :|
data Expr = EFalse| ETrue | Not Expr | Expr :& Expr | Expr :| Expr
optimize (Not e) = case e of
Not e -> optimize e
e1 :& e2 -> optimize (Not e1) :| optimize (Not e2)
e1 :| e2 -> optimize (Not e1) :& optimize (Not e2)
e -> Not e
optimize (e1 :& e2) = optimize e1 :& optimize e2
optimize (e1 :| e2) = optimize e1 :| optimize e2
optimize e = e
main
= print $ optimize
$ Not
(Not ETrue :& Not EFalse :
| (EFalse :
| Not ETrue
))
aW5maXhsIDYgOiYgOyBpbmZpeGwgNSA6fApkYXRhIEV4cHIgPSBFRmFsc2V8IEVUcnVlIHwgTm90IEV4cHIgfCBFeHByIDomIEV4cHIgfCBFeHByIDp8IEV4cHIKCWRlcml2aW5nIFNob3cKCm9wdGltaXplIChOb3QgZSkgPSBjYXNlIGUgb2YKCU5vdCBlICAgIC0+IG9wdGltaXplIGUKCWUxIDomIGUyIC0+IG9wdGltaXplIChOb3QgZTEpIDp8IG9wdGltaXplIChOb3QgZTIpCgllMSA6fCBlMiAtPiBvcHRpbWl6ZSAoTm90IGUxKSA6JiBvcHRpbWl6ZSAoTm90IGUyKQoJZSAgICAgICAgLT4gTm90IGUKb3B0aW1pemUgKGUxIDomIGUyKSA9IG9wdGltaXplIGUxIDomIG9wdGltaXplIGUyCm9wdGltaXplIChlMSA6fCBlMikgPSBvcHRpbWl6ZSBlMSA6fCBvcHRpbWl6ZSBlMgpvcHRpbWl6ZSAgZSAgICAgICAgID0gZQoKbWFpbiA9IHByaW50ICQgb3B0aW1pemUgJCBOb3QgKE5vdCBFVHJ1ZSA6JiBOb3QgRUZhbHNlIDp8IChFRmFsc2UgOnwgTm90IEVUcnVlKSk=