{-# OPTIONS --cubical --safe #-} module Algebra.Construct.Free.Semilattice.Extensionality where open import Prelude open import Algebra.Construct.Free.Semilattice.Definition open import Algebra.Construct.Free.Semilattice.Eliminators open import Algebra.Construct.Free.Semilattice.Relation.Unary open import Algebra.Construct.Free.Semilattice.Union open import HITs.PropositionalTruncation.Sugar import HITs.PropositionalTruncation as PropTrunc open import HITs.PropositionalTruncation.Properties open import Path.Reasoning infix 4 _↭_ _↭_ : 𝒦 A → 𝒦 A → Type _ xs ↭ ys = ∀ x → x ∈ xs ↔ x ∈ ys in-cons : (x : A) (xs : 𝒦 A) → x ∈ xs → xs ≡ x ∷ xs in-cons = λ x → ∥ in-cons′ x ∥⇓ where in-cons′ : ∀ x → xs ∈𝒦 A ⇒∥ (x ∈ xs → xs ≡ x ∷ xs) ∥ ∥ in-cons′ y ∥-prop {xs} p q i y∈xs = trunc xs (y ∷ xs) (p y∈xs) (q y∈xs) i ∥ in-cons′ y ∥[] () ∥ in-cons′ y ∥ x ∷ xs ⟨ Pxs ⟩ = PropTrunc.rec (trunc _ _) λ { (inl x≡y) → sym (dup x xs) ; cong (_∷ x ∷ xs) x≡y ; (inr y∈xs) → cong (x ∷_) (Pxs y∈xs) ; com x y xs } subset-ext : ∀ xs ys → (∀ (x : A) → x ∈ xs → x ∈ ys) → xs ∪ ys ≡ ys subset-ext = ∥ subset-ext′ ∥⇓ where subset-ext′ : xs ∈𝒦 A ⇒∥ (∀ ys → (∀ x → x ∈ xs → x ∈ ys) → xs ∪ ys ≡ ys) ∥ ∥ subset-ext′ ∥-prop {xs} p q i ys perm = trunc (xs ∪ ys) ys (p ys perm) (q ys perm) i ∥ subset-ext′ ∥[] _ _ = refl ∥ subset-ext′ ∥ x ∷ xs ⟨ Pxs ⟩ ys perm = (x ∷ xs) ∪ ys ≡⟨ cons-distrib-∪ x xs ys ⟩ xs ∪ (x ∷ ys) ≡⟨ Pxs (x ∷ ys) (λ y y∈xs → ∣ inr (perm y ∣ inr y∈xs ∣) ∣) ⟩ x ∷ ys ≡˘⟨ in-cons x ys (perm x ∣ inl refl ∣) ⟩ ys ∎ extensional : (xs ys : 𝒦 A) → (xs ↭ ys) → xs ≡ ys extensional xs ys xs↭ys = xs ≡˘⟨ subset-ext ys xs (inv ∘ xs↭ys) ⟩ ys ∪ xs ≡⟨ ∪-comm ys xs ⟩ xs ∪ ys ≡⟨ subset-ext xs ys (fun ∘ xs↭ys) ⟩ ys ∎