Definition: eq_list
as =b bs ==
  
  eq_list,as,bs. case as of 
                     [] => null(bs) 
                     a::as' =>
                      case bs of [] => ff b::bs' => (a (=bb) ∧b (eq_list as' bs') esac 
                  esac) 
  as 
  bs

Lemma: eq_list_wf
s:DSet. ∀as,bs:|s| List.  (as =b bs ∈ 𝔹)

Lemma: assert_of_eq_list
s:DSet. ∀as,bs:|s| List.  (↑(as =b bs) ⇐⇒ as bs ∈ (|s| List))

Definition: dset_list
List ==  mk_dset(|s| List, λx,y. (x =b y))

Lemma: dset_list_wf
s:DSet. (s List ∈ DSet)

Definition: mem_f
mem_f(T;a;bs) ==  mem_f,bs. case bs of [] => False b::bs' => (b a ∈ T) ∨ (mem_f bs') esac) bs

Lemma: mem_f_wf
T:Type. ∀a:T. ∀bs:T List.  (mem_f(T;a;bs) ∈ ℙ)

Lemma: list_in_mem_f_list
T:Type. ∀as:T List.  (as ∈ {x:T| mem_f(T;x;as)}  List)

Definition: mon_reduce
Π as ==  reduce(*;e;as)

Lemma: mon_reduce_wf
g:IMonoid. ∀as:|g| List.  (Π as ∈ |g|)

Lemma: comb_for_mon_reduce_wf
λg,as,z. (Π as) ∈ g:IMonoid ⟶ as:(|g| List) ⟶ (↓True) ⟶ |g|

Lemma: extend_perm_over_itcomp
n:ℕ. ∀ps:Sym(n) List.  (↑{n}(Π ps) (Π map(λp.↑{n}(p);ps)) ∈ Sym(n 1))

Lemma: sym_grp_is_swaps
n:ℕ. ∀p:Sym(n).  ∃abs:(ℕn × ℕn) List. (p (Π map(λab.let a,b ab in txpose_perm(a;b);abs)) ∈ Sym(n))

Lemma: sym_grp_is_swaps_a
n:{1...}. ∀p:Sym(n).
  ∃abs:{ab:ℕn × ℕn| fst(ab) < snd(ab)}  List. (p (Π map(λab.let a,b ab in txpose_perm(a;b);abs)) ∈ Sym(n))

Lemma: perm_induction
n:ℕ. ∀Q:Sym(n) ⟶ ℙ.  (Q[id_perm()]  (∀p:Sym(n). (Q[p]  (∀i,j:ℕn.  Q[txpose_perm(i;j) p])))  {∀p:Sym(n). Q[p]})

Lemma: perm_induction_a
n:ℕ. ∀Q:Sym(n) ⟶ ℙ.  (Q[id_perm()]  (∀p:Sym(n). (Q[p]  (∀i:ℕ+n. Q[txpose_perm(i;0) p])))  {∀p:Sym(n). Q[p]})

Lemma: perm_induction_b
n:ℕ. ∀Q:Sym(n) ⟶ ℙ.  (Q[id_perm()]  (∀p:Sym(n). (Q[p]  (∀i:ℕ+n. Q[p txpose_perm(i;0)])))  {∀p:Sym(n). Q[p]})

Lemma: mon_itop_perm_invar
g:IAbMonoid. ∀n:ℕ. ∀E:ℕn ⟶ |g|. ∀p:Sym(n).  ((Π 0 ≤ j < n. E[p.f j]) (Π 0 ≤ j < n. E[j]) ∈ |g|)

Lemma: mon_reduce_append
g:IMonoid. ∀as,bs:|g| List.  ((Π as bs) ((Π as) (Π bs)) ∈ |g|)

Lemma: mon_reduce_eq_itop
g:IMonoid. ∀as:|g| List.  ((Π as) (Π 0 ≤ i < ||as||. as[i]) ∈ |g|)

Definition: mon_for
For{g} x ∈ as. f[x] ==  For{T,*,e} x ∈ as. f[x]

Lemma: mon_for_wf
g:IMonoid. ∀A:Type. ∀as:A List. ∀f:A ⟶ |g|.  (For{g} x ∈ as. f[x] ∈ |g|)

Lemma: comb_for_mon_for_wf
λg,A,as,f,z. For{g} x ∈ as. f[x] ∈ g:IMonoid ⟶ A:Type ⟶ as:(A List) ⟶ f:(A ⟶ |g|) ⟶ (↓True) ⟶ |g|

Lemma: mon_for_nil_lemma
f,g,T:Top.  (For{g} x ∈ []. f[x] e)

Lemma: mon_for_cons_lemma
f,as,a,g,T:Top.  (For{g} x ∈ [a as]. f[x] f[a] (For{g} x ∈ as. f[x]))

Lemma: mon_for_eq_itop
g:IMonoid. ∀A:Type. ∀as:A List. ∀f:A ⟶ |g|.  ((For{g} x ∈ as. f[x]) (Π 0 ≤ i < ||as||. f[as[i]]) ∈ |g|)

Lemma: mon_for_append
g:IMonoid. ∀A:Type. ∀f:A ⟶ |g|. ∀as,as':A List.
  ((For{g} x ∈ as as'. f[x]) ((For{g} x ∈ as. f[x]) (For{g} x ∈ as'. f[x])) ∈ |g|)

Lemma: select_reject_permr
T:Type. ∀as:T List. ∀i:ℕ||as||.  ([as[i] as\[i]] ≡(T) as)

Lemma: mon_reduce_functionality_wrt_permr
g:IAbMonoid. ∀xs,ys:|g| List.  ((xs ≡(|g|) ys)  ((Π xs) (Π ys) ∈ |g|))

Lemma: map_permr_func
A,B:Type. ∀f:A ⟶ B. ∀as,as':A List.  ((as ≡(A) as')  (map(f;as) ≡(B) map(f;as')))

Lemma: map_functionality
A,B:Type. ∀f,f':A ⟶ B. ∀as,as':A List.  ((f f' ∈ (A ⟶ B))  (as ≡(A) as')  (map(f;as) ≡(B) map(f';as')))

Lemma: map_functionality_2
A,B:Type. ∀as:A List. ∀f,f':A ⟶ B. ∀as:A List.
  ((f f' ∈ ({x:A| mem_f(A;x;as)}  ⟶ B))  (map(f;as) map(f';as) ∈ (B List)))

Lemma: mon_for_functionality_wrt_permr
g:IAbMonoid. ∀A:Type. ∀as,as':A List. ∀f,f':A ⟶ |g|.
  ((as ≡(A) as')
   (∀x:A. (mem_f(A;x;as)  (f[x] f'[x] ∈ |g|)))
   ((For{g} x ∈ as. f[x]) (For{g} x ∈ as'. f'[x]) ∈ |g|))

Lemma: length_mon_for_char
A:Type. ∀as:A List.  (||as|| (For{<ℤ+>x ∈ as. 1) ∈ ℤ)

Lemma: length_functionality_wrt_permr
A:Type. ∀as,as':A List.  ((as ≡(A) as')  (||as|| ||as'|| ∈ ℤ))

Definition: mon_htfor
HTFor{g} h::t ∈ as. f[h; t] ==  ForHdTl{A,*,e} h::t ∈ as. f[h; t]

Lemma: mon_htfor_wf
g:IMonoid. ∀A:Type. ∀as:A List. ∀f:A ⟶ (A List) ⟶ |g|.  (HTFor{g} h::t ∈ as. f[h;t] ∈ |g|)

Lemma: mon_htfor_nil_lemma
f,g,T:Top.  (HTFor{g} h::t ∈ []. f[h;t] e)

Lemma: mon_htfor_cons_lemma
f,as,a,g,T:Top.  (HTFor{g} h::t ∈ [a as]. f[h;t] f[a;as] (HTFor{g} h::t ∈ as. f[h;t]))

Lemma: mon_for_map
g:IAbMonoid. ∀A,B:Type. ∀e:A ⟶ B. ∀f:B ⟶ |g|. ∀as:A List.
  ((For{g} y ∈ map(e;as). f[y]) (For{g} x ∈ as. f[e x]) ∈ |g|)

Lemma: mon_for_of_id
g:IAbMonoid. ∀A:Type. ∀as:A List.  ((For{g} x ∈ as. e) e ∈ |g|)

Lemma: mon_for_of_op
g:IAbMonoid. ∀A:Type. ∀e,f:A ⟶ |g|. ∀as:A List.
  ((For{g} x ∈ as. (e[x] f[x])) ((For{g} x ∈ as. e[x]) (For{g} x ∈ as. f[x])) ∈ |g|)

Lemma: mon_for_swap
g:IAbMonoid. ∀A,B:Type. ∀f:A ⟶ B ⟶ |g|. ∀as:A List. ∀bs:B List.
  ((For{g} x ∈ as. For{g} y ∈ bs. f[x;y]) (For{g} y ∈ bs. For{g} x ∈ as. f[x;y]) ∈ |g|)

Lemma: mon_for_when_swap
g:Mon. ∀A:Type. ∀as:A List. ∀b:𝔹. ∀f:A ⟶ |g|.
  ((For{g} x ∈ as. (when b. f[x])) (when b. (For{g} x ∈ as. f[x])) ∈ |g|)

Definition: mem
a ∈b as ==  ∃x(:|s|) ∈ as. (=ba

Lemma: mem_wf
s:DSet. ∀a:|s|. ∀bs:|s| List.  (a ∈b bs ∈ 𝔹)

Lemma: mem_nil_lemma
a,s:Top.  (a ∈b [] ff)

Lemma: mem_cons_lemma
bs,b,a,s:Top.  (a ∈b [b bs] (b (=ba) ∨b(a ∈b bs))

Lemma: comb_for_mem_wf
λs,a,bs,z. (a ∈b bs) ∈ s:DSet ⟶ a:|s| ⟶ bs:(|s| List) ⟶ (↓True) ⟶ 𝔹

Lemma: mon_for_when_none
s:DSet. ∀g:IMonoid. ∀f:|s| ⟶ |g|. ∀b:|s| ⟶ 𝔹. ∀as:|s| List.
  ((∀x:|s|. ((↑(x ∈b as))  (¬↑b[x])))  ((For{g} x ∈ as. (when b[x]. f[x])) e ∈ |g|))

Definition: ball
bx(:A) ∈ as. f[x] ==  For{<𝔹,∧b>x ∈ as. f[x]

Lemma: ball_wf
A:Type. ∀as:A List. ∀f:A ⟶ 𝔹.  (∀bx(:A) ∈ as. f[x] ∈ 𝔹)

Lemma: ball_nil_lemma
f,T:Top.  (∀bx(:T) ∈ []. f[x] tt)

Lemma: ball_cons_lemma
f,as,a,T:Top.  (∀bx(:T) ∈ [a as]. f[x] f[a] ∧b (∀bx(:T) ∈ as. f[x]))

Lemma: comb_for_ball_wf
λA,as,f,z. ∀bx(:A) ∈ as. f[x] ∈ A:Type ⟶ as:(A List) ⟶ f:(A ⟶ 𝔹) ⟶ (↓True) ⟶ 𝔹

Lemma: ball_char
s:DSet. ∀as:|s| List. ∀f:|s| ⟶ 𝔹.  (↑(∀bx(:|s|) ∈ as. f[x]) ⇐⇒ ∀x:|s|. ((↑(x ∈b as))  (↑f[x])))

Definition: distinct
distinct{s}(ps) ==  HTFor{<𝔹,∧b>q::qs ∈ ps. ∀br(:|s|) ∈ qs. b(r (=bq))

Lemma: distinct_wf
s:DSet. ∀ps:|s| List.  (distinct{s}(ps) ∈ 𝔹)

Lemma: distinct_nil_lemma
s:Top. (distinct{s}([]) tt)

Lemma: distinct_cons_lemma
as,a,s:Top.  (distinct{s}([a as]) (∀br(:|s|) ∈ as. b(r (=ba))) ∧b distinct{s}(as))

Lemma: mon_for_when_unique
s:DSet. ∀g:IMonoid. ∀f:|s| ⟶ |g|. ∀b:|s| ⟶ 𝔹. ∀u:|s|.
  ((↑b[u])
   (∀as:|s| List
        ((↑distinct{s}(as))
         (↑(u ∈b as))
         (∀v:|s|. ((↑b[v])  (↑(v ∈b as))  (v u ∈ |s|)))
         ((For{g} x ∈ as. (when b[x]. f[x])) f[u] ∈ |g|))))

Definition: lapp_imon
<List,@> ==  <List, λx,y. tt, λx,y. tt, λx,y. (x y), [], λx.x>

Lemma: lapp_imon_wf
T:Type. (<List,@> ∈ IMonoid)

Definition: lapp_mon
<List, @> ==  <|s| List, λx,y. (x =b y), λx,y. tt, λx,y. (x y), [], λx.x>

Lemma: lapp_mon_wf
s:DSet. (<List, @> ∈ Mon)

Lemma: lapp_fact
s:DSet. ∀as:|s| List.  (as (For{<List, @>x ∈ as. [x]) ∈ (|s| List))

Lemma: lapp_fact_a
T:Type. ∀as:T List.  (as (For{<List,@>x ∈ as. [x]) ∈ (T List))

Lemma: lapp_fact_b
T:Type. ∀as:T List.  (as (Π 0 ≤ i < ||as||. [as[i]]) ∈ (T List))

Lemma: dist_hom_over_mon_for
T:Type. ∀m,n:IMonoid. ∀f:MonHom(m,n). ∀a:T List. ∀g:T ⟶ |m|.
  ((f (For{m} x ∈ a. g[x])) (For{n} x ∈ a. (f g[x])) ∈ |n|)

Definition: bexists
bx(:A) ∈ as. f[x] ==  ∃x(:A) ∈ as. f[x]

Lemma: bexists_wf
A:Type. ∀as:A List. ∀f:A ⟶ 𝔹.  (∃bx(:A) ∈ as. f[x] ∈ 𝔹)

Lemma: bexists_nil_lemma
f,T:Top.  (∃bx(:T) ∈ []. f[x] ff)

Lemma: bexists_cons_lemma
f,as,a,T:Top.  (∃bx(:T) ∈ [a as]. f[x] f[a] ∨b(∃bx(:T) ∈ as. f[x]))

Lemma: ball_functionality_wrt_permr
T:Type. ∀as,bs:T List. ∀P,Q:T ⟶ 𝔹.  ((as ≡(T) bs)  (∀x:T. P[x] Q[x])  ∀bx(:T) ∈ as. P[x] = ∀bx(:T) ∈ bs. Q[x])

Lemma: bexists_iff_exists_nth
s:DSet. ∀f:|s| ⟶ 𝔹. ∀as:|s| List.  (↑∃x(:|s|) ∈ as. f[x] ⇐⇒ ∃n:ℕ||as||. (↑f[as[n]]))

Lemma: bnot_thru_exists
A:Type. ∀as:A List. ∀f:A ⟶ 𝔹.  ¬b(∃bx(:A) ∈ as. f[x]) = ∀bx(:A) ∈ as. bf[x])

Lemma: mem_iff_mem_f
s:DSet. ∀a:|s|. ∀bs:|s| List.  (↑(a ∈b bs) ⇐⇒ mem_f(|s|;a;bs))

Lemma: mem_functionality_wrt_permr
s:DSet. ∀a,b:|s|. ∀as,bs:|s| List.  ((a b ∈ |s|)  (as ≡(|s|) bs)  a ∈b as b ∈b bs)

Lemma: bexists_char
s:DSet. ∀as:|s| List. ∀f:|s| ⟶ 𝔹.  (↑(∃bx(:|s|) ∈ as. f[x]) ⇐⇒ ∃x:|s|. ((↑(x ∈b as)) ∧ (↑f[x])))

Lemma: mem_iff_exists
s:DSet. ∀a:|s|. ∀bs:|s| List.  (↑(a ∈b bs) ⇐⇒ ∃n:ℕ||bs||. (bs[n] a ∈ |s|))

Lemma: cons_permr_mem
s:DSet. ∀a:|s|. ∀as,bs:|s| List.  (([a as] ≡(|s|) bs)  (↑(a ∈b bs)))

Definition: remove1
as ==  remove1,as. case as of [] => [] a'::as' => if a' (=bthen as' else [a' (remove1 as')] fi  esac) as

Lemma: remove1_wf
s:DSet. ∀a:|s|. ∀bs:|s| List.  (bs a ∈ |s| List)

Lemma: comb_for_remove1_wf
λs,a,bs,z. (bs a) ∈ s:DSet ⟶ a:|s| ⟶ bs:(|s| List) ⟶ (↓True) ⟶ (|s| List)

Lemma: remove1_nil_lemma
a,s:Top.  ([] [])

Lemma: remove1_cons_lemma
bs,b,a,s:Top.  ([b bs] if (=bthen bs else [b (bs a)] fi )

Lemma: cons_remove1_permr
s:DSet. ∀a:|s|. ∀bs:|s| List.  ((↑(a ∈b bs))  ([a (bs a)] ≡(|s|) bs))

Lemma: not_mem_remove1
s:DSet. ∀a:|s|. ∀bs:|s| List.  ((¬↑(a ∈b bs))  ((bs a) bs ∈ (|s| List)))

Lemma: remove1_functionality_wrt_permr
s:DSet. ∀a,a':|s|. ∀bs,bs':|s| List.  ((a a' ∈ |s|)  (bs ≡(|s|) bs')  ((bs a) ≡(|s|) (bs' a')))

Definition: bpermr
as ≡b bs ==  bpermr,as,bs. case as of [] => null(bs) a::as' => (a ∈b bs) ∧b (bpermr as' (bs a)) esac) as bs

Lemma: bpermr_wf
s:DSet. ∀as,bs:|s| List.  (as ≡b bs ∈ 𝔹)

Lemma: assert_of_bpermr
s:DSet. ∀as,bs:|s| List.  (↑(as ≡b bs) ⇐⇒ as ≡(|s|) bs)

Lemma: null_functionality_wrt_permr
T:Type. ∀as,bs:T List.  ((as ≡(T) bs)  null(as) null(bs))

Definition: count
#∈ as ==  For{<ℤ+>x ∈ as. b2i(x (=ba)

Lemma: count_wf
s:DSet. ∀a:|s|. ∀bs:|s| List.  (a #∈ bs ∈ ℤ)

Lemma: count_nil_lemma
a,s:Top.  (a #∈ [] 0)

Lemma: count_cons_lemma
bs,b,a,s:Top.  (a #∈ [b bs] b2i(b (=ba) (a #∈ bs))

Lemma: comb_for_count_wf
λs,a,bs,z. (a #∈ bs) ∈ s:DSet ⟶ a:|s| ⟶ bs:(|s| List) ⟶ (↓True) ⟶ ℤ

Lemma: count_functionality
s:DSet. ∀a,a':|s|. ∀bs,bs':|s| List.  ((a a' ∈ |s|)  (bs ≡(|s|) bs')  ((a #∈ bs) (a' #∈ bs') ∈ ℤ))

Lemma: count_bounds
s:DSet. ∀a:|s|. ∀bs:|s| List.  ((0 ≤ (a #∈ bs)) ∧ ((a #∈ bs) ≤ ||bs||))

Lemma: mem_iff_count_nzero
s:DSet. ∀a:|s|. ∀bs:|s| List.  (↑(a ∈b bs) ⇐⇒ (a #∈ bs) > 0)

Lemma: permr_iff_eq_counts
s:DSet. ∀as,bs:|s| List.  (as ≡(|s|) bs ⇐⇒ ∀x:|s|. ((x #∈ as) (x #∈ bs) ∈ ℤ))

Lemma: permr_iff_eq_counts_a
s:DSet. ∀as,bs:|s| List.  (as ≡(|s|) bs ⇐⇒ {∀x:|s|. ((x #∈ as) (x #∈ bs) ∈ ℤ)})

Definition: dislist
DisList{s} ==  {as:|s| List| ∀x:|s|. ((x #∈ as) ≤ 1)} 

Lemma: dislist_wf
s:DSet. (DisList{s} ∈ Type)

Lemma: dislist_properties
s:DSet. ∀as:DisList{s}.  {∀x:|s|. ((x #∈ as) ≤ 1)}

Definition: diff
as bs ==  diff,as,bs. case bs of [] => as b::bs' => diff (as b) bs' esac) as bs

Lemma: diff_wf
s:DSet. ∀as,bs:|s| List.  (as bs ∈ |s| List)

Lemma: diff_nil_lemma
as,s:Top.  (as [] as)

Lemma: diff_cons_lemma
bs,b,as,s:Top.  (as [b bs] (as b) bs)

Lemma: count_append
s:DSet. ∀as,bs:|s| List. ∀c:|s|.  ((c #∈ (as bs)) ((c #∈ as) (c #∈ bs)) ∈ ℤ)

Lemma: mem_append
s:DSet. ∀as,bs:|s| List. ∀c:|s|.  c ∈b (as bs) (c ∈b as) ∨b(c ∈b bs)

Lemma: mem_map
s,s':DSet. ∀f:|s| ⟶ |s'|. ∀x:|s|. ∀as:|s| List.  ((↑(x ∈b as))  (↑((f x) ∈b map(f;as))))

Lemma: count_remove1
s:DSet. ∀as:|s| List. ∀b,c:|s|.  ((c #∈ (as b)) ((c #∈ as) -- b2i(b (=bc)) ∈ ℤ)

Lemma: count_diff
s:DSet. ∀as,bs:|s| List. ∀c:|s|.  ((c #∈ (as bs)) ((c #∈ as) -- (c #∈ bs)) ∈ ℤ)

Lemma: mem_diff
s:DSet. ∀as:DisList{s}. ∀bs:|s| List. ∀c:|s|.  c ∈b (as bs) (c ∈b as) ∧b b(c ∈b bs))

Lemma: diff_functionality_wrt_permr
s:DSet. ∀as,as',bs,bs':|s| List.  ((as ≡(|s|) as')  (bs ≡(|s|) bs')  ((as bs) ≡(|s|) (as' bs')))

Definition: lmin
lmin(s;as;bs) ==  as (as bs)

Lemma: lmin_wf
s:DSet. ∀as,bs:|s| List.  (lmin(s;as;bs) ∈ |s| List)

Lemma: count_lmin
s:DSet. ∀as,bs:|s| List. ∀c:|s|.  ((c #∈ lmin(s;as;bs)) imin(c #∈ as;c #∈ bs) ∈ ℤ)

Lemma: mem_lmin
s:DSet. ∀as,bs:|s| List. ∀c:|s|.  c ∈b lmin(s;as;bs) (c ∈b as) ∧b (c ∈b bs)

Lemma: lmin_functionality_wrt_permr
s:DSet. ∀as,as',bs,bs':|s| List.  ((as ≡(|s|) as')  (bs ≡(|s|) bs')  (lmin(s;as;bs) ≡(|s|) lmin(s;as';bs')))

Lemma: lmin_com
s:DSet. ∀as,bs:|s| List.  (lmin(s;as;bs) ≡(|s|) lmin(s;bs;as))

Lemma: lmin_assoc
s:DSet. ∀as,bs,cs:|s| List.  (lmin(s;as;lmin(s;bs;cs)) ≡(|s|) lmin(s;lmin(s;as;bs);cs))

Definition: lmax
lmax(s;as;bs) ==  (as bs) bs

Lemma: lmax_wf
s:DSet. ∀as,bs:|s| List.  (lmax(s;as;bs) ∈ |s| List)

Lemma: count_lmax
s:DSet. ∀as,bs:|s| List. ∀c:|s|.  ((c #∈ lmax(s;as;bs)) imax(c #∈ as;c #∈ bs) ∈ ℤ)

Lemma: mem_lmax
s:DSet. ∀as,bs:|s| List. ∀c:|s|.  c ∈b lmax(s;as;bs) (c ∈b as) ∨b(c ∈b bs)

Lemma: lmax_functionality_wrt_permr
s:DSet. ∀as,as',bs,bs':|s| List.  ((as ≡(|s|) as')  (bs ≡(|s|) bs')  (lmax(s;as;bs) ≡(|s|) lmax(s;as';bs')))

Lemma: lmax_com
s:DSet. ∀as,bs:|s| List.  (lmax(s;as;bs) ≡(|s|) lmax(s;bs;as))

Lemma: lmax_assoc
s:DSet. ∀as,bs,cs:|s| List.  (lmax(s;as;lmax(s;bs;cs)) ≡(|s|) lmax(s;lmax(s;as;bs);cs))

Definition: bsublist
bsublist(s;as;bs) ==  null(as bs)

Lemma: bsublist_wf
s:DSet. ∀as,bs:|s| List.  (bsublist(s;as;bs) ∈ 𝔹)

Definition: bsuplist
bsuplist(s;as;bs) ==  bsublist(s;bs;as)

Lemma: bsuplist_wf
s:DSet. ∀as,bs:|s| List.  (bsuplist(s;as;bs) ∈ 𝔹)

Lemma: count_bsublist
s:DSet. ∀as,bs:|s| List.  (↑bsublist(s;as;bs) ⇐⇒ {∀c:|s|. ((c #∈ as) ≤ (c #∈ bs))})

Lemma: count_bsublist_a
s:DSet. ∀as,bs:|s| List.  (↑bsublist(s;as;bs) ⇐⇒ ∀c:|s|. ((c #∈ as) ≤ (c #∈ bs)))

Lemma: mem_bsublist_imp
s:DSet. ∀as,bs:|s| List.  ((↑bsublist(s;as;bs))  (∀c:|s|. ((↑(c ∈b as))  (↑(c ∈b bs)))))

Lemma: mem_bsublist
s:DSet. ∀as:DisList{s}. ∀bs:|s| List.  (↑bsublist(s;as;bs) ⇐⇒ ∀c:|s|. ((↑(c ∈b as))  (↑(c ∈b bs))))

Lemma: bsublist_weakening
s:DSet. ∀as,bs:|s| List.  ((as ≡(|s|) bs)  (↑bsublist(s;as;bs)))

Lemma: bsublist_transitivity
s:DSet. ∀us,vs,ws:|s| List.  ((↑bsublist(s;us;vs))  (↑bsublist(s;vs;ws))  (↑bsublist(s;us;ws)))

Lemma: bsublist_functionality_wrt_permr
s:DSet. ∀as,bs,as',bs':|s| List.  ((as ≡(|s|) bs)  (as' ≡(|s|) bs')  bsublist(s;as;as') bsublist(s;bs;bs'))

Lemma: bsublist_functionality_wrt_bsublist
s:DSet. ∀as,as',bs,bs':|s| List.
  ((↑bsuplist(s;as;bs))  (↑bsublist(s;as';bs'))  (↑(bsublist(s;as;as') b bsublist(s;bs;bs'))))

Lemma: bsublist_append_diff
s:DSet. ∀as,bs:|s| List.  ((↑bsublist(s;as;bs))  (∃cs:|s| List. ((cs as) ≡(|s|) bs)))

Lemma: ball_respects_bsublist
s:DSet. ∀us,vs:|s| List.
  ((↑bsublist(s;us;vs))  (∀Q:|s| ⟶ 𝔹((↑(For{<𝔹,∧b>x ∈ vs. Q[x]))  (↑(For{<𝔹,∧b>x ∈ us. Q[x])))))

Lemma: ball_functionality_wrt_bimplies
T:Type. ∀as:T List. ∀P,Q:T ⟶ 𝔹.  ((∀x:T. (↑(P[x] b Q[x])))  (↑(∀bx(:T) ∈ as. P[x] b (∀bx(:T) ∈ as. Q[x]))))

Lemma: distinct_iff_counts_le_one
s:DSet. ∀ps:|s| List.  (↑distinct{s}(ps) ⇐⇒ ∀x:|s|. ((x #∈ ps) ≤ 1))

Lemma: firstn_factor
T:Type. ∀as:T List. ∀n:{0...||as||}.  (firstn(n;as) (Π 0 ≤ i < n. [as[i]]) ∈ (T List))

Lemma: nth_tl_factor
T:Type. ∀n:ℕ. ∀as:T List.  ((n ≤ ||as||)  (nth_tl(n;as) (Π n ≤ i < ||as||. [as[i]]) ∈ (T List)))

Lemma: segment_factor
T:Type. ∀as:T List. ∀i:{0...||as||}. ∀j:{i...||as||}.  ((as[i..j-]) (Π i ≤ k < j. [as[k]]) ∈ (T List))

Lemma: append_segment
T:Type. ∀as:T List. ∀i:{0...||as||}. ∀j:{i...||as||}. ∀k:{j...||as||}.
  (((as[i..j-]) (as[j..k-])) (as[i..k-]) ∈ (T List))

Definition: fin_type
{as} ==  {a:|s|| ↑(a ∈b as)} 

Lemma: fin_type_wf
s:DSet. ∀as:|s| List.  ({as} ∈ Type)

Lemma: fin_type_properties
s:DSet. ∀as:|s| List. ∀a:{as}.  (↑(a ∈b as))

Lemma: fin_type_inc
s:DSet. ∀as,bs:|s| List.  ((↑bsublist(s;as;bs))  ({as} ⊆{bs}))

Lemma: whole_segment_example
T:Type. ∀as:T List.  ((as[0..||as||-]) as ∈ (T List))



Home Index