{-# OPTIONS --cubical #-}
module FMSetAll where
open import Cubical.Foundations.Everything
open import Cubical.Functions.Logic using (_⊓_; ⊤ ; ⊓-comm ; ⊓-assoc ; ⊓-identityˡ)
open import Cubical.HITs.FiniteMultiset
open import Cubical.Data.Unit.Base
module _ {n m : Level} {A : Type n} {P : A → hProp m} where
private
module P♯ = FMSetUniversal isSetHProp (⊤ {m}) _⊓_ ⊓-comm ⊓-assoc ⊓-identityˡ P
opaque
allI : FMSet A → hProp m
allI = P♯.f-extend
uncons-A : {x : A} {xs : FMSet A} → ⟨ allI (x ∷ xs) ⟩ → ⟨ P x ⊓ allI xs ⟩
uncons-A {x = x} {xs = xs} = subst ⟨_⟩ $ P♯.f-extend-cons x xs
infixr 5 _∷-A_
_∷-A_ : {x : A} {xs : FMSet A} → ⟨ P x ⟩ → ⟨ allI xs ⟩ → ⟨ allI (x ∷ xs) ⟩
_∷-A_ {x = x} {xs = xs} Px all-xs = subst ⟨_⟩ (sym $ P♯.f-extend-cons x xs) (Px , all-xs)
[]-A : ⟨ allI [] ⟩
[]-A = tt*
infixr 30 _++-A_
_++-A_ : {xs ys : FMSet A} → ⟨ allI xs ⟩ → ⟨ allI ys ⟩ → ⟨ allI (xs ++ ys) ⟩
_++-A_ {xs = xs} {ys = ys} axs ays = subst ⟨_⟩ (sym (P♯.f-extend-++ xs ys)) (axs , ays)
All : {n m : Level} {A : Type n} (P : A → hProp m) → FMSet A → Type m
All P xs = ⟨ allI {P = P} xs ⟩
mapAll : {n m : Level} {A : Type n} (P : A → hProp m) (Q : A → hProp m) (P⇒Q : ∀ {x} → ⟨ P x ⟩ → ⟨ Q x ⟩) → ∀ {xs} → All P xs → All Q xs
mapAll P Q P→Q {xs = xs} = ElimProp.f
{B = λ xs → All P xs → All Q xs}
(λ {xs = xs1} → isPropΠ λ _ → snd $ allI {P = Q} xs1)
(λ _ → []-A)
(λ x {xs1} IH allx∷xs1 → let ( Px , allPxs1 ) = uncons-A allx∷xs1 in
P→Q Px ∷-A IH allPxs1) xs