Definition: mset
MSet{s} ==  as,bs:|s| List//(as ≡(|s|) bs)

Lemma: mset_wf
s:DSet. (MSet{s} ∈ Type)

Lemma: mset_qinc
s:DSet. ((|s| List) ⊆MSet{s})

Definition: mk_mset
mk_mset(as) ==  as

Lemma: mk_mset_wf
s:DSet. ∀as:|s| List.  (mk_mset(as) ∈ MSet{s})

Lemma: comb_for_mk_mset_wf
λs,as,z. mk_mset(as) ∈ s:DSet ⟶ as:(|s| List) ⟶ (↓True) ⟶ MSet{s}

Lemma: all_mset_elim
s:DSet. ∀F:MSet{s} ⟶ ℙ.  ((∀a:MSet{s}. SqStable(F[a]))  (∀a:MSet{s}. F[a] ⇐⇒ ∀a:|s| List. F[mk_mset(a)]))

Definition: null_mset
0{s} ==  []

Lemma: null_mset_wf
s:DSet. (0{s} ∈ MSet{s})

Definition: mset_count
#∈ ==  #∈ a

Lemma: mset_count_wf
s:DSet. ∀x:|s|. ∀a:MSet{s}.  (x #∈ a ∈ ℕ)

Lemma: comb_for_mset_count_wf
λs,x,a,z. (x #∈ a) ∈ s:DSet ⟶ x:|s| ⟶ a:MSet{s} ⟶ (↓True) ⟶ ℕ

Definition: finite_set
FiniteSet{s} ==  {a:MSet{s}| ∀x:|s|. ((x #∈ a) ≤ 1)} 

Lemma: finite_set_wf
[s:DSet]. (FiniteSet{s} ∈ Type)

Lemma: mk_mset_wf2
s:DSet. ∀as:DisList{s}.  (mk_mset(as) ∈ FiniteSet{s})

Lemma: all_fset_elim
s:DSet. ∀F:MSet{s} ⟶ ℙ.
  ((∀a:FiniteSet{s}. SqStable(F[a]))  (∀a:FiniteSet{s}. F[a] ⇐⇒ ∀a:DisList{s}. F[mk_mset(a)]))

Definition: mset_inj
mset_inj{s}(x) ==  mk_mset([x])

Lemma: mset_inj_wf
s:DSet. ∀x:|s|.  (mset_inj{s}(x) ∈ MSet{s})

Lemma: comb_for_mset_inj_wf
λs,x,z. mset_inj{s}(x) ∈ s:DSet ⟶ x:|s| ⟶ (↓True) ⟶ MSet{s}

Definition: mset_sum
==  b

Lemma: mset_sum_wf
s:DSet. ∀a,b:MSet{s}.  (a b ∈ MSet{s})

Lemma: comb_for_mset_sum_wf
λs,a,b,z. (a b) ∈ s:DSet ⟶ a:MSet{s} ⟶ b:MSet{s} ⟶ (↓True) ⟶ MSet{s}

Lemma: mset_sum_comm
s:DSet. Comm(MSet{s};λa,b. (a b))

Lemma: mset_sum_assoc
s:DSet. Assoc(MSet{s};λa,b. (a b))

Lemma: mk_mset_cons
s:DSet. ∀a:|s|. ∀as:|s| List.  (mk_mset([a as]) (mset_inj{s}(a) mk_mset(as)) ∈ MSet{s})

Definition: eq_mset
eq_mset{s}(a,b) ==  a ≡b b

Lemma: eq_mset_wf
s:DSet. ∀a,b:MSet{s}.  (eq_mset{s}(a,b) ∈ 𝔹)

Lemma: assert_of_eq_mset
s:DSet. ∀a,b:MSet{s}.  (↑eq_mset{s}(a,b) ⇐⇒ b ∈ MSet{s})

Lemma: equal_mset_elim
s:DSet. ∀as,bs:|s| List.  (mk_mset(as) mk_mset(bs) ∈ MSet{s} ⇐⇒ as ≡(|s|) bs)

Definition: mset_mon
mset_mon{s} ==  <MSet{s}, λx,y. eq_mset{s}(x,y), λx,y. tt, λx,y. (x y), 0{s}, λx.x>

Lemma: mset_mon_wf
s:DSet. (mset_mon{s} ∈ AbMon)

Lemma: mset_sum_ident_r
s:DSet. ∀a:MSet{s}.  ((a 0{s}) a ∈ MSet{s})

Definition: mset_mem
x ∈b ==  x ∈b a

Lemma: mset_mem_wf
s:DSet. ∀x:|s|. ∀a:MSet{s}.  (x ∈b a ∈ 𝔹)

Lemma: comb_for_mset_mem_wf
λs,x,a,z. (x ∈b a) ∈ s:DSet ⟶ x:|s| ⟶ a:MSet{s} ⟶ (↓True) ⟶ 𝔹

Lemma: mset_mem_null_lemma
x,s:Top.  (x ∈b 0{s} ff)

Lemma: mset_mem_inj_sum_lemma
a,y,x,s:Top.  (x ∈b mset_inj{s}(y) (y (=bx) ∨b(x ∈b a))

Lemma: mset_mem_iff_count_nzero
s:DSet. ∀x:|s|. ∀a:MSet{s}.  (↑(x ∈b a) ⇐⇒ (x #∈ a) > 0)

Definition: ftype
FTy{s}(a) ==  {x:|s|| ↑(x ∈b a)} 

Lemma: ftype_wf
s:DSet. ∀a:MSet{s}.  (FTy{s}(a) ∈ Type)

Lemma: ftype_properties
s:DSet. ∀a:MSet{s}. ∀x:FTy{s}(a).  (↑(x ∈b a))

Lemma: mset_mon_for_elim
s:DSet. ∀T:Type. ∀f:T ⟶ (|s| List). ∀as:T List.
  ((For{mset_mon{s}} x ∈ as. mk_mset(f[x])) mk_mset(For{<List, @>x ∈ as. f[x]) ∈ MSet{s})

Definition: mset_for
msFor{m} x ∈ a. f[x] ==  For{m} x ∈ a. f[x]

Lemma: mset_for_wf
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀a:MSet{s}.  (msFor{g} x ∈ a. f[x] ∈ |g|)

Lemma: comb_for_mset_for_wf
λs,g,f,a,z. (msFor{g} x ∈ a. f[x]) ∈ s:DSet ⟶ g:IAbMonoid ⟶ f:(|s| ⟶ |g|) ⟶ a:MSet{s} ⟶ (↓True) ⟶ |g|

Lemma: mset_for_functionality
s:DSet. ∀g:IAbMonoid. ∀f,f':|s| ⟶ |g|. ∀a,a':MSet{s}.
  ((a a' ∈ MSet{s})
   (∀x:|s|. ((↑(x ∈b a))  (f[x] f'[x] ∈ |g|)))
   ((msFor{g} x ∈ a. f[x]) (msFor{g} x ∈ a'. f'[x]) ∈ |g|))

Lemma: mset_for_mset_sum
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀a,b:MSet{s}.
  ((msFor{g} x ∈ b. f[x]) ((msFor{g} x ∈ a. f[x]) (msFor{g} x ∈ b. f[x])) ∈ |g|)

Lemma: mset_for_mset_inj
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀u:|s|.  ((msFor{g} x ∈ mset_inj{s}(u). f[x]) f[u] ∈ |g|)

Lemma: mset_for_null_lemma
f,g,s:Top.  (msFor{g} x ∈ 0{s}. f[x] e)

Lemma: mset_for_inj_lemma
f,a,y,g,s:Top.  (msFor{g} x ∈ mset_inj{s}(y) a. f[x] f[y] (msFor{g} x ∈ a. f[x]))

Lemma: mset_for_elim_lemma
F,as,g,s:Top.  (msFor{g} x ∈ mk_mset(as). F[x] For{g} x ∈ as. F[x])

Lemma: mset_for_of_id
s:DSet. ∀g:IAbMonoid. ∀a:MSet{s}.  ((msFor{g} x ∈ a. e) e ∈ |g|)

Lemma: mset_for_of_op
g:IAbMonoid. ∀s:DSet. ∀e,f:|s| ⟶ |g|. ∀a:MSet{s}.
  ((msFor{g} x ∈ a. (e[x] f[x])) ((msFor{g} x ∈ a. e[x]) (msFor{g} x ∈ a. f[x])) ∈ |g|)

Lemma: dist_hom_over_mset_for
s:DSet. ∀m,n:IAbMonoid. ∀f:MonHom(m,n). ∀a:MSet{s}. ∀g:|s| ⟶ |m|.
  ((f (msFor{m} x ∈ a. g[x])) (msFor{n} x ∈ a. (f g[x])) ∈ |n|)

Lemma: mset_for_swap
g:IAbMonoid. ∀s,s':DSet. ∀f:|s| ⟶ |s'| ⟶ |g|. ∀a:MSet{s}. ∀b:MSet{s'}.
  ((msFor{g} x ∈ a. msFor{g} y ∈ b. f[x;y]) (msFor{g} y ∈ b. msFor{g} x ∈ a. f[x;y]) ∈ |g|)

Lemma: bmsexists_char
s:DSet. ∀f:|s| ⟶ 𝔹. ∀a:MSet{s}.  ((∃x:|s|. ((↑(x ∈b a)) ∧ (↑f[x])))  (↑(∃b{s} x ∈ a. f[x])))

Lemma: bmsexists_char_a
s:DSet. ∀f:|s| ⟶ 𝔹. ∀a:MSet{s}.  ((↑(∃b{s} x ∈ a. f[x]))  (↓∃x:|s|. ((↑(x ∈b a)) ∧ (↑f[x]))))

Lemma: bmsexists_char_a_rw
s:DSet. ∀f:|s| ⟶ 𝔹. ∀a:MSet{s}.  {(↑(∃b{s} x ∈ a. f[x]))  (↓∃x:|s|. ((↑(x ∈b a)) ∧ (↑f[x])))}

Lemma: bmsexists_char_rw
s:DSet. ∀f:|s| ⟶ 𝔹. ∀a:MSet{s}.  {(∃x:|s|. ((↑(x ∈b a)) ∧ (↑f[x])))  (↑(∃b{s} x ∈ a. f[x]))}

Definition: mset_size
size{s}(a) ==  ||a||

Lemma: mset_size_wf
s:DSet. ∀a:MSet{s}.  (size{s}(a) ∈ ℤ)

Lemma: non_neg_mset_size
s:DSet. ∀a:MSet{s}.  (size{s}(a) ≥ )

Lemma: mset_fact
s:DSet. ∀a:MSet{s}.  (a (msFor{mset_mon{s}} x ∈ a. mset_inj{s}(x)) ∈ MSet{s})

Definition: free_abmonoid
FAbMon(S) ==
  mon:AbMon
  × inj:|S| ⟶ |mon|
  × (mon':AbMon ⟶ f':(|S| ⟶ |mon'|) ⟶ {!g:MonHom(mon,mon') (g inj) f' ∈ (|S| ⟶ |mon'|)})

Lemma: free_abmonoid_wf
S:DSet. (FAbMon(S) ∈ 𝕌')

Definition: free_abmon_mon
f.mon ==  fst(f)

Lemma: free_abmon_mon_wf
S:DSet. ∀f:FAbMon(S).  (f.mon ∈ AbMon)

Definition: free_abmon_inj
f.inj ==  fst(snd(f))

Lemma: free_abmon_inj_wf
S:DSet. ∀f:FAbMon(S).  (f.inj ∈ |S| ⟶ |f.mon|)

Definition: free_abmon_umap
f.umap ==  snd(snd(f))

Lemma: free_abmon_umap_wf
S:DSet. ∀f:FAbMon(S).
  (f.umap ∈ mon':AbMon ⟶ f':(|S| ⟶ |mon'|) ⟶ {!g:MonHom(f.mon,mon') (g f.inj) f' ∈ (|S| ⟶ |mon'|)})

Definition: mset_fmon
mset_fmon(s) ==  <mset_mon{s}, λx:|s|. mset_inj{s}(x), λm.(λf:|s| ⟶ |m|. λy:MSet{s}. msFor{m} z ∈ y. (f z))>

Lemma: mset_fmon_wf
s:DSet. (mset_fmon(s) ∈ FAbMon(s))

Lemma: mset_mem_char
s:DSet. ∀x:|s|. ∀a:MSet{s}.  x ∈b = ∃b{s} y ∈ a. (y (=bx)

Definition: mset_map
msmap{s,s'}(f;a) ==  msFor{mset_mon{s'}} x ∈ a. mset_inj{s'}(f x)

Lemma: mset_map_wf
s,s':DSet. ∀f:|s| ⟶ |s'|. ∀a:MSet{s}.  (msmap{s,s'}(f;a) ∈ MSet{s'})

Lemma: comb_for_mset_map_wf
λs,s',f,a,z. msmap{s,s'}(f;a) ∈ s:DSet ⟶ s':DSet ⟶ f:(|s| ⟶ |s'|) ⟶ a:MSet{s} ⟶ (↓True) ⟶ MSet{s'}

Lemma: mset_map_char
s,s':DSet. ∀f:|s| ⟶ |s'|. ∀as:|s| List.  (msmap{s,s'}(f;mk_mset(as)) mk_mset(map(f;as)) ∈ MSet{s'})

Lemma: mset_map_id
s:DSet. ∀a:MSet{s}.  (msmap{s,s}(Id{|s|};a) a ∈ MSet{s})

Definition: mset_union
a ⋃ ==  lmax(s;a;b)

Lemma: mset_union_wf
s:DSet. ∀a,b:MSet{s}.  (a ⋃ b ∈ MSet{s})

Definition: mset_inter
a ⋂==  lmin(s;a;b)

Lemma: mset_inter_wf
s:DSet. ∀a,b:MSet{s}.  (a ⋂b ∈ MSet{s})

Definition: mset_diff
==  b

Lemma: mset_diff_wf
s:DSet. ∀a,b:MSet{s}.  (a b ∈ MSet{s})

Lemma: eq_mset_iff_eq_counts
s:DSet. ∀a,b:MSet{s}.  (a b ∈ MSet{s} ⇐⇒ ∀x:|s|. ((x #∈ a) (x #∈ b) ∈ ℤ))

Lemma: mset_count_inj
s:DSet. ∀a,x:|s|.  ((x #∈ mset_inj{s}(a)) b2i(a (=bx) ∈ ℤ)

Lemma: mset_count_sum
s:DSet. ∀as,bs:MSet{s}. ∀c:|s|.  ((c #∈ (as bs)) ((c #∈ as) (c #∈ bs)) ∈ ℤ)

Lemma: mset_count_union
s:DSet. ∀as,bs:MSet{s}. ∀c:|s|.  ((c #∈ (as ⋃ bs)) imax(c #∈ as;c #∈ bs) ∈ ℤ)

Lemma: mset_union_assoc
s:DSet. ∀a,b,c:MSet{s}.  ((a ⋃ (b ⋃ c)) ((a ⋃ b) ⋃ c) ∈ MSet{s})

Lemma: mset_union_comm
s:DSet. ∀a,b:MSet{s}.  ((a ⋃ b) (b ⋃ a) ∈ MSet{s})

Lemma: mset_union_ident_l
s:DSet. ∀a:MSet{s}.  ((0{s} ⋃ a) a ∈ MSet{s})

Lemma: mset_union_ident_r
s:DSet. ∀a:MSet{s}.  ((a ⋃ 0{s}) a ∈ MSet{s})

Definition: mset_union_mon
<MSet{s},⋃,0> ==  <MSet{s}, λx,y. eq_mset{s}(x,y), λx,y. tt, λx,y. (x ⋃ y), 0{s}, λx.x>

Lemma: mset_union_mon_wf
s:DSet. (<MSet{s},⋃,0> ∈ AbMon)

Lemma: mset_count_inter
s:DSet. ∀as,bs:MSet{s}. ∀c:|s|.  ((c #∈ (as ⋂bs)) imin(c #∈ as;c #∈ bs) ∈ ℤ)

Lemma: mset_inter_assoc
s:DSet. ∀a,b,c:MSet{s}.  ((a ⋂(b ⋂c)) ((a ⋂b) ⋂c) ∈ MSet{s})

Lemma: mset_inter_comm
s:DSet. ∀a,b:MSet{s}.  ((a ⋂b) (b ⋂a) ∈ MSet{s})

Lemma: mset_count_diff
s:DSet. ∀as,bs:MSet{s}. ∀c:|s|.  ((c #∈ (as bs)) ((c #∈ as) -- (c #∈ bs)) ∈ ℤ)

Lemma: fset_mem_union
s:DSet. ∀as,bs:MSet{s}. ∀c:|s|.  c ∈b as ⋃ bs (c ∈b as) ∨b(c ∈b bs)

Lemma: mset_mem_inter
s:DSet. ∀as,bs:MSet{s}. ∀c:|s|.  c ∈b as ⋂bs (c ∈b as) ∧b (c ∈b bs)

Lemma: mset_mem_sum
s:DSet. ∀a,b:MSet{s}. ∀u:|s|.  u ∈b (u ∈b a) ∨b(u ∈b b)

Lemma: mset_mem_diff
s:DSet. ∀as:FiniteSet{s}. ∀bs:MSet{s}. ∀c:|s|.  c ∈b as bs (c ∈b as) ∧b b(c ∈b bs))

Lemma: mset_union_bor_mon_hom
s:DSet. ∀x:|s|.  IsMonHom{<MSet{s},⋃,0>,<𝔹,∨b>}(λu.(x ∈b u))

Lemma: mset_sum_bor_mon_hom
s:DSet. ∀x:|s|.  IsMonHom{mset_mon{s},<𝔹,∨b>}(λu.(x ∈b u))

Lemma: mset_mem_mon_for_union
s,s':DSet. ∀a:MSet{s}. ∀e:|s| ⟶ MSet{s'}. ∀x:|s'|.  x ∈b msFor{<MSet{s'},⋃,0>y ∈ a. e[y] = ∃b{s} y ∈ a. (x ∈b e[y])

Lemma: mset_ind_a
s:DSet. ∀Q:MSet{s} ⟶ ℙ.
  ((∀w:MSet{s}. SqStable(Q[w]))
   Q[0{s}]
   (∀x:|s|. Q[mset_inj{s}(x)])
   (∀ys,ys':MSet{s}.  (Q[ys]  Q[ys']  Q[ys ys']))
   {∀zs:MSet{s}. Q[zs]})

Lemma: mset_count_bound_for_union
s,s':DSet. ∀n:ℕ. ∀e:|s| ⟶ MSet{s'}. ∀x:|s'|.
  ((∀y:|s|. ((x #∈ e[y]) ≤ n))  (∀a:MSet{s}. ((x #∈ (msFor{<MSet{s'},⋃,0>y ∈ a. e[y])) ≤ n)))

Lemma: mset_mem_map
s,s':DSet. ∀f:|s| ⟶ |s'|. ∀x:|s|. ∀a:MSet{s}.  ((↑(x ∈b a))  (↑((f x) ∈b msmap{s,s'}(f;a))))

Definition: fset_of_mset
fset_of_mset(s;a) ==  msFor{<MSet{s},⋃,0>x ∈ a. mset_inj{s}(x)

Lemma: fset_of_mset_wf
s:DSet. ∀a:MSet{s}.  (fset_of_mset(s;a) ∈ MSet{s})

Lemma: fset_of_mset_count_bound
s:DSet. ∀a:MSet{s}. ∀c:|s|.  ((c #∈ fset_of_mset(s;a)) ≤ 1)

Lemma: fset_of_mset_wf2
s:DSet. ∀a:MSet{s}.  (fset_of_mset(s;a) ∈ FiniteSet{s})

Lemma: fset_of_mset_mem
s:DSet. ∀a:MSet{s}. ∀c:|s|.  c ∈b fset_of_mset(s;a) c ∈b a

Definition: fset_map
fs-map(f, a) ==  fset_of_mset(s';msmap{s,s'}(f;a))

Lemma: fset_map_wf
s,s':DSet. ∀f:|s| ⟶ |s'|. ∀a:MSet{s}.  (fs-map(f, a) ∈ FiniteSet{s'})

Lemma: mset_mem_fmap
s,s':DSet. ∀f:|s| ⟶ |s'|. ∀x:|s|. ∀a:MSet{s}.  ((↑(x ∈b a))  (↑((f x) ∈b fs-map(f, a))))

Definition: bsubmset
a ⊆b ==  bsublist(s;a;b)

Lemma: bsubmset_wf
s:DSet. ∀a,b:MSet{s}.  (a ⊆b b ∈ 𝔹)

Definition: bsupmset
a ⊇b==  b ⊆b a

Lemma: bsupmset_wf
s:DSet. ∀a,b:MSet{s}.  (a ⊇bb ∈ 𝔹)

Lemma: bsubmset_elim
s:DSet. ∀as,bs:|s| List.  mk_mset(as) ⊆b mk_mset(bs) bsublist(s;as;bs)

Lemma: bsubmset_weakening
s:DSet. ∀a,b:MSet{s}.  ((a b ∈ MSet{s})  (↑(a ⊆b b)))

Lemma: bsubmset_transitivity
s:DSet. ∀a,b,c:MSet{s}.  ((↑(a ⊆b b))  (↑(b ⊆b c))  (↑(a ⊆b c)))

Lemma: bsubmset_functionality_wrt_bsubmset
s:DSet. ∀a,a',b,b':MSet{s}.  ((↑(a ⊇bb))  (↑(a' ⊆b b'))  (↑(a ⊆b a' b (b ⊆b b'))))

Lemma: count_bsubmset
s:DSet. ∀a,b:MSet{s}.  (↑(a ⊆b b) ⇐⇒ ∀x:|s|. ((x #∈ a) ≤ (x #∈ b)))

Lemma: fset_properties
s:DSet. ∀a:FiniteSet{s}.  {∀x:|s|. ((x #∈ a) ≤ 1)}

Lemma: mem_bsubmset
s:DSet. ∀a:FiniteSet{s}. ∀b:MSet{s}.  (↑(a ⊆b b) ⇐⇒ ∀x:|s|. ((↑(x ∈b a))  (↑(x ∈b b))))

Lemma: mset_mem_functionality_wrt_bsubmset
s:DSet. ∀a:FiniteSet{s}. ∀b:MSet{s}. ∀u:|s|.  ((↑(a ⊆b b))  (↑(u ∈b b (u ∈b b))))

Lemma: detach_msubset
s:DSet. ∀a,b:MSet{s}.  ((↑(a ⊆b b))  (b ((b a) a) ∈ MSet{s}))

Lemma: comb_for_mk_mset_wf2
λs,as,z. mk_mset(as) ∈ s:DSet ⟶ as:DisList{s} ⟶ (↓True) ⟶ FiniteSet{s}

Lemma: null_mset_wf_f
s:DSet. (0{s} ∈ FiniteSet{s})

Lemma: mset_union_wf_f
s:DSet. ∀a,b:FiniteSet{s}.  (a ⋃ b ∈ FiniteSet{s})

Lemma: mset_inter_wf_f
s:DSet. ∀a,b:FiniteSet{s}.  (a ⋂b ∈ FiniteSet{s})

Lemma: mset_diff_wf_f
s:DSet. ∀a,b:FiniteSet{s}.  (a b ∈ FiniteSet{s})

Lemma: mset_inj_wf_f
s:DSet. ∀x:|s|.  (mset_inj{s}(x) ∈ FiniteSet{s})

Lemma: comb_for_mset_inj_wf_f
λs,x,z. mset_inj{s}(x) ∈ s:DSet ⟶ x:|s| ⟶ (↓True) ⟶ FiniteSet{s}

Definition: ffor
ffor(b0;b1;up;zs) ==  ffor,zs. case zs of [] => b0 z::zs' => up [z] zs' (b1 z) (ffor zs') esac) zs

Lemma: ffor_wf
T:Type. ∀Q:(T List) ⟶ Type. ∀b0:Q[[]]. ∀b1:∀x:T. Q[[x]]. ∀up:∀ys,ys':T List.  (Q[ys]  Q[ys']  Q[ys ys']).
zs:T List.
  (ffor(b0;b1;up;zs) ∈ Q[zs])

Lemma: mset_for_when_none
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀b:|s| ⟶ 𝔹. ∀as:MSet{s}.
  ((∀x:|s|. ((↑(x ∈b as))  (¬↑b[x])))  ((msFor{g} x ∈ as. when b[x]. f[x]) e ∈ |g|))

Lemma: mset_for_when_unique
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀b:|s| ⟶ 𝔹. ∀u:|s|.
  ((↑b[u])
   (∀as:MSet{s}
        ((∀x:|s|. ((x #∈ as) ≤ 1))
         (↑(u
           ∈b as))
         (∀v:|s|. ((↑b[v])  (↑(v ∈b as))  (v u ∈ |s|)))
         ((msFor{g} x ∈ as. when b[x]. f[x]) f[u] ∈ |g|))))

Lemma: fset_for_when_unique
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀b:|s| ⟶ 𝔹. ∀u:|s|.
  ((↑b[u])
   (∀as:FiniteSet{s}
        ((↑(u
         ∈b as))
         (∀v:|s|. ((↑b[v])  (↑(v ∈b as))  (v u ∈ |s|)))
         ((msFor{g} x ∈ as. when b[x]. f[x]) f[u] ∈ |g|))))

Lemma: fset_for_when_eq
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀e:|s|. ∀as:FiniteSet{s}.
  ((↑(e ∈b as))  ((msFor{g} x ∈ as. when (=be. f[x]) f[e] ∈ |g|))

Lemma: mset_for_when_dom_shift
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀c:|s| ⟶ 𝔹. ∀p,q:MSet{s}.
  ((↑(p ⊆b q))
   (∀x:|s|. ((↑(x ∈b p))  (¬↑c[x])))
   ((msFor{g} x ∈ p. when c[x]. f[x]) (msFor{g} x ∈ q. when c[x]. f[x]) ∈ |g|))

Lemma: mset_for_dom_shift
s:DSet. ∀g:IAbMonoid. ∀f:|s| ⟶ |g|. ∀p,q:MSet{s}.
  ((↑(p ⊆b q))
   (∀x:|s|. ((↑(x ∈b p))  (f[x] e ∈ |g|)))
   ((msFor{g} x ∈ p. f[x]) (msFor{g} x ∈ q. f[x]) ∈ |g|))

Lemma: mset_for_functionality_wrt_bsubmset
s:DSet. ∀g:IAbMonoid. ∀f,f':|s| ⟶ |g|. ∀p,q:MSet{s}.
  ((∀x:|s|. ((↑(x ∈b p))  (f'[x] e ∈ |g|)))
   (↑(p ⊆b q))
   (∀x:|s|. ((↑(x ∈b p))  (f[x] f'[x] ∈ |g|)))
   ((msFor{g} x ∈ p. f[x]) (msFor{g} x ∈ q. f'[x]) ∈ |g|))

Definition: mset_prod
a × ==  msFor{<MSet{g↓set},⋃,0>u ∈ a. msFor{<MSet{g↓set},⋃,0>v ∈ b. mset_inj{g↓set}(u v)

Lemma: mset_prod_wf
g:DMon. ∀a,b:MSet{g↓set}.  (a × b ∈ MSet{g↓set})

Lemma: mset_prod_wf2
g:DMon. ∀a,b:FiniteSet{g↓set}.  (a × b ∈ FiniteSet{g↓set})

Lemma: mset_prod_mem
g:DMon. ∀a,b:MSet{g↓set}. ∀u:|g|.  u ∈b a × = ∃b{g↓set} v ∈ a. ∃b{g↓set} w ∈ b. (u =b (v w))

Lemma: prod_in_mset_prod
g:DMon. ∀a,b:MSet{g↓set}. ∀u,v:|g|.  ((↑(u ∈b a))  (↑(v ∈b b))  (↑((u v) ∈b a × b)))



Home Index