open import Paths
open import Logic::HLevels
open import Algebra::Formula

open data FMSet (A : Type)
| nil
| infixr :< A (FMSet A) tighter =
| comm (x y : A) (xs : FMSet A) : x :< y :< xs = y :< x :< xs
| trunc : isSet (FMSet A)

variable A : Type

def infixr ++ : BinOp (FMSet A)
| nil, ysys
| x :< xs, ysx :< xs ++ ys
| comm x y xs i, yscomm x y (xs ++ ys) i
| trunc xs zs p q i j, ystrunc (xs ++ ys) (zs ++ ys) (pmap (++ ys) p) (pmap (++ ys) q) i j
tighter :< =