module heap.libraryBool where open import Data.Bool.Base open import Data.Bool open import Data.Nat open import Data.Unit hiding (_≤_; _≤?_) open import Relation.Nullary open import Relation.Binary.PropositionalEquality open import Data.Empty open import Level open import Relation.Nullary open import Data.Bool.Base renaming (T to IsTrue) ifthenelseLemma1 : ∀ {σ} {τ} {α} → (A : Set σ ) → (P : A → Set τ ) → (Q : Set α) → (b : Bool) → (a a' : A) → (T b → P a → Q) → (¬ (T b) → P a' → Q) → P (if b then a else a') → Q ifthenelseLemma1 A P Q true a a' p p' p'' = p tt p'' ifthenelseLemma1 A P Q false a a' p p' p'' = p' (λ x → x) p'' ifthenelseLemma2 : ∀ {σ} {τ} → (A : Set σ ) → (P : A → Set τ ) → (b : Bool) → (a a' : A) → (T b → P a) → (¬ (T b) → P a') → P (if b then a else a') ifthenelseLemma2 A P true a a' p p' = p tt ifthenelseLemma2 A P false a a' p p' = p' (λ x → x) ifthenelseLemma3 : ∀ {σ} {τ} → (A : Set σ ) → (P : A → Set τ ) → (b : Bool) → (a a' : A) → ¬ (T b) → P a' → P (if b then a else a') ifthenelseLemma3 A P true a a' p q = ⊥-elim (p tt ) ifthenelseLemma3 A P false a a' p q = q ifthenelseLemma3' : ∀ {σ} {τ} → (A : Set σ ) → (P : A → Set τ ) → (b : Bool) → (a a' : A) → (T b) → P a → P (if b then a else a') ifthenelseLemma3' A P true a a' p q = q ifthenelseLemma3' A P false a a' p q = ⊥-elim p boolLem1 : (P : Bool → Set) → P true → P false → (b : Bool) → P b boolLem1 P pt pf false = pf boolLem1 P pt pf true = pt boolLem2 : ∀ {σ} (P : Bool → Set σ) → P true → (b : Bool) → T b → P b boolLem2 P pt false () boolLem2 P pt true tb = pt boolLem2double : (P : Bool → Bool → Set) → P true true → (b b' : Bool) → T b → T b' → P b b' boolLem2double P pt false b' () tb' boolLem2double P pt true false tb () boolLem2double P pt true true tb tb' = pt boolLem3 : (P : Bool → Set) → P false → (b : Bool) → ¬ (T b) → P b boolLem3 P pf false fb = pf boolLem3 P pf true fb = ⊥-elim (fb tt) σ : (a : Bool) → (b : T a → Bool) → Bool σ false b = false σ true b = b tt infix 2 σ-syntax σ-syntax : (a : Bool) → (b : T a → Bool) → Bool σ-syntax = σ syntax σ-syntax A (λ x → B) = σ[ x ∈ A ] B proj₁σ : {a : Bool} → {b : T a → Bool} → T (σ a b) → T a proj₁σ {false} () proj₁σ {true} p = tt proj₂σ : {a : Bool} → {b : T a → Bool} → (p : T (σ a b)) → T (b (proj₁σ p)) proj₂σ {false} () proj₂σ {true} p = p proj₁∧ : {a b : Bool} → T (a ∧ b) → T a proj₁∧ {false} () proj₁∧ {true} p = tt proj₂∧ : {a b : Bool} → T (a ∧ b) → T b proj₂∧ {false} () proj₂∧ {true} p = p T∧ : {a b : Bool} → T a → T b → T (a ∧ b) T∧ {false}{_} () T∧ {_}{false} _ () T∧ {true}{true} = λ _ _ → tt proj₂∧T∧ : {a b : Bool} → (ta : T a) → (tb : T b) → (proj₂∧{a}{b} (T∧{a}{b} ta tb)) ≡ tb proj₂∧T∧ {_} {false} ta tb = ⊥-elim tb proj₂∧T∧ {false} {_} ta tb = ⊥-elim ta proj₂∧T∧ {true} {true} tt tt = refl boolNegLem : {b : Bool} → ¬ (T b) → b ≡ false boolNegLem {false} p = refl boolNegLem {true} p = ⊥-elim (p tt ) bool2Nat : Bool → ℕ bool2Nat true = 1 bool2Nat false = 0 bool2Dec : (b : Bool) → Dec (IsTrue b) bool2Dec false = no (λ {()}) bool2Dec true = yes tt twoOfThree : (r s t : Bool) → Bool twoOfThree true true t = true twoOfThree true false true = true twoOfThree false true true = true twoOfThree r s t = false