Skip to content

Instantly share code, notes, and snippets.

@serras
Created February 21, 2019 13:31
Show Gist options
  • Save serras/d7f64cdae3c8f334c03ec61b3a501798 to your computer and use it in GitHub Desktop.
Save serras/d7f64cdae3c8f334c03ec61b3a501798 to your computer and use it in GitHub Desktop.
Small soundness proof for Boolean formulae
module BF where
open import Agda.Builtin.Equality
data BF : Set where
True : BF
False : BF
Not : BF BF
And : BF BF BF
Or : BF BF BF
data Bool : Set where
true false : Bool
not : Bool Bool
not true = false
not false = true
and : Bool Bool Bool
and true true = true
and _ _ = false
or : Bool Bool Bool
or false false = false
or _ _ = true
eval : BF Bool
eval True = true
eval False = false
eval (Not x) = not (eval x)
eval (And x y) = and (eval x) (eval y)
eval (Or x y) = or (eval x) (eval y)
sym : {X : Set} {a b : X} a ≡ b b ≡ a
sym refl = refl
doubleNeg : (b : Bool) not (not b) ≡ b
doubleNeg true = refl
doubleNeg false = refl
evalDoubleNeg : (f : BF) eval (Not (Not f)) ≡ eval f
evalDoubleNeg f = doubleNeg (eval f)
removeTopLevelDoubleNeg : BF -> BF
removeTopLevelDoubleNeg (Not (Not x)) = removeTopLevelDoubleNeg x
removeTopLevelDoubleNeg x = x
rtldnSound : (f : BF) eval (removeTopLevelDoubleNeg f) ≡ eval f
rtldnSound True = refl
rtldnSound False = refl
-- rtldnSound (Not (Not p)) rewrite rtldnSound p = sym (doubleNeg (eval p))
rtldnSound (Not (Not p)) with eval (removeTopLevelDoubleNeg p) | rtldnSound p
... | ._ | refl = sym (doubleNeg (eval p))
rtldnSound (Not True) = refl
rtldnSound (Not False) = refl
rtldnSound (Not (And p q)) = refl
rtldnSound (Not (Or p q)) = refl
rtldnSound (And x y) = refl
rtldnSound (Or x y) = refl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment