Thm* P:(A![](FONT/dash.png) A![](FONT/dash.png) Prop), f:(B![](FONT/dash.png) A), x,y:B List.
Thm* (x swap adjacent[P(f(x),f(y))] y)
Thm* ![](FONT/eq.png)
Thm* (map(f;x) swap adjacent[P(x,y)] map(f;y)) | [swap_adjacent_map] |
Thm* P:(A![](FONT/dash.png) A![](FONT/dash.png) Prop), f:(A![](FONT/dash.png) ![](FONT/then_med.png) ), L1,L2:A List.
Thm* (L1 swap adjacent[P(x,y)] L2)
Thm* ![](FONT/eq.png)
Thm* (filter(f;L1) swap adjacent[P(x,y)] filter(f;L2))
Thm* filter(f;L1) = filter(f;L2) | [filter_swap_adjacent] |
Thm* P:(A![](FONT/dash.png) A![](FONT/dash.png) Prop), X,Y:A List, a,b:A.
Thm* P(a,b) ![](FONT/eq.png) ((X @ [a; b] @ Y) swap adjacent[P(x,y)] (X @ [b; a] @ Y)) | [swap_adjacent_instance] |
Thm* P:(A![](FONT/dash.png) A![](FONT/dash.png) Prop).
Thm* (Sym x,y:A. P(x,y)) ![](FONT/eq.png) (Sym L1,L2:A List. L1 swap adjacent[P(x,y)] L2) | [symmetric_swap_adjacent] |
Thm* L:T List, P:(T![](FONT/dash.png) T![](FONT/dash.png) Prop).
Thm* ( x,y:T. Dec(P(x,y)))
Thm* ![](FONT/eq.png)
Thm* ( x,y:T. P(x,y) ![](FONT/eq.png) P(y,x))
Thm* ![](FONT/eq.png)
Thm* ( L':T List.
Thm* ((L (swap adjacent[ P(x,y)]^*) L') & ( i: (||L'||-1). P(L'[i],L'[(i+1)]))) | [partial_sort] |
Thm* L:T List, P:(T![](FONT/dash.png) T![](FONT/dash.png) ![](FONT/then_med.png) ).
Thm* ( x,y:T. P(x,y) ![](FONT/eq.png) P(y,x))
Thm* ![](FONT/eq.png)
Thm* ( L':T List.
Thm* ((L guarded_permutation(T; L,i. P(L[i],L[(i+1)])) L')
Thm* (& ( i: (||L'||-1). P(L'[i],L'[(i+1)]))) | [partial_sort_exists_2] |
Thm* L:T List, P:(T![](FONT/dash.png) T![](FONT/dash.png) ![](FONT/then_med.png) ), n: (||L||-1).
Thm* count(x < y in swap(L;n;n+1) | P(x,y))
Thm* =
Thm* count(x < y in L | P(x,y))+if P(L[n],L[(n+1)]) -1 else 0 fi+if P(L[(n+1)]
Thm* count(x < y in L | P(x,y))+if P(L[n],L[(n+1)]) -1 else 0 fi+if P,L[n])
Thm* count(x < y in L | P(x,y))+if P(L[n],L[(n+1)]) -1 else 0 fi+if 1
Thm* count(x < y in L | P(x,y))+if P(L[n],L[(n+1)]) -1 else 0 fi+else 0 fi | [count_pairs_swap] |
Thm* n,m: , f:( n![](FONT/dash.png) ![](FONT/then_med.png) m![](FONT/dash.png) ![](FONT/then_med.png) ), p:( n![](FONT/dash.png) ![](FONT/then_med.png) n), q:( m![](FONT/dash.png) ![](FONT/then_med.png) m).
Thm* Bij( n; n; p)
Thm* ![](FONT/eq.png)
Thm* Bij( m; m; q)
Thm* ![](FONT/eq.png)
Thm* sum(f(p(x),q(y)) | x < n; y < m) = sum(f(x,y) | x < n; y < m) | [permute_double_sum] |
Thm* n: , f:( n![](FONT/dash.png) ![](FONT/then_med.png) ), p:( n![](FONT/dash.png) ![](FONT/then_med.png) n).
Thm* Bij( n; n; p) ![](FONT/eq.png) sum(f(p(x)) | x < n) = sum(f(x) | x < n) | [permute_sum] |
Thm* k: , p:( k![](FONT/dash.png) ![](FONT/then_med.png) k). Bij( k; k; p) ![](FONT/eq.png) ( L: (k-1) List. p = compose_flips(L)) | [permute_by_flips] |
Thm* k: , x,y: k. L: (k-1) List. (x, y) = compose_flips(L) | [flip_adjacent] |
Thm* k: , L1,L2: (k-1) List.
Thm* compose_flips(L1) o compose_flips(L2) = compose_flips(L1 @ L2) | [compose_flips_append] |
Thm* k: , L: (k-1) List. compose_flips(L) k![](FONT/dash.png) ![](FONT/then_med.png) k | [compose_flips_wf] |
Thm* k: , x,y,z: k.
Thm* y = z ![](FONT/eq.png) x = y ![](FONT/eq.png) (x, y) = compose_list([(x, z); (y, z); (x, z)]) | [flip_lemma] |
Thm* L1,L2:(T![](FONT/dash.png) T) List.
Thm* compose_list(L1) o compose_list(L2) = compose_list(L1 @ L2) | [compose_append] |
Thm* n: , R:( n![](FONT/dash.png) ![](FONT/then_med.png) n![](FONT/dash.png) Prop). ( i,j: n. Dec(i R j)) ![](FONT/eq.png) ( i,j: n. Dec(i (R^*) j)) | [decidable__rel_star] |
Thm* n: , R:( n![](FONT/dash.png) ![](FONT/then_med.png) n![](FONT/dash.png) Prop), x,y: n. (x (R^*) y) ![](FONT/if_big.png) ( k: (n+1). x R^k y) | [rel_star_finite] |
Thm* R:(T![](FONT/dash.png) T![](FONT/dash.png) Prop), k: , x,y:T.
Thm* (x R^k y)
Thm* ![](FONT/if_big.png)
Thm* ( L:T List.
Thm* (||L|| = k+1 & L[0] = x & last(L) = y & ( i: k. L[i] R L[(i+1)])) | [rel_exp_list] |
Thm* f,g:(T![](FONT/dash.png) T). Bij(T; T; f) ![](FONT/eq.png) Bij(T; T; g) ![](FONT/eq.png) Bij(T; T; f o g) | [compose_bij] |
Thm* P:(L:(T List)![](FONT/dash.png) ![](FONT/then_med.png) (||L||-1)![](FONT/dash.png) ![](FONT/then_med.png) ), m:((T List)![](FONT/dash.png) ![](FONT/then_med.png) ).
Thm* ( L:T List, i: (||L||-1).
Thm* (P(L,i) ![](FONT/eq.png) P(swap(L;i;i+1),i) & m(swap(L;i;i+1))<m(L))
Thm* ![](FONT/eq.png)
Thm* ( L:T List.
Thm* ( L':T List.
Thm* ((L guarded_permutation(T; L,i. P(L,i)) L') & ( i: (||L'||-1). P(L',i))) | [partial_sort_exists] |
Thm* f:(A![](FONT/dash.png) B), L1,L2:A List. L1 L2 ![](FONT/eq.png) map(f;L1) map(f;L2) | [iseg_map] |
Thm* T:Type, L:T List, P:(T![](FONT/dash.png) T![](FONT/dash.png) ![](FONT/then_med.png) ). count(x < y in L | P(x,y)) ![](FONT/nat.png) | [count_pairs_wf] |
Thm* P:(L:(T List)![](FONT/dash.png) ![](FONT/then_med.png) (||L||-1)![](FONT/dash.png) Prop).
Thm* Trans(T List)(_1 guarded_permutation(T;P) _2) | [guarded_permutation_transitivity] |
Thm* f:(B![](FONT/dash.png) A), x:B List, i,j: ||x||. map(f;swap(x;i;j)) = swap(map(f;x);i;j) | [map_swap] |
Thm* L:T List, i: (||L||-1), a,b:T.
Thm* a before b swap(L;i;i+1) ![](FONT/eq.png) a before b L a = L[(i+1)] & b = L[i] | [l_before_swap] |
Thm* i: , L:A List.
Thm* i+1<||L||
Thm* ![](FONT/eq.png)
Thm* ( X,Y:A List.
Thm* (L = (X @ [L[i]; L[(i+1)]] @ Y)
Thm* (& swap(L;i;i+1) = (X @ [L[(i+1)]; L[i]] @ Y)) | [swap_adjacent_decomp] |
Thm* L:T List, x:T, i,j:{1..(||L||+1) }.
Thm* swap([x / L];i;j) = [x / swap(L;i-1;j-1)] | [swap_cons] |
Thm* L1,L2:T List, i,j: ||L1||.
Thm* L2 = swap(L1;i;j)
Thm* ![](FONT/eq.png)
Thm* L2[i] = L1[j] & L2[j] = L1[i] & ||L2|| = ||L1|| & L1 = swap(L2;i;j)
Thm* & ( x: ||L2||. x = i ![](FONT/eq.png) x = j ![](FONT/eq.png) L2[x] = L1[x]) | [swapped_select] |
Thm* L1:T List, i,j: ||L1||. swap(swap(L1;i;j);i;j) = L1 | [swap_swap] |
Thm* L:T List, i,j: ||L||. ||swap(L;i;j)|| = ||L|| ![](FONT/int.png) | [swap_length] |
Thm* L:T List, i,j,x: ||L||. swap(L;i;j)[x] = L[((i, j)(x))] | [swap_select] |
Thm* L:T List, f:( ||L||![](FONT/dash.png) ![](FONT/then_med.png) ||L||). ||(L o f)|| = ||L|| ![](FONT/int.png) | [permute_list_length] |
Thm* L:T List, f:( ||L||![](FONT/dash.png) ![](FONT/then_med.png) ||L||), i: ||L||. (L o f)[i] = L[(f(i))] | [permute_list_select] |
Thm* L:T List, P:( ||L||![](FONT/dash.png) Prop).
Thm* ( x: ||L||. Dec(P(x)))
Thm* ![](FONT/eq.png)
Thm* ( i: ||L||. P(i)) ![](FONT/eq.png) ( i: ||L||. P(i) & ( j: ||L||. i<j ![](FONT/eq.png) P(j))) | [last_with_property] |
Thm* L:T List, P:( ||L||![](FONT/dash.png) Prop).
Thm* ( x: ||L||. Dec(P(x)))
Thm* ![](FONT/eq.png)
Thm* ( L1,L2:T List, f1:( ||L1||![](FONT/dash.png) ![](FONT/then_med.png) ||L||), f2:( ||L2||![](FONT/dash.png) ![](FONT/then_med.png) ||L||).
Thm* (interleaving_occurence(T;L1;L2;L;f1;f2)
Thm* (& ( i: ||L1||. P(f1(i))) & ( i: ||L2||. P(f2(i)))
Thm* (& ( i: ||L||.
Thm* (& ((P(i) ![](FONT/eq.png) ( j: ||L1||. f1(j) = i))
Thm* (& (& ( P(i) ![](FONT/eq.png) ( j: ||L2||. f2(j) = i)))) | [interleaving_split] |
Thm* L,L1,L2:T List. interleaving(T;L1;L2;L) ![](FONT/eq.png) L1 L | [interleaving_sublist] |
Thm* L1,L:T List. interleaving(T;L1;nil;L) ![](FONT/if_big.png) L = L1 | [nil_interleaving2] |
Thm* L1,L:T List. interleaving(T;nil;L1;L) ![](FONT/if_big.png) L = L1 | [nil_interleaving] |
Thm* L1,L2,L:T List. disjoint_sublists(T;L1;L2;L) ![](FONT/eq.png) L1 L & L2 L | [disjoint_sublists_sublist] |
Thm* L:T List, n: , f:( n![](FONT/dash.png) ![](FONT/then_med.png) ||L||).
Thm* increasing(f;n)
Thm* ![](FONT/eq.png)
Thm* ( L1:T List. ||L1|| = n & sublist_occurence(T;L1;L;f)) | [range_sublist] |
Thm* P:(T![](FONT/dash.png) ![](FONT/then_med.png) ), T':Type, f:({x:T| P(x) }![](FONT/dash.png) T'), L:T List, x:T'.
Thm* (x mapfilter(f;P;L)) ![](FONT/if_big.png) ( y:T. (y L) & P(y) & x = f(y)) | [member_map_filter] |
Thm* T:Type, P:(T![](FONT/dash.png) ![](FONT/then_med.png) ), T':Type, f:({x:T| P(x) }![](FONT/dash.png) T'), L:T List.
Thm* mapfilter(f;P;L) T' List | [mapfilter_wf] |
Thm* F:(A![](FONT/dash.png) Prop), L:A List. ( k:A. Dec(F(k))) ![](FONT/eq.png) Dec(( k L.F(k))) | [decidable__l_exists] |
Thm* P:(T![](FONT/dash.png) Prop), x:T, L:T List. ( y [x / L].P(y)) ![](FONT/if_big.png) P(x) ( y L.P(y)) | [l_exists_cons] |
Thm* P:(T![](FONT/dash.png) Prop). ( x nil.P(x)) ![](FONT/if_big.png) False | [l_exists_nil] |
Thm* F:(A![](FONT/dash.png) Prop), L:A List. ( k:A. Dec(F(k))) ![](FONT/eq.png) Dec(( k L.F(k))) | [decidable__l_all] |
Thm* P:(T![](FONT/dash.png) ![](FONT/then_med.png) ), l:T List. no_repeats(T;l) ![](FONT/eq.png) no_repeats(T;filter(P;l)) | [no_repeats_filter] |
Thm* l:T List, P:(T![](FONT/dash.png) ![](FONT/then_med.png) ), x,y:T.
Thm* x before y filter(P;l) ![](FONT/if_big.png) P(x) & P(y) & x before y l | [l_before_filter] |
Thm* L1,L2:T List, P:(T![](FONT/dash.png) ![](FONT/then_med.png) ). L2 filter(P;L1) ![](FONT/if_big.png) L2 L1 & ( x L2.P(x)) | [sublist_filter] |
Thm* L:T List, P:(T![](FONT/dash.png) ![](FONT/then_med.png) ). ( x L.P(x)) ![](FONT/if_big.png) reduce( x,y. P(x)![](FONT/and.png) y;true ;L) | [l_all_reduce] |
Thm* P:(T![](FONT/dash.png) Prop). ( x nil.P(x)) | [l_all_nil] |
Thm* f:(A![](FONT/dash.png) B), L:A List, P:(B![](FONT/dash.png) Prop). ( x map(f;L).P(x)) ![](FONT/if_big.png) ( x L.P(f(x))) | [l_all_map] |
Thm* L:T List, P:(T![](FONT/dash.png) Prop). ( x L.P(x)) ![](FONT/eq.png) L {x:T| P(x) } List | [list_set_type] |
Thm* P:(T![](FONT/dash.png) ![](FONT/then_med.png) ), L:T List. ( x L. P(x)) ![](FONT/eq.png) (filter(P;L) ~ nil) | [filter_is_nil] |
Thm* P:(T![](FONT/dash.png) ![](FONT/then_med.png) ), L:T List. ( x L.P(x)) ![](FONT/eq.png) filter(P;L) = L | [filter_trivial2] |
Thm* P:(T![](FONT/dash.png) ![](FONT/then_med.png) ), L:T List. ( x L.P(x)) ![](FONT/eq.png) (filter(P;L) ~ L) | [filter_trivial] |
Thm* P:(T![](FONT/dash.png) Prop), x:T, L:T List. ( y [x / L].P(y)) ![](FONT/if_big.png) P(x) & ( y L.P(y)) | [l_all_cons] |
Def interleaving_occurence(T;L1;L2;L;f1;f2)
Def == ||L|| = ||L1||+||L2||
Def == & increasing(f1;||L1||) & ( j: ||L1||. L1[j] = L[(f1(j))] T)
Def == & increasing(f2;||L2||) & ( j: ||L2||. L2[j] = L[(f2(j))] T)
Def == & ( j1: ||L1||, j2: ||L2||. f1(j1) = f2(j2) ) | [interleaving_occurence] |
Def disjoint_sublists(T;L1;L2;L)
Def == f1:( ||L1||![](FONT/dash.png) ![](FONT/then_med.png) ||L||), f2:( ||L2||![](FONT/dash.png) ![](FONT/then_med.png) ||L||).
Def == increasing(f1;||L1||) & ( j: ||L1||. L1[j] = L[(f1(j))] T)
Def == & increasing(f2;||L2||) & ( j: ||L2||. L2[j] = L[(f2(j))] T)
Def == & ( j1: ||L1||, j2: ||L2||. f1(j1) = f2(j2)) | [disjoint_sublists] |
Def sublist_occurence(T;L1;L2;f)
Def == increasing(f;||L1||) & ( j: ||L1||. L1[j] = L2[(f(j))] T) | [sublist_occurence] |
Def ( x L.P(x)) == x:T. (x L) ![](FONT/eq.png) P(x) | [l_all] |
Def l_disjoint(T;l1;l2) == x:T. ((x l1) & (x l2)) | [l_disjoint] |