{-# OPTIONS --cubical --exact-split --safe #-} module Cubical.Structures.Set.CMon.SList.Membership where open import Cubical.Foundations.Everything open import Cubical.Data.Sigma open import Cubical.Data.Nat open import Cubical.Data.Nat.Order open import Cubical.Data.Empty as ⊥ open import Cubical.Induction.WellFounded import Cubical.Data.List as L open import Cubical.Functions.Logic as L open import Cubical.HITs.PropositionalTruncation as P open import Cubical.Data.Sum as ⊎ import Cubical.Structures.Set.Mon.Desc as M import Cubical.Structures.Set.CMon.Desc as M import Cubical.Structures.Free as F open import Cubical.Structures.Sig open import Cubical.Structures.Str public open import Cubical.Structures.Tree open import Cubical.Structures.Eq open import Cubical.Structures.Arity open import Cubical.Structures.Set.Mon.List open import Cubical.Structures.Set.CMon.SList.Base as SList private variable ℓ : Level A : Type ℓ list→slist-Hom : structHom < L.List A , list-α > < SList A , slist-α > list→slist-Hom = ListDef.Free.ext listDef trunc (M.cmonSatMon slist-sat) [_] list→slist : L.List A -> SList A list→slist = list→slist-Hom .fst module Membership* {ℓ} {A : Type ℓ} (isSetA : isSet A) where open SList.Free {A = A} isSetHProp (M.⊔-MonStr-CMonSEq ℓ) よ : A -> A -> hProp ℓ よ x = λ y -> (x ≡ y) , isSetA x y ∈*Prop : A -> SList A -> hProp ℓ ∈*Prop x = (よ x) ♯ _∈*_ : A -> SList A -> Type ℓ x ∈* xs = ∈*Prop x xs .fst isProp-∈* : (x : A) -> (xs : SList A) -> isProp (x ∈* xs) isProp-∈* x xs = (∈*Prop x xs) .snd x∈*xs : ∀ x xs -> x ∈* (x ∷ xs) x∈*xs x xs = L.inl refl x∈*[x] : ∀ x -> x ∈* [ x ] x∈*[x] x = x∈*xs x [] ∈*-∷ : ∀ x y xs -> x ∈* xs -> x ∈* (y ∷ xs) ∈*-∷ x y xs p = L.inr p ∈*-++ : ∀ x xs ys -> x ∈* ys -> x ∈* (xs ++ ys) ∈*-++ x xs ys p = ElimProp.f {B = λ zs -> x ∈* (zs ++ ys)} (λ {zs} -> isProp-∈* x (zs ++ ys)) p (λ a {zs} q -> ∈*-∷ x a (zs ++ ys) q) xs ¬∈*[] : ∀ x -> (x ∈* []) -> ⊥.⊥ ¬∈*[] x = ⊥.rec* x∈*[y]→x≡y : ∀ x y -> x ∈* [ y ] -> x ≡ y x∈*[y]→x≡y x y = P.rec (isSetA x y) $ ⊎.rec (idfun _) ⊥.rec* open Membership isSetA ∈→∈* : ∀ x xs -> x ∈ xs -> x ∈* (list→slist xs) ∈→∈* x (y L.∷ ys) = P.rec (isProp-∈* x (list→slist (y L.∷ ys))) (⊎.rec L.inl (L.inr ∘ ∈→∈* x ys)) ∈*→∈ : ∀ x xs -> x ∈* (list→slist xs) -> x ∈ xs ∈*→∈ x (y L.∷ ys) = P.rec (isProp-∈ x (y L.∷ ys)) (⊎.rec L.inl (L.inr ∘ ∈*→∈ x ys))