\import Logic \import Meta \import Paths \data Bool | false | true \func So (b : Bool) : \Prop | true => \Sigma | false => Empty \where { \lemma fromSo {b : Bool} (s : So b) : b = true \elim b | true => idp \lemma toSo {b : Bool} (p : b = true) : So b => transportInv So p () } \func not (b : Bool) : Bool | true => false | false => true \lemma not-isInv {b : Bool} : not (not b) = b => cases b idp \func if {A : \Type} (b : Bool) (then else : A) : A \elim b | true => then | false => else \func \infixl 3 and (x y : Bool) : Bool \elim x | true => y | false => false \where { \lemma toSigma {x y : Bool} (p : x and y = true) : \Sigma (x = true) (y = true) \elim x, y, p | true, true, _ => (idp,idp) \lemma fromSigma {x y : Bool} (p : \Sigma (x = true) (y = true)) : x and y = true \elim x, y, p | true, true, _ => idp | false, _, ((),_) | _, false, (_,()) } \func \infixl 2 or (x y : Bool) : Bool \elim x | true => true | false => y \where { \lemma toOr {x y : Bool} (p : x or y = true) : (x = true) || (y = true) \elim x, y, p | true, _, _ => byLeft idp | _, true, _ => byRight idp \lemma fromOr {x y : Bool} (p : (x = true) || (y = true)) : x or y = true \elim x, y, p | true, _, _ => idp | false, true, _ => idp | false, false, byLeft () | false, false, byRight () } \lemma true/=false (p : true = false) : Empty => transport So p ()