open import bool open import bool-relations using (transitive ; total) module braun-prop (A : Set) (_≀A_ : A β†’ A β†’ 𝔹) (≀A-trans : transitive _≀A_) (≀A-total : total _≀A_) where open import braun-tree A _≀A_ open import eq open import nat open import logic data _β‰ˆβ‚œ_ : βˆ€ {n : β„•} β†’ braun-tree n β†’ braun-tree n β†’ Set where β‰ˆβ‚œ-empty : bt-empty β‰ˆβ‚œ bt-empty β‰ˆβ‚œ-node : βˆ€ {n m} {l l' : braun-tree n} { r r' : braun-tree m} { p p' x} β†’ l β‰ˆβ‚œ l' β†’ r β‰ˆβ‚œ r' β†’ (bt-node x l r p) β‰ˆβ‚œ (bt-node x l' r' p') isProp : βˆ€ {β„“} β†’ Set β„“ β†’ Set β„“ isProp A = (x y : A) β†’ x ≑ y isSet : βˆ€ {β„“} β†’ Set β„“ β†’ Set β„“ isSet A = (x y : A) β†’ isProp (x ≑ y) isProp-⊎ : βˆ€ {X Y : Set} β†’ (X ∧ Y β†’ βŠ₯) β†’ (isProp X) β†’ (isProp Y) β†’ isProp (X ⊎ Y) isProp-⊎ Β¬X∧Y pX pY (inj₁ x₁) (inj₁ xβ‚‚) = cong inj₁ (pX x₁ xβ‚‚) isProp-⊎ Β¬X∧Y pX pY (inj₁ x) (injβ‚‚ y) = βŠ₯-elim (Β¬X∧Y (x , y)) isProp-⊎ Β¬X∧Y pX pY (injβ‚‚ y) (inj₁ x₁) = βŠ₯-elim (Β¬X∧Y (x₁ , y)) isProp-⊎ Β¬X∧Y pX pY (injβ‚‚ y) (injβ‚‚ y₁) = cong injβ‚‚ (pY y y₁) β„•-set : isSet β„• β„•-set n .n refl refl = refl isProp-braun : βˆ€ {n m} β†’ isProp (n ≑ m ∨ n ≑ suc m) isProp-braun {n} {m} = isProp-⊎ (Ξ» {(refl , ())}) (β„•-set n m) (β„•-set n (suc m)) β‰ˆβ‚œβ†’β‰‘ : βˆ€ {n} {t₁ tβ‚‚ : braun-tree n} β†’ t₁ β‰ˆβ‚œ tβ‚‚ β†’ t₁ ≑ tβ‚‚ β‰ˆβ‚œβ†’β‰‘ β‰ˆβ‚œ-empty = refl β‰ˆβ‚œβ†’β‰‘ {_} {bt-node _ _ _ p} {bt-node _ _ _ p'} (β‰ˆβ‚œ-node lβ‰ˆβ‚œl' rβ‰ˆβ‚œr') with β‰ˆβ‚œβ†’β‰‘ lβ‰ˆβ‚œl' | β‰ˆβ‚œβ†’β‰‘ rβ‰ˆβ‚œr' | isProp-braun p p' ... | refl | refl | refl = refl