needs "Library/prime.ml";;
let group = new_definition
`group(g,(**),i,(e:A)) <=>
(e IN g) /\ (!x. x IN g ==> i(x) IN g) /\
(!x y. x IN g /\ y IN g ==> x**y IN g) /\
(!x y z. x IN g /\ y IN g /\ z IN g ==> x**(y**z) = (x**y)**z) /\
(!x. x IN g ==> x**e = x /\ e**x = x) /\
(!x. x IN g ==> x**i(x) = e /\ i(x)**x = e)`;;
parse_as_infix("PARTITIONS",(12,"right"));;
parse_as_infix("**",(20,"left"));;
parse_as_infix("***",(20,"left"));;
horizon := -1;;
let LAGRANGE_SKETCH = ref None;;
LAGRANGE_SKETCH := Some `;
let H G be A->bool; let (**) be A->A->A; let i be A->A; let e be A;
assume FINITE H /\ group (H,(**),i,e:A) /\ subgroup G (H,(**),i,e);
consider (***) such that !h G. h***G = {h**g | g IN G};
//
now let a be A; assume a IN H; let b be A; assume b IN H;
assume i(a)**b IN G;
b***G = a**i(a)**b***G; .= a***(i(a)**b***G); thus .= a***G;
end;
!a b. a IN H /\ b IN H /\ ~(a***G = b***G) ==> a***G INTER b***G = {}
proof let a be A; assume a IN H; let b be A; assume b IN H;
now assume ~(a***G INTER b***G = {});
consider g1 g2 such that g1 IN G /\ g2 IN G /\ a**g1 = b**g2;
g1**i(g2) = i(a)**b;
i(a)**b IN G;
thus a***G = b***G;
end;
qed;
!a. a IN H ==> a IN a***G
proof let a be A; assume a IN H;
a**e = a;
qed;
{a***G | a IN H} PARTITIONS H;
!a b. a IN H /\ b IN H ==> CARD (a***G) = CARD (b***G)
proof let a be A; assume a IN H; let b be A; assume b IN H;
consider f such that !g. g IN G ==> f(a**g) = b**g;
bijection f (a***G) (b***G);
qed;
set INDEX = CARD {a***G | a IN H};
set N = CARD H; set n = CARD G; set j = INDEX;
N = j*n;
thus CARD G divides CARD H;
//
`;;
LAGRANGE_SKETCH := Some `;
let H G be A->bool; let (**) be A->A->A; let i be A->A; let e be A;
assume FINITE H /\ group (H,(**),i,e:A) /\ subgroup G (H,(**),i,e);
consider (***) such that !h G. h***G = {h**g | g IN G};
:: #2
:: 2: inference time-out
//
now let a be A; assume a IN H; let b be A; assume b IN H;
assume i(a)**b IN G;
b***G = a**i(a)**b***G; .= a***(i(a)**b***G); thus .= a***G;
:: #2 #2 #2
end;
!a b. a IN H /\ b IN H /\ ~(a***G = b***G) ==> a***G INTER b***G = {}
proof let a be A; assume a IN H; let b be A; assume b IN H;
now assume ~(a***G INTER b***G = {});
consider g1 g2 such that g1 IN G /\ g2 IN G /\ a**g1 = b**g2;
:: #2
g1**i(g2) = i(a)**b;
:: #2
i(a)**b IN G;
:: #2
thus a***G = b***G;
end;
qed;
!a. a IN H ==> a IN a***G
proof let a be A; assume a IN H;
a**e = a;
:: #1
:: 1: inference error
qed;
:: #2
{a***G | a IN H} PARTITIONS H;
:: #2
!a b. a IN H /\ b IN H ==> CARD (a***G) = CARD (b***G)
proof let a be A; assume a IN H; let b be A; assume b IN H;
consider f such that !g. g IN G ==> f(a**g) = b**g;
:: #2
bijection f (a***G) (b***G);
:: #2
qed;
:: #2
set INDEX = CARD {a***G | a IN H};
set N = CARD H; set n = CARD G; set j = INDEX;
N = j*n;
:: #2
thus CARD G divides CARD H;
:: #2
//
`;;
horizon := 3;;
let UNIONS_FINITE = thm `;
!s. FINITE (UNIONS s) <=>
FINITE s /\ !t:A->bool. t IN s ==> FINITE t
proof
let s be (A->bool)->bool;
now assume FINITE (UNIONS s) [1];
now let t be A->bool; assume t IN s;
now let x be A; assume x IN t;
?t. t IN s /\ x IN t;
thus x IN UNIONS s by ALL_TAC,UNIONS,IN_ELIM_THM;
end;
thus t IN {t | t SUBSET UNIONS s} by SUBSET,IN_ELIM_THM;
end;
s SUBSET {t | t SUBSET UNIONS s} by REWRITE_TAC,SUBSET;
FINITE {t | t SUBSET UNIONS s} by 1,FINITE_POWERSET;
thus FINITE s by FINITE_SUBSET;
end;
qed by FINITE_UNIONS`;;
let CARD_UNIONS_EQUAL = thm `;
!X s n. FINITE s /\ X PARTITIONS s /\ (!t:A->bool. t IN X ==> CARD t = n)
==> CARD s = (CARD X)*n
proof
let X be (A->bool)->bool;
let s be A->bool;
let n be num;
assume FINITE s;
assume X PARTITIONS s [1];
assume !t. t IN X ==> CARD t = n [2];
FINITE (UNIONS X) by PARTITIONS;
!t. t IN X ==> FINITE t [3] by UNIONS_FINITE;
FINITE X [4] by UNIONS_FINITE;
!t. t IN X ==> CARD t = (\t. n) t [5] by 2;
!t u. t IN X /\ u IN X /\ ~(t = u) ==> t INTER u = {} by 1,PARTITIONS;
CARD s = CARD (UNIONS X) by 1,PARTITIONS;
.= nsum X CARD by 2,3,4,CARD_UNIONS;
.= nsum X (\t. n) by 5,NSUM_EQ;
qed by 4,NSUM_CONST`;;
let BIJECTION_CARD_EQ = thm `;
let f be A->B;
let s be A->bool;
let t be B->bool;
assume FINITE s /\ bijection f s t [1];
?g. (!x. x IN s ==> f x IN t /\ g (f x) = x) /\
(!y. y IN t ==> g y IN s /\ f (g y) = y)
by REWRITE_TAC,-,GSYM bijection;
thus CARD s = CARD t by -,1,BIJECTIONS_CARD_EQ`;;
horizon := 0;;
let LAGRANGE = thm `;
let H G be A->bool;
let (**) be A->A->A;
let i be A->A;
let e be A;
assume FINITE H /\ group (H,(**),i,e) /\ subgroup G (H,(**),i,e) [1];
(e IN H) /\ (!x. x IN H ==> i(x) IN H) /\
(!x y. x IN H /\ y IN H ==> x**y IN H) /\
(!x y z. x IN H /\ y IN H /\ z IN H ==> x**(y**z) = (x**y)**z) /\
(!x. x IN H ==> x**e = x /\ e**x = x) /\
(!x. x IN H ==> x**i(x) = e /\ i(x)**x = e) [2]
by REWRITE_TAC,1,GSYM group;
(G SUBSET H) /\ group (G,(**),i,e) [3] by 1,subgroup;
!x. x IN G ==> x IN H [4] by -,SUBSET;
FINITE G [5] by 3,1,FINITE_SUBSET;
(e IN G) /\ (!x. x IN G ==> i(x) IN G) /\
(!x y. x IN G /\ y IN G ==> x**y IN G) /\
(!x y z. x IN G /\ y IN G /\ z IN G ==> x**(y**z) = (x**y)**z) /\
(!x. x IN G ==> x**e = x /\ e**x = x) /\
(!x. x IN G ==> x**i(x) = e /\ i(x)**x = e) [6]
by REWRITE_TAC,3,GSYM group;
set (***) = \h G. {h**g | g IN G} [7];
!x h G. x IN h***G <=> ?g. g IN G /\ x = h**g [8] by ALL_TAC,-,IN_ELIM_THM;
!h1 h2. h1 IN H /\ h2 IN H ==> (h1**h2)***G = h1***(h2***G) [9]
proof
let h1 h2 be A;
assume h1 IN H /\ h2 IN H [10];
now [11]
let x be A;
assume x IN (h1**h2)***G;
consider g such that g IN G /\ x = (h1**h2)**g [12] by -,8;
g IN H by -,4;
x = h1**(h2**g) [13] by -,2,10,12;
h2**g IN h2***G by 8,12;
thus x IN h1***(h2***G) by -,13,8;
end;
now
let x be A;
assume x IN h1***(h2***G);
consider y such that y IN h2***G /\ x = h1**y [14] by -,8;
consider g such that g IN G /\ y = h2**g [15] by -,8;
g IN H [16] by -,4;
x = h1**(h2**g) by 14,15;
.= (h1**h2)**g by -,2,10,14,16;
thus x IN (h1**h2)***G by -,8,15;
end;
qed by -,11,EXTENSION;
!g. g IN G ==> g***G = G [17]
proof
let g be A;
assume g IN G [18];
now [19]
let x be A;
assume x IN g***G;
consider g' such that g' IN G /\ x = g**g' by -,8;
thus x IN G by -,6,18;
end;
now
let x be A;
assume x IN G [20];
x = g**i(g)**x by -,6,18;
.= g**(i(g)**x) [21] by -,6,18,20;
i(g)**x IN G by 6,18,20;
thus x IN g***G by -,21,8;
end;
qed by -,19,EXTENSION;
//
now [22]
let a be A; assume a IN H [23];
let b be A; assume b IN H [24];
i(a)**b IN H [25] by 2,23,24;
assume i(a)**b IN G [26];
b***G = e**b***G by 2,24;
.= a**i(a)**b***G by -,2,23;
.= a**(i(a)**b)***G by -,2,23,24;
.= a***(i(a)**b***G) by -,9,23,25;
thus .= a***G by -,17,26;
end;
!a b. a IN H /\ b IN H /\ ~(a***G = b***G) ==> a***G INTER b***G = {} [27]
proof
let a be A; assume a IN H [28];
let b be A; assume b IN H [29];
now assume ~(a***G INTER b***G = {});
consider x such that x IN a***G INTER b***G by -,MEMBER_NOT_EMPTY;
x IN a***G /\ x IN b***G [30] by -,IN_INTER;
consider g1 such that g1 IN G /\ x = a**g1 [31] by 8,30;
consider g2 such that g2 IN G /\ x = b**g2 [32] by 8,30;
g1 IN H /\ g2 IN H [33] by 4,31,32;
a**g1 = b**g2 [34] by 31,32;
g1**i(g2) = e**g1**i(g2) by 2,33;
.= (i(a)**a)**g1**i(g2) by -,2,28;
.= i(a)**(a**g1)**i(g2) by -,2,28,33;
.= i(a)**(b**g2)**i(g2) by -,34;
.= i(a)**(b**g2**i(g2)) by -,2,28,29,33;
.= i(a)**(b**(g2**i(g2))) by -,2,29,33;
.= i(a)**(b**e) by -,2,33;
.= i(a)**b by -,2,29;
i(a)**b IN G by -,6,31,32;
thus a***G = b***G by -,22,28,29;
end;
qed by -,28,29;
!a. a IN H ==> a IN a***G [35]
proof
let a be A; assume a IN H;
a**e = a by -,2;
qed by -,6,8;
now
now [36]
let x be A;
assume x IN UNIONS {a***G | a IN H};
consider s such that s IN {a***G | a IN H} /\ x IN s [37]
by -,IN_UNIONS;
consider a such that a IN H /\ s = a***G [38] by -;
consider g such that g IN G /\ x = a**g by -,8,37;
thus x IN H by -,2,4,38;
end;
now
let x be A;
assume x IN H;
x IN x***G /\ x***G IN {a***G | a IN H} by -,35;
thus x IN UNIONS {a***G | a IN H} by -,IN_UNIONS;
end;
thus UNIONS {a***G | a IN H} = H by -,36,EXTENSION;
let t u be A->bool;
assume t IN {a***G | a IN H} /\ u IN {a***G | a IN H} /\ ~(t = u) [39];
consider a b such that a IN H /\ t = a***G /\ b IN H /\ t = b***G by -;
thus t INTER u = {} by -,27,39;
end;
{a***G | a IN H} PARTITIONS H [40] by REWRITE_TAC,-,PARTITIONS;
!a b. a IN H /\ b IN H ==> CARD (a***G) = CARD (b***G) [41]
proof
let a be A; assume a IN H [42];
let b be A; assume b IN H [43];
set f = \x. b**(i(a)**x);
set f' = \x. a**(i(b)**x);
!g. g IN G ==> f(a**g) = b**g /\ f'(b**g) = a**g [44]
proof
let g be A; assume g IN G;
g IN H [45] by -,4;
f(a**g) = b**(i(a)**(a**g));
.= b**(i(a)**a**g) by -,2,42,45;
.= b**(e**g) by -,2,42;
.= b**g [46] by -,2,45;
f'(b**g) = a**(i(b)**(b**g));
.= a**(i(b)**b**g) by -,2,43,45;
.= a**(e**g) by -,2,43;
.= a**g by -,2,45;
qed by -,46;
now
take f';
thus !x. x IN a***G ==> f x IN b***G /\ f' (f x) = x
proof
let x be A; assume x IN a***G;
consider g such that g IN G /\ x = a**g [47] by -,8;
f x = b**g by -,44;
qed by -,8,44,47;
thus !y. y IN b***G ==> f' y IN a***G /\ f (f' y) = y
proof
let y be A; assume y IN b***G;
consider g such that g IN G /\ y = b**g [48] by -,8;
f' y = a**g by -,44;
qed by -,8,44,48;
end;
bijection f (a***G) (b***G) [49] by ALL_TAC,-,bijection;
FINITE {a**g | g IN G} by SIMP_TAC,5,SIMPLE_IMAGE,FINITE_IMAGE;
qed by -,7,49,BIJECTION_CARD_EQ;
set INDEX = CARD {a***G | a IN H};
now
let t be A->bool;
assume t IN {a***G | a IN H};
consider a such that a IN H /\ t = a***G [50] by -;
CARD t = CARD (a***G) by -;
.= CARD (e***G) by -,2,41,50;
thus .= CARD G by -,6,17;
end;
set N = CARD H;
set n = CARD G;
set j = INDEX;
N = (CARD {a***G | a IN H})*(CARD G) by -,1,40,CARD_UNIONS_EQUAL;
.= j*n by -;
thus CARD G divides CARD H by -,divides,MULT_SYM;
//
`;;
parse_as_infix("**",(20,"right"));;