load "misc.quox" namespace bool { def0 Bool : ★ = {true, false} def if-dep : 0.(P : Bool → ★) → (b : Bool) → ω.(P 'true) → ω.(P 'false) → P b = λ P b t f ⇒ case b return b' ⇒ P b' of { 'true ⇒ t; 'false ⇒ f } def if : 0.(A : ★) → (b : Bool) → ω.A → ω.A → A = λ A ⇒ if-dep (λ _ ⇒ A) def0 if-same : (A : ★) → (b : Bool) → (x : A) → if A b x x ≡ x : A = λ A b x ⇒ if-dep (λ b' ⇒ if A b' x x ≡ x : A) b (δ _ ⇒ x) (δ _ ⇒ x) def if2 : 0.(A B : ★) → (b : Bool) → ω.A → ω.B → if¹ ★ b A B = λ A B ⇒ if-dep (λ b ⇒ if¹ ★ b A B) def0 T : Bool → ★ = λ b ⇒ if¹ ★ b True False def dup! : (b : Bool) → Dup Bool b = λ b ⇒ case b return b' ⇒ Dup Bool b' of { 'true ⇒ (['true], [δ _ ⇒ ['true]]); 'false ⇒ (['false], [δ _ ⇒ ['false]]) } def dup : Bool → [ω.Bool] = λ b ⇒ case dup! b return [ω.Bool] of { (b!, p0) ⇒ drop0 (b! ≡ [b] : [ω.Bool]) [ω.Bool] p0 b! } def true-not-false : Not ('true ≡ 'false : Bool) = λ eq ⇒ coe (𝑖 ⇒ T (eq @𝑖)) 'true -- [todo] infix def and : Bool → ω.Bool → Bool = λ a b ⇒ if Bool a b 'false def or : Bool → ω.Bool → Bool = λ a b ⇒ if Bool a 'true b def not : Bool → Bool = λ b ⇒ if Bool b 'false 'true def0 not-not : (b : Bool) → not (not b) ≡ b : Bool = λ b ⇒ if-dep (λ b ⇒ not (not b) ≡ b : Bool) b (δ _ ⇒ 'true) (δ _ ⇒ 'false) } def0 Bool = bool.Bool