:: Atlas of Midpoint Algebra
:: by Micha{\l} Muzalewski
::
:: Copyright (c) 1991-2021 Association of Mizar Users

definition
let G be non empty addLoopStr ;
let x be Element of G;
func Double x -> Element of G equals :: MIDSP_2:def 1
x + x;
coherence
x + x is Element of G
;
end;

:: deftheorem defines Double MIDSP_2:def 1 :
for G being non empty addLoopStr
for x being Element of G holds Double x = x + x;

definition
let M be non empty MidStr ;
let G be non empty addLoopStr ;
let w be Function of [: the carrier of M, the carrier of M:], the carrier of G;
attr w is associating means :: MIDSP_2:def 2
for p, q, r being Point of M holds
( p @ q = r iff w . (p,r) = w . (r,q) );
end;

:: deftheorem defines associating MIDSP_2:def 2 :
for M being non empty MidStr
for G being non empty addLoopStr
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G holds
( w is associating iff for p, q, r being Point of M holds
( p @ q = r iff w . (p,r) = w . (r,q) ) );

theorem Th1: :: MIDSP_2:1
for G being non empty addLoopStr
for M being non empty MidStr
for p being Point of M
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G st w is associating holds
p @ p = p
proof end;

definition
let S be non empty set ;
let G be non empty addLoopStr ;
let w be Function of [:S,S:], the carrier of G;
pred w is_atlas_of S,G means :: MIDSP_2:def 3
( ( for a being Element of S
for x being Element of G ex b being Element of S st w . (a,b) = x ) & ( for a, b, c being Element of S st w . (a,b) = w . (a,c) holds
b = c ) & ( for a, b, c being Element of S holds (w . (a,b)) + (w . (b,c)) = w . (a,c) ) );
end;

:: deftheorem defines is_atlas_of MIDSP_2:def 3 :
for S being non empty set
for G being non empty addLoopStr
for w being Function of [:S,S:], the carrier of G holds
( w is_atlas_of S,G iff ( ( for a being Element of S
for x being Element of G ex b being Element of S st w . (a,b) = x ) & ( for a, b, c being Element of S st w . (a,b) = w . (a,c) holds
b = c ) & ( for a, b, c being Element of S holds (w . (a,b)) + (w . (b,c)) = w . (a,c) ) ) );

definition
let S be non empty set ;
let G be non empty addLoopStr ;
let w be Function of [:S,S:], the carrier of G;
let a be Element of S;
let x be Element of G;
assume A1: w is_atlas_of S,G ;
func (a,x) . w -> Element of S means :Def4: :: MIDSP_2:def 4
w . (a,it) = x;
existence
ex b1 being Element of S st w . (a,b1) = x
by A1;
uniqueness
for b1, b2 being Element of S st w . (a,b1) = x & w . (a,b2) = x holds
b1 = b2
by A1;
end;

:: deftheorem Def4 defines . MIDSP_2:def 4 :
for S being non empty set
for G being non empty addLoopStr
for w being Function of [:S,S:], the carrier of G
for a being Element of S
for x being Element of G st w is_atlas_of S,G holds
for b6 being Element of S holds
( b6 = (a,x) . w iff w . (a,b6) = x );

theorem Th2: :: MIDSP_2:2
for S being non empty set
for a being Element of S
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
w . (a,a) = 0. G
proof end;

theorem Th3: :: MIDSP_2:3
for S being non empty set
for a, b being Element of S
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G & w . (a,b) = 0. G holds
a = b
proof end;

theorem Th4: :: MIDSP_2:4
for S being non empty set
for a, b being Element of S
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
w . (a,b) = - (w . (b,a))
proof end;

theorem Th5: :: MIDSP_2:5
for S being non empty set
for a, b, c, d being Element of S
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G & w . (a,b) = w . (c,d) holds
w . (b,a) = w . (d,c)
proof end;

theorem Th6: :: MIDSP_2:6
for S being non empty set
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
for b being Element of S
for x being Element of G ex a being Element of S st w . (a,b) = x
proof end;

theorem Th7: :: MIDSP_2:7
for S being non empty set
for a, b, c being Element of S
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G & w . (b,a) = w . (c,a) holds
b = c
proof end;

theorem Th8: :: MIDSP_2:8
for M being non empty MidStr
for p, q being Point of M
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G st w is_atlas_of the carrier of M,G & w is associating holds
p @ q = q @ p
proof end;

theorem Th9: :: MIDSP_2:9
for M being non empty MidStr
for p, q being Point of M
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G st w is_atlas_of the carrier of M,G & w is associating holds
ex r being Point of M st r @ p = q
proof end;

theorem Th10: :: MIDSP_2:10
for x, y, z, t being Element of G holds (x + y) + (z + t) = (x + z) + (y + t)
proof end;

theorem :: MIDSP_2:11
for x, y being Element of G holds Double (x + y) = () + () by Th10;

theorem Th12: :: MIDSP_2:12
for x being Element of G holds Double (- x) = - ()
proof end;

theorem Th13: :: MIDSP_2:13
for M being non empty MidStr
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G st w is_atlas_of the carrier of M,G & w is associating holds
for a, b, c, d being Point of M holds
( a @ b = c @ d iff w . (a,d) = w . (c,b) )
proof end;

theorem Th14: :: MIDSP_2:14
for S being non empty set
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
for a, b, b9, c, c9 being Element of S st w . (a,b) = w . (b,c) & w . (a,b9) = w . (b9,c9) holds
w . (c,c9) = Double (w . (b,b9))
proof end;

registration
let M be MidSp;
coherence by MIDSP_1:56;
end;

theorem Th15: :: MIDSP_2:15
for M being MidSp holds
( ( for a being set holds
( a is Element of () iff a is Vector of M ) ) & 0. () = ID M & ( for a, b being Element of ()
for x, y being Vector of M st a = x & b = y holds
a + b = x + y ) )
proof end;

Lm1: for M being MidSp holds
( ( for a being Element of () ex x being Element of () st Double x = a ) & ( for a being Element of () st Double a = 0. () holds
a = 0. () ) )

proof end;

definition
let IT be non empty addLoopStr ;
attr IT is midpoint_operator means :Def5: :: MIDSP_2:def 5
( ( for a being Element of IT ex x being Element of IT st Double x = a ) & ( for a being Element of IT st Double a = 0. IT holds
a = 0. IT ) );
end;

:: deftheorem Def5 defines midpoint_operator MIDSP_2:def 5 :
for IT being non empty addLoopStr holds
( IT is midpoint_operator iff ( ( for a being Element of IT ex x being Element of IT st Double x = a ) & ( for a being Element of IT st Double a = 0. IT holds
a = 0. IT ) ) );

registration
coherence
for b1 being non empty addLoopStr st b1 is midpoint_operator holds
b1 is Fanoian
proof end;
end;

registration
existence
ex b1 being non empty addLoopStr st
( b1 is strict & b1 is midpoint_operator & b1 is add-associative & b1 is right_zeroed & b1 is right_complementable & b1 is Abelian )
proof end;
end;

theorem Th16: :: MIDSP_2:16
for x being Element of G st x = - x holds
x = 0. G
proof end;

theorem Th17: :: MIDSP_2:17
for x, y being Element of G st Double x = Double y holds
x = y
proof end;

definition
let G be non empty right_complementable Abelian add-associative right_zeroed midpoint_operator addLoopStr ;
let x be Element of G;
func Half x -> Element of G means :Def6: :: MIDSP_2:def 6
Double it = x;
existence
ex b1 being Element of G st Double b1 = x
by Def5;
uniqueness
for b1, b2 being Element of G st Double b1 = x & Double b2 = x holds
b1 = b2
by Th17;
end;

:: deftheorem Def6 defines Half MIDSP_2:def 6 :
for x, b3 being Element of G holds
( b3 = Half x iff Double b3 = x );

theorem :: MIDSP_2:18
for x, y being Element of G holds
( Half (0. G) = 0. G & Half (x + y) = (Half x) + (Half y) & ( Half x = Half y implies x = y ) & Half () = x )
proof end;

theorem Th19: :: MIDSP_2:19
for M being non empty MidStr
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G st w is_atlas_of the carrier of M,G & w is associating holds
for a, b, c, d being Point of M holds (a @ b) @ (c @ d) = (a @ c) @ (b @ d)
proof end;

theorem Th20: :: MIDSP_2:20
for M being non empty MidStr
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G st w is_atlas_of the carrier of M,G & w is associating holds
M is MidSp
proof end;

registration
let M be MidSp;
coherence by Lm1;
end;

definition
let M be MidSp;
let p, q be Point of M;
func vector (p,q) -> Element of () equals :: MIDSP_2:def 7
vect (p,q);
coherence
vect (p,q) is Element of ()
by Th15;
end;

:: deftheorem defines vector MIDSP_2:def 7 :
for M being MidSp
for p, q being Point of M holds vector (p,q) = vect (p,q);

definition
let M be MidSp;
func vect M -> Function of [: the carrier of M, the carrier of M:], the carrier of () means :Def8: :: MIDSP_2:def 8
for p, q being Point of M holds it . (p,q) = vect (p,q);
existence
ex b1 being Function of [: the carrier of M, the carrier of M:], the carrier of () st
for p, q being Point of M holds b1 . (p,q) = vect (p,q)
proof end;
uniqueness
for b1, b2 being Function of [: the carrier of M, the carrier of M:], the carrier of () st ( for p, q being Point of M holds b1 . (p,q) = vect (p,q) ) & ( for p, q being Point of M holds b2 . (p,q) = vect (p,q) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def8 defines vect MIDSP_2:def 8 :
for M being MidSp
for b2 being Function of [: the carrier of M, the carrier of M:], the carrier of () holds
( b2 = vect M iff for p, q being Point of M holds b2 . (p,q) = vect (p,q) );

theorem Th21: :: MIDSP_2:21
for M being MidSp holds vect M is_atlas_of the carrier of M, vectgroup M
proof end;

theorem Th22: :: MIDSP_2:22
for M being MidSp
for p, q, r, s being Point of M holds
( vect (p,q) = vect (r,s) iff p @ s = q @ r )
proof end;

theorem Th23: :: MIDSP_2:23
for M being MidSp
for p, q, r being Point of M holds
( p @ q = r iff vect (p,r) = vect (r,q) )
proof end;

theorem :: MIDSP_2:24
canceled;

Lm2: for M being MidSp holds vect M is associating
proof end;

registration
let M be MidSp;
coherence by Lm2;
end;

definition
let S be non empty set ;
let G be non empty right_complementable Abelian add-associative right_zeroed midpoint_operator addLoopStr ;
let w be Function of [:S,S:], the carrier of G;
assume A1: w is_atlas_of S,G ;
func @ w -> BinOp of S means :Def9: :: MIDSP_2:def 9
for a, b being Element of S holds w . (a,(it . (a,b))) = w . ((it . (a,b)),b);
existence
ex b1 being BinOp of S st
for a, b being Element of S holds w . (a,(b1 . (a,b))) = w . ((b1 . (a,b)),b)
proof end;
uniqueness
for b1, b2 being BinOp of S st ( for a, b being Element of S holds w . (a,(b1 . (a,b))) = w . ((b1 . (a,b)),b) ) & ( for a, b being Element of S holds w . (a,(b2 . (a,b))) = w . ((b2 . (a,b)),b) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def9 defines @ MIDSP_2:def 9 :
for S being non empty set
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
for b4 being BinOp of S holds
( b4 = @ w iff for a, b being Element of S holds w . (a,(b4 . (a,b))) = w . ((b4 . (a,b)),b) );

theorem Th24: :: MIDSP_2:25
for S being non empty set
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
for a, b, c being Element of S holds
( (@ w) . (a,b) = c iff w . (a,c) = w . (c,b) )
proof end;

registration
let D be non empty set ;
let M be BinOp of D;
cluster MidStr(# D,M #) -> non empty ;
coherence
not MidStr(# D,M #) is empty
;
end;

definition
let S be non empty set ;
let G be non empty right_complementable Abelian add-associative right_zeroed midpoint_operator addLoopStr ;
let w be Function of [:S,S:], the carrier of G;
func Atlas w -> Function of [: the carrier of MidStr(# S,(@ w) #), the carrier of MidStr(# S,(@ w) #):], the carrier of G equals :: MIDSP_2:def 10
w;
coherence
w is Function of [: the carrier of MidStr(# S,(@ w) #), the carrier of MidStr(# S,(@ w) #):], the carrier of G
;
end;

:: deftheorem defines Atlas MIDSP_2:def 10 :
for S being non empty set
for w being Function of [:S,S:], the carrier of G holds Atlas w = w;

theorem Th25: :: MIDSP_2:26
for S being non empty set
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
Atlas w is associating
proof end;

definition
let S be non empty set ;
let G be non empty right_complementable Abelian add-associative right_zeroed midpoint_operator addLoopStr ;
let w be Function of [:S,S:], the carrier of G;
assume A1: w is_atlas_of S,G ;
func MidSp. w -> strict MidSp equals :: MIDSP_2:def 11
MidStr(# S,(@ w) #);
coherence
MidStr(# S,(@ w) #) is strict MidSp
proof end;
end;

:: deftheorem defines MidSp. MIDSP_2:def 11 :
for S being non empty set
for w being Function of [:S,S:], the carrier of G st w is_atlas_of S,G holds
MidSp. w = MidStr(# S,(@ w) #);

theorem Th26: :: MIDSP_2:27
for M being non empty MidStr holds
( M is MidSp iff ex G being non empty right_complementable Abelian add-associative right_zeroed midpoint_operator addLoopStr ex w being Function of [: the carrier of M, the carrier of M:], the carrier of G st
( w is_atlas_of the carrier of M,G & w is associating ) )
proof end;

definition
let M be non empty MidStr ;
attr c2 is strict ;
struct AtlasStr over M -> ;
aggr AtlasStr(# algebra, function #) -> AtlasStr over M;
sel algebra c2 -> non empty addLoopStr ;
sel function c2 -> Function of [: the carrier of M, the carrier of M:], the carrier of the algebra of c2;
end;

definition
let M be non empty MidStr ;
let IT be AtlasStr over M;
attr IT is ATLAS-like means :Def12: :: MIDSP_2:def 12
( the algebra of IT is midpoint_operator & the algebra of IT is add-associative & the algebra of IT is right_zeroed & the algebra of IT is right_complementable & the algebra of IT is Abelian & the function of IT is associating & the function of IT is_atlas_of the carrier of M, the algebra of IT );
end;

:: deftheorem Def12 defines ATLAS-like MIDSP_2:def 12 :
for M being non empty MidStr
for IT being AtlasStr over M holds
( IT is ATLAS-like iff ( the algebra of IT is midpoint_operator & the algebra of IT is add-associative & the algebra of IT is right_zeroed & the algebra of IT is right_complementable & the algebra of IT is Abelian & the function of IT is associating & the function of IT is_atlas_of the carrier of M, the algebra of IT ) );

registration
let M be MidSp;
cluster ATLAS-like for AtlasStr over M;
existence
ex b1 being AtlasStr over M st b1 is ATLAS-like
proof end;
end;

definition
let M be MidSp;
mode ATLAS of M is ATLAS-like AtlasStr over M;
end;

definition
let M be non empty MidStr ;
let W be AtlasStr over M;
mode Vector of W is Element of the algebra of W;
end;

definition
let M be MidSp;
let W be AtlasStr over M;
let a, b be Point of M;
func W . (a,b) -> Element of the algebra of W equals :: MIDSP_2:def 13
the function of W . (a,b);
coherence
the function of W . (a,b) is Element of the algebra of W
;
end;

:: deftheorem defines . MIDSP_2:def 13 :
for M being MidSp
for W being AtlasStr over M
for a, b being Point of M holds W . (a,b) = the function of W . (a,b);

definition
let M be MidSp;
let W be AtlasStr over M;
let a be Point of M;
let x be Vector of W;
func (a,x) . W -> Point of M equals :: MIDSP_2:def 14
(a,x) . the function of W;
coherence
(a,x) . the function of W is Point of M
;
end;

:: deftheorem defines . MIDSP_2:def 14 :
for M being MidSp
for W being AtlasStr over M
for a being Point of M
for x being Vector of W holds (a,x) . W = (a,x) . the function of W;

definition
let M be MidSp;
let W be ATLAS of M;
func 0. W -> Vector of W equals :: MIDSP_2:def 15
0. the algebra of W;
coherence
0. the algebra of W is Vector of W
;
end;

:: deftheorem defines 0. MIDSP_2:def 15 :
for M being MidSp
for W being ATLAS of M holds 0. W = 0. the algebra of W;

theorem Th27: :: MIDSP_2:28
for M being non empty MidStr
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G
for a, b1, b2, c being Point of M st w is_atlas_of the carrier of M,G & w is associating holds
( a @ c = b1 @ b2 iff w . (a,c) = (w . (a,b1)) + (w . (a,b2)) )
proof end;

theorem Th28: :: MIDSP_2:29
for M being non empty MidStr
for w being Function of [: the carrier of M, the carrier of M:], the carrier of G
for a, b, c being Point of M st w is_atlas_of the carrier of M,G & w is associating holds
( a @ c = b iff w . (a,c) = Double (w . (a,b)) )
proof end;

theorem :: MIDSP_2:30
for M being MidSp
for W being ATLAS of M
for a, b1, b2, c being Point of M holds
( a @ c = b1 @ b2 iff W . (a,c) = (W . (a,b1)) + (W . (a,b2)) )
proof end;

theorem :: MIDSP_2:31
for M being MidSp
for W being ATLAS of M
for a, b, c being Point of M holds
( a @ c = b iff W . (a,c) = Double (W . (a,b)) )
proof end;

theorem :: MIDSP_2:32
for M being MidSp
for W being ATLAS of M holds
( ( for a being Point of M
for x being Vector of W ex b being Point of M st W . (a,b) = x ) & ( for a, b, c being Point of M st W . (a,b) = W . (a,c) holds
b = c ) & ( for a, b, c being Point of M holds (W . (a,b)) + (W . (b,c)) = W . (a,c) ) )
proof end;

theorem Th32: :: MIDSP_2:33
for M being MidSp
for W being ATLAS of M
for a, b, c, d being Point of M
for x being Vector of W holds
( W . (a,a) = 0. W & ( W . (a,b) = 0. W implies a = b ) & W . (a,b) = - (W . (b,a)) & ( W . (a,b) = W . (c,d) implies W . (b,a) = W . (d,c) ) & ( for b being Point of M
for x being Vector of W ex a being Point of M st W . (a,b) = x ) & ( W . (b,a) = W . (c,a) implies b = c ) & ( a @ b = c implies W . (a,c) = W . (c,b) ) & ( W . (a,c) = W . (c,b) implies a @ b = c ) & ( a @ b = c @ d implies W . (a,d) = W . (c,b) ) & ( W . (a,d) = W . (c,b) implies a @ b = c @ d ) & ( W . (a,b) = x implies (a,x) . W = b ) & ( (a,x) . W = b implies W . (a,b) = x ) )
proof end;

theorem :: MIDSP_2:34
for M being MidSp
for W being ATLAS of M
for a being Point of M holds (a,(0. W)) . W = a
proof end;