{-# OPTIONS --safe #-} module Multiset.FCM.Order where open import Multiset.Prelude open import Multiset.FCM.Base as M open import Cubical.Foundations.HLevels open import Cubical.Foundations.Function using (flip) open import Cubical.Foundations.Structure open import Cubical.Functions.Logic as Logic open import Cubical.Data.Sigma as Simga open import Cubical.HITs.PropositionalTruncation as PT using ( ∣_∣₁ ; ∥_∥₁ ; isPropPropTrunc ) module _ {ℓ : Level} {X : Type ℓ} where -- ⊕-cancel : ∀ xs {ys₁ ys₂ : M X} -- → xs ⊕ ys₁ ≡ xs ⊕ ys₂ -- → ys₁ ≡ ys₂ -- ⊕-cancel xs {ys₁} {ys₂} = M.ind {P = λ xs → ∀ ys₁ ys₂ → xs ⊕ ys₁ ≡ xs ⊕ ys₂ → ys₁ ≡ ys₂} -- (λ _ → isPropΠ3 λ _ _ _ → isSetM _ _) -- {! !} {! !} {! !} xs ys₁ ys₂ _⊆′_ : M X → M X → Type ℓ xs ⊆′ ys = Σ[ vs ∈ M X ] xs ⊕ vs ≡ ys -- isProp-⊆′ : ∀ xs ys → isProp (xs ⊆′ ys) -- isProp-⊆′ xs ys = {! !} _⊆ₚ_ : M X → M X → hProp ℓ -- xs ⊆ₚ ys = ∃[ zs ∶ M X ] (((xs ⊕ zs) ≡ ys) , isSetM _ _) xs ⊆ₚ ys = ∃[ zs ∶ M X ] (xs ⊕ zs) ≡ₚ ys _⊆_ : M X → M X → Type ℓ xs ⊆ ys = ⟨ xs ⊆ₚ ys ⟩ isProp-⊆ : ∀ {xs ys} → isProp (xs ⊆ ys) isProp-⊆ = str (_ ⊆ₚ _) _⊇ₚ_ : M X → M X → hProp ℓ _⊇ₚ_ = flip _⊆ₚ_ _⊇_ : M X → M X → Type ℓ _⊇_ = flip _⊆_ infix 80 _⊆_ _⊇_ infix 80 _⊆ₚ_ _⊇ₚ_ ⊆-refl : ∀ {xs : M X} → xs ⊆ xs ⊆-refl {xs = xs} = ∣ ε , ∣ unit' xs ∣₁ ∣₁ ⊆-trans : ∀ {xs ys zs} → xs ⊆ ys → ys ⊆ zs → xs ⊆ zs ⊆-trans {xs = xs} {ys} {zs} = PT.rec2 isProp-⊆ goal where step : ∀ {us vs} → xs ⊕ us ≡ ys → ys ⊕ vs ≡ zs → xs ⊆ zs step {us} {vs} p q = ∣ us ⊕ vs , ∣ r ∣₁ ∣₁ where r = xs ⊕ (us ⊕ vs) ≡⟨ assoc _ _ _ ⟩ (xs ⊕ us) ⊕ vs ≡⟨ cong (_⊕ vs) p ⟩ ys ⊕ vs ≡⟨ q ⟩ zs ∎ goal : Σ[ us ∈ M X ] ∥ xs ⊕ us ≡ ys ∥₁ → Σ[ vs ∈ M X ] ∥ ys ⊕ vs ≡ zs ∥₁ → xs ⊆ zs goal (us , p-us) (vs , p-vs) = PT.rec2 isProp-⊆ step p-us p-vs -- ε-unit-unique : ∀ {xs : M X} es -- → xs ⊕ es ≡ xs -- → es ≡ ε -- ε-unit-unique {xs = xs} = M.ind {P = λ xs → ∀ es → xs ⊕ es ≡ xs → es ≡ ε} -- (λ _ → isPropΠ2 λ _ _ → isSetM _ ε) empty* {! !} {! !} xs where -- empty* : ∀ es → ε ⊕ es ≡ ε → es ≡ ε -- empty* es ε⊕es≡ε = -- es ≡⟨ sym (unit es) ⟩ -- ε ⊕ es ≡⟨ ε⊕es≡ε ⟩ -- ε ∎ -- ⊆-antisymm : ∀ {xs ys} -- → xs ⊆ ys -- → ys ⊆ xs -- → xs ≡ ys -- ⊆-antisymm {xs} {ys} = PT.rec2 (isSetM _ _) goal where -- step : ∀ {us vs} -- → xs ⊕ us ≡ ys -- → ys ⊕ vs ≡ xs -- → xs ≡ ys -- step {us} {vs} p q = {! ε-unit-unique (us ⊕ vs) us⊕vs-unitl !} where -- us⊕vs-unitl : xs ⊕ (us ⊕ vs) ≡ xs -- us⊕vs-unitl = -- xs ⊕ (us ⊕ vs) ≡⟨ assoc _ _ _ ⟩ -- (xs ⊕ us) ⊕ vs ≡⟨ cong (_⊕ vs) p ⟩ -- ys ⊕ vs ≡⟨ q ⟩ -- xs ∎ -- goal : -- Σ[ us ∈ M X ] ∥ xs ⊕ us ≡ ys ∥₁ -- → Σ[ vs ∈ M X ] ∥ ys ⊕ vs ≡ xs ∥₁ -- → xs ≡ ys -- goal (us , p-us) (vs , p-vs) = PT.rec2 (isSetM _ _) step p-us p-vs -- ⊆-η-inj : ∀ {x y : X} -- → (setX : isSet X) -- → η x ⊆ η y -- → x ≡ y -- ⊆-η-inj setX = PT.rec (setX _ _) λ (zs , p) → {! !}