\begin{code} {-# OPTIONS --safe #-} module Examples.Bag where open import Prelude hiding (A) open import Data.Nat.Properties using (isSetNat) private variable A : Type x y : A xs ys zs : List A module _ {A : Type} where infix 4 _↺_ \end{code} %<*perm> \begin{code} data _↺_ : List A → List A → Type where swap : x ∷ y ∷ ys ↺ y ∷ x ∷ ys cons : ∀ x → xs ↺ ys → x ∷ xs ↺ x ∷ ys \end{code} %</perm> \begin{code} Bag : Type → Type \end{code} %<*bag-def> \begin{code}[inline*] Bag A = List A / _↺_ \end{code} %</bag-def> %<*bag-size> \begin{code} size : Bag A → ℕ size = rec/ isSetNat length ϕ where ϕ : (xs ys : List A) → xs ↺ ys → length xs ≡ length ys ϕ _ _ swap = refl ϕ _ _ (cons _ xs↺ys) = cong suc (ϕ _ _ xs↺ys) \end{code} %</bag-size>