:: ALGSTR_1 semantic presentation

theorem Th1: :: ALGSTR_1:1
for b1 being non empty LoopStr
for b2, b3 being Element of b1 st ( for b4 being Element of b1 holds b4 + (0. b1) = b4 ) & ( for b4 being Element of b1 ex b5 being Element of b1 st b4 + b5 = 0. b1 ) & ( for b4, b5, b6 being Element of b1 holds (b4 + b5) + b6 = b4 + (b5 + b6) ) & b2 + b3 = 0. b1 holds
b3 + b2 = 0. b1
proof end;

theorem Th2: :: ALGSTR_1:2
for b1 being non empty LoopStr
for b2 being Element of b1 st ( for b3 being Element of b1 holds b3 + (0. b1) = b3 ) & ( for b3 being Element of b1 ex b4 being Element of b1 st b3 + b4 = 0. b1 ) & ( for b3, b4, b5 being Element of b1 holds (b3 + b4) + b5 = b3 + (b4 + b5) ) holds
(0. b1) + b2 = b2 + (0. b1)
proof end;

theorem Th3: :: ALGSTR_1:3
for b1 being non empty LoopStr st ( for b2 being Element of b1 holds b2 + (0. b1) = b2 ) & ( for b2 being Element of b1 ex b3 being Element of b1 st b2 + b3 = 0. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 + b3) + b4 = b2 + (b3 + b4) ) holds
for b2 being Element of b1 ex b3 being Element of b1 st b3 + b2 = 0. b1
proof end;

definition
let c1 be set ;
canceled;
canceled;
func Extract c1 -> Element of {a1} equals :: ALGSTR_1:def 3
a1;
coherence
c1 is Element of {c1}
by TARSKI:def 1;
end;

:: deftheorem Def1 ALGSTR_1:def 1 :
canceled;

:: deftheorem Def2 ALGSTR_1:def 2 :
canceled;

:: deftheorem Def3 defines Extract ALGSTR_1:def 3 :
for b1 being set holds Extract b1 = b1;

definition
func L_Trivial -> strict LoopStr equals :: ALGSTR_1:def 4
LoopStr(# {{} },op2 ,(Extract {} ) #);
correctness
coherence
LoopStr(# {{} },op2 ,(Extract {} ) #) is strict LoopStr
;
;
end;

:: deftheorem Def4 defines L_Trivial ALGSTR_1:def 4 :
L_Trivial = LoopStr(# {{} },op2 ,(Extract {} ) #);

registration
cluster L_Trivial -> non empty strict ;
coherence
not L_Trivial is empty
proof end;
end;

theorem Th4: :: ALGSTR_1:4
canceled;

theorem Th5: :: ALGSTR_1:5
for b1, b2 being Element of L_Trivial holds b1 = b2
proof end;

theorem Th6: :: ALGSTR_1:6
for b1, b2 being Element of L_Trivial holds b1 + b2 = 0. L_Trivial by Th5;

Lemma5: for b1 being Element of L_Trivial holds b1 + (0. L_Trivial ) = b1
by Th5;

Lemma6: for b1 being Element of L_Trivial holds (0. L_Trivial ) + b1 = b1
by Th5;

Lemma7: for b1, b2 being Element of L_Trivial ex b3 being Element of L_Trivial st b1 + b3 = b2
proof end;

Lemma8: for b1, b2 being Element of L_Trivial ex b3 being Element of L_Trivial st b3 + b1 = b2
proof end;

Lemma9: for b1, b2, b3 being Element of L_Trivial st b1 + b2 = b1 + b3 holds
b2 = b3
by Th5;

Lemma10: for b1, b2, b3 being Element of L_Trivial st b2 + b1 = b3 + b1 holds
b2 = b3
by Th5;

definition
let c1 be non empty LoopStr ;
attr a1 is left_zeroed means :Def5: :: ALGSTR_1:def 5
for b1 being Element of a1 holds (0. a1) + b1 = b1;
end;

:: deftheorem Def5 defines left_zeroed ALGSTR_1:def 5 :
for b1 being non empty LoopStr holds
( b1 is left_zeroed iff for b2 being Element of b1 holds (0. b1) + b2 = b2 );

definition
let c1 be non empty LoopStr ;
attr a1 is add-left-cancelable means :Def6: :: ALGSTR_1:def 6
for b1, b2, b3 being Element of a1 st b1 + b2 = b1 + b3 holds
b2 = b3;
attr a1 is add-right-cancelable means :Def7: :: ALGSTR_1:def 7
for b1, b2, b3 being Element of a1 st b2 + b1 = b3 + b1 holds
b2 = b3;
attr a1 is add-left-invertible means :Def8: :: ALGSTR_1:def 8
for b1, b2 being Element of a1 ex b3 being Element of a1 st b3 + b1 = b2;
attr a1 is add-right-invertible means :Def9: :: ALGSTR_1:def 9
for b1, b2 being Element of a1 ex b3 being Element of a1 st b1 + b3 = b2;
end;

:: deftheorem Def6 defines add-left-cancelable ALGSTR_1:def 6 :
for b1 being non empty LoopStr holds
( b1 is add-left-cancelable iff for b2, b3, b4 being Element of b1 st b2 + b3 = b2 + b4 holds
b3 = b4 );

:: deftheorem Def7 defines add-right-cancelable ALGSTR_1:def 7 :
for b1 being non empty LoopStr holds
( b1 is add-right-cancelable iff for b2, b3, b4 being Element of b1 st b3 + b2 = b4 + b2 holds
b3 = b4 );

:: deftheorem Def8 defines add-left-invertible ALGSTR_1:def 8 :
for b1 being non empty LoopStr holds
( b1 is add-left-invertible iff for b2, b3 being Element of b1 ex b4 being Element of b1 st b4 + b2 = b3 );

:: deftheorem Def9 defines add-right-invertible ALGSTR_1:def 9 :
for b1 being non empty LoopStr holds
( b1 is add-right-invertible iff for b2, b3 being Element of b1 ex b4 being Element of b1 st b2 + b4 = b3 );

definition
let c1 be non empty LoopStr ;
attr a1 is Loop-like means :Def10: :: ALGSTR_1:def 10
( a1 is add-left-cancelable & a1 is add-right-cancelable & a1 is add-left-invertible & a1 is add-right-invertible );
end;

:: deftheorem Def10 defines Loop-like ALGSTR_1:def 10 :
for b1 being non empty LoopStr holds
( b1 is Loop-like iff ( b1 is add-left-cancelable & b1 is add-right-cancelable & b1 is add-left-invertible & b1 is add-right-invertible ) );

registration
cluster non empty Loop-like -> non empty add-left-cancelable add-right-cancelable add-left-invertible add-right-invertible LoopStr ;
coherence
for b1 being non empty LoopStr st b1 is Loop-like holds
( b1 is add-left-cancelable & b1 is add-right-cancelable & b1 is add-left-invertible & b1 is add-right-invertible )
by Def10;
cluster non empty add-left-cancelable add-right-cancelable add-left-invertible add-right-invertible -> non empty Loop-like LoopStr ;
coherence
for b1 being non empty LoopStr st b1 is add-left-cancelable & b1 is add-right-cancelable & b1 is add-left-invertible & b1 is add-right-invertible holds
b1 is Loop-like
by Def10;
end;

theorem Th7: :: ALGSTR_1:7
for b1 being non empty LoopStr holds
( b1 is Loop-like iff ( ( for b2, b3 being Element of b1 ex b4 being Element of b1 st b2 + b4 = b3 ) & ( for b2, b3 being Element of b1 ex b4 being Element of b1 st b4 + b2 = b3 ) & ( for b2, b3, b4 being Element of b1 st b2 + b3 = b2 + b4 holds
b3 = b4 ) & ( for b2, b3, b4 being Element of b1 st b3 + b2 = b4 + b2 holds
b3 = b4 ) ) )
proof end;

Lemma18: for b1, b2, b3 being Element of L_Trivial holds (b1 + b2) + b3 = b1 + (b2 + b3)
by Th5;

Lemma19: for b1, b2 being Element of L_Trivial holds b1 + b2 = b2 + b1
by Th5;

registration
cluster L_Trivial -> non empty strict add-associative right_zeroed left_zeroed add-left-cancelable add-right-cancelable add-left-invertible add-right-invertible Loop-like ;
coherence
( L_Trivial is add-associative & L_Trivial is Loop-like & L_Trivial is right_zeroed & L_Trivial is left_zeroed )
by Def5, Lemma5, Lemma6, Lemma7, Lemma8, Lemma9, Lemma10, Lemma18, Th7, RLVECT_1:def 6, RLVECT_1:def 7;
end;

registration
cluster non empty strict right_zeroed left_zeroed add-left-cancelable add-right-cancelable add-left-invertible add-right-invertible Loop-like LoopStr ;
existence
ex b1 being non empty LoopStr st
( b1 is strict & b1 is left_zeroed & b1 is right_zeroed & b1 is Loop-like )
proof end;
end;

definition
mode Loop is non empty right_zeroed left_zeroed Loop-like LoopStr ;
end;

registration
cluster strict add-associative LoopStr ;
existence
ex b1 being Loop st
( b1 is strict & b1 is add-associative )
proof end;
end;

definition
mode Group is add-associative Loop;
end;

registration
cluster non empty Loop-like -> non empty right_complementable LoopStr ;
coherence
for b1 being non empty LoopStr st b1 is Loop-like holds
b1 is right_complementable
proof end;
cluster non empty add-associative right_zeroed right_complementable -> non empty left_zeroed add-left-cancelable add-right-cancelable add-left-invertible add-right-invertible Loop-like LoopStr ;
coherence
for b1 being non empty LoopStr st b1 is add-associative & b1 is right_zeroed & b1 is right_complementable holds
( b1 is left_zeroed & b1 is Loop-like )
proof end;
end;

theorem Th8: :: ALGSTR_1:8
canceled;

theorem Th9: :: ALGSTR_1:9
for b1 being non empty LoopStr holds
( b1 is Group iff ( ( for b2 being Element of b1 holds b2 + (0. b1) = b2 ) & ( for b2 being Element of b1 ex b3 being Element of b1 st b2 + b3 = 0. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 + b3) + b4 = b2 + (b3 + b4) ) ) )
proof end;

registration
cluster L_Trivial -> non empty strict Abelian add-associative right_zeroed right_complementable left_zeroed add-left-cancelable add-right-cancelable add-left-invertible add-right-invertible Loop-like ;
coherence
L_Trivial is Abelian
by Lemma19, RLVECT_1:def 5;
end;

registration
cluster strict Abelian right_complementable LoopStr ;
existence
ex b1 being Group st
( b1 is strict & b1 is Abelian )
proof end;
end;

theorem Th10: :: ALGSTR_1:10
canceled;

theorem Th11: :: ALGSTR_1:11
for b1 being non empty LoopStr holds
( b1 is Abelian Group iff ( ( for b2 being Element of b1 holds b2 + (0. b1) = b2 ) & ( for b2 being Element of b1 ex b3 being Element of b1 st b2 + b3 = 0. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 + b3) + b4 = b2 + (b3 + b4) ) & ( for b2, b3 being Element of b1 holds b2 + b3 = b3 + b2 ) ) ) by Th9, RLVECT_1:def 5;

definition
func multL_Trivial -> strict multLoopStr equals :: ALGSTR_1:def 11
multLoopStr(# {{} },op2 ,(Extract {} ) #);
correctness
coherence
multLoopStr(# {{} },op2 ,(Extract {} ) #) is strict multLoopStr
;
;
end;

:: deftheorem Def11 defines multL_Trivial ALGSTR_1:def 11 :
multL_Trivial = multLoopStr(# {{} },op2 ,(Extract {} ) #);

registration
cluster multL_Trivial -> non empty strict ;
coherence
not multL_Trivial is empty
proof end;
end;

theorem Th12: :: ALGSTR_1:12
canceled;

theorem Th13: :: ALGSTR_1:13
canceled;

theorem Th14: :: ALGSTR_1:14
canceled;

theorem Th15: :: ALGSTR_1:15
canceled;

theorem Th16: :: ALGSTR_1:16
canceled;

theorem Th17: :: ALGSTR_1:17
canceled;

theorem Th18: :: ALGSTR_1:18
for b1, b2 being Element of multL_Trivial holds b1 = b2
proof end;

theorem Th19: :: ALGSTR_1:19
for b1, b2 being Element of multL_Trivial holds b1 * b2 = 1. multL_Trivial by Th18;

Lemma22: for b1 being Element of multL_Trivial holds b1 * (1. multL_Trivial ) = b1
by Th18;

Lemma23: for b1 being Element of multL_Trivial holds (1. multL_Trivial ) * b1 = b1
by Th18;

Lemma24: for b1, b2 being Element of multL_Trivial ex b3 being Element of multL_Trivial st b1 * b3 = b2
proof end;

Lemma25: for b1, b2 being Element of multL_Trivial ex b3 being Element of multL_Trivial st b3 * b1 = b2
proof end;

Lemma26: for b1, b2, b3 being Element of multL_Trivial st b1 * b2 = b1 * b3 holds
b2 = b3
by Th18;

Lemma27: for b1, b2, b3 being Element of multL_Trivial st b2 * b1 = b3 * b1 holds
b2 = b3
by Th18;

definition
let c1 be non empty multLoopStr ;
attr a1 is invertible means :Def12: :: ALGSTR_1:def 12
( ( for b1, b2 being Element of a1 ex b3 being Element of a1 st b1 * b3 = b2 ) & ( for b1, b2 being Element of a1 ex b3 being Element of a1 st b3 * b1 = b2 ) );
attr a1 is cancelable means :Def13: :: ALGSTR_1:def 13
( ( for b1, b2, b3 being Element of a1 st b1 * b2 = b1 * b3 holds
b2 = b3 ) & ( for b1, b2, b3 being Element of a1 st b2 * b1 = b3 * b1 holds
b2 = b3 ) );
end;

:: deftheorem Def12 defines invertible ALGSTR_1:def 12 :
for b1 being non empty multLoopStr holds
( b1 is invertible iff ( ( for b2, b3 being Element of b1 ex b4 being Element of b1 st b2 * b4 = b3 ) & ( for b2, b3 being Element of b1 ex b4 being Element of b1 st b4 * b2 = b3 ) ) );

:: deftheorem Def13 defines cancelable ALGSTR_1:def 13 :
for b1 being non empty multLoopStr holds
( b1 is cancelable iff ( ( for b2, b3, b4 being Element of b1 st b2 * b3 = b2 * b4 holds
b3 = b4 ) & ( for b2, b3, b4 being Element of b1 st b3 * b2 = b4 * b2 holds
b3 = b4 ) ) );

registration
cluster non empty unital strict invertible cancelable multLoopStr ;
existence
ex b1 being non empty multLoopStr st
( b1 is strict & b1 is unital & b1 is invertible & b1 is cancelable )
proof end;
end;

definition
mode multLoop is non empty unital invertible cancelable multLoopStr ;
end;

registration
cluster multL_Trivial -> non empty unital strict invertible cancelable ;
coherence
( multL_Trivial is unital & multL_Trivial is invertible & multL_Trivial is cancelable )
by Def12, Def13, Lemma22, Lemma23, Lemma24, Lemma25, Lemma26, Lemma27, GROUP_1:def 2;
end;

Lemma30: for b1, b2, b3 being Element of multL_Trivial holds (b1 * b2) * b3 = b1 * (b2 * b3)
by Th18;

registration
cluster associative strict multLoopStr ;
existence
ex b1 being multLoop st
( b1 is strict & b1 is associative )
proof end;
end;

definition
mode multGroup is associative multLoop;
end;

Lemma31: for b1 being non empty multLoopStr
for b2, b3 being Element of b1 st ( for b4 being Element of b1 holds b4 * (1. b1) = b4 ) & ( for b4 being Element of b1 ex b5 being Element of b1 st b4 * b5 = 1. b1 ) & ( for b4, b5, b6 being Element of b1 holds (b4 * b5) * b6 = b4 * (b5 * b6) ) & b2 * b3 = 1. b1 holds
b3 * b2 = 1. b1
proof end;

Lemma32: for b1 being non empty multLoopStr
for b2 being Element of b1 st ( for b3 being Element of b1 holds b3 * (1. b1) = b3 ) & ( for b3 being Element of b1 ex b4 being Element of b1 st b3 * b4 = 1. b1 ) & ( for b3, b4, b5 being Element of b1 holds (b3 * b4) * b5 = b3 * (b4 * b5) ) holds
(1. b1) * b2 = b2 * (1. b1)
proof end;

Lemma33: for b1 being non empty multLoopStr st ( for b2 being Element of b1 holds b2 * (1. b1) = b2 ) & ( for b2 being Element of b1 ex b3 being Element of b1 st b2 * b3 = 1. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 * b3) * b4 = b2 * (b3 * b4) ) holds
for b2 being Element of b1 ex b3 being Element of b1 st b3 * b2 = 1. b1
proof end;

theorem Th20: :: ALGSTR_1:20
canceled;

theorem Th21: :: ALGSTR_1:21
canceled;

theorem Th22: :: ALGSTR_1:22
for b1 being non empty multLoopStr holds
( b1 is multGroup iff ( ( for b2 being Element of b1 holds b2 * (1. b1) = b2 ) & ( for b2 being Element of b1 ex b3 being Element of b1 st b2 * b3 = 1. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 * b3) * b4 = b2 * (b3 * b4) ) ) )
proof end;

registration
cluster multL_Trivial -> non empty unital associative strict invertible cancelable ;
coherence
multL_Trivial is associative
by Lemma30, GROUP_1:def 4;
end;

Lemma35: for b1, b2 being Element of multL_Trivial holds b1 * b2 = b2 * b1
by Th18;

registration
cluster commutative strict multLoopStr ;
existence
ex b1 being multGroup st
( b1 is strict & b1 is commutative )
proof end;
end;

theorem Th23: :: ALGSTR_1:23
canceled;

theorem Th24: :: ALGSTR_1:24
for b1 being non empty multLoopStr holds
( b1 is commutative multGroup iff ( ( for b2 being Element of b1 holds b2 * (1. b1) = b2 ) & ( for b2 being Element of b1 ex b3 being Element of b1 st b2 * b3 = 1. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 * b3) * b4 = b2 * (b3 * b4) ) & ( for b2, b3 being Element of b1 holds b2 * b3 = b3 * b2 ) ) ) by Th22, GROUP_1:def 16;

definition
let c1 be non empty invertible cancelable multLoopStr ;
let c2 be Element of c1;
canceled;
canceled;
func c2 " -> Element of a1 means :Def16: :: ALGSTR_1:def 16
a2 * a3 = 1. a1;
existence
ex b1 being Element of c1 st c2 * b1 = 1. c1
by Def12;
uniqueness
for b1, b2 being Element of c1 st c2 * b1 = 1. c1 & c2 * b2 = 1. c1 holds
b1 = b2
by Def13;
end;

:: deftheorem Def14 ALGSTR_1:def 14 :
canceled;

:: deftheorem Def15 ALGSTR_1:def 15 :
canceled;

:: deftheorem Def16 defines " ALGSTR_1:def 16 :
for b1 being non empty invertible cancelable multLoopStr
for b2, b3 being Element of b1 holds
( b3 = b2 " iff b2 * b3 = 1. b1 );

theorem Th25: :: ALGSTR_1:25
canceled;

theorem Th26: :: ALGSTR_1:26
for b1 being multGroup
for b2 being Element of b1 holds
( b2 * (b2 " ) = 1. b1 & (b2 " ) * b2 = 1. b1 )
proof end;

definition
let c1 be non empty invertible cancelable multLoopStr ;
let c2, c3 be Element of c1;
func c2 / c3 -> Element of a1 equals :: ALGSTR_1:def 17
a2 * (a3 " );
correctness
coherence
c2 * (c3 " ) is Element of c1
;
;
end;

:: deftheorem Def17 defines / ALGSTR_1:def 17 :
for b1 being non empty invertible cancelable multLoopStr
for b2, b3 being Element of b1 holds b2 / b3 = b2 * (b3 " );

definition
canceled;
canceled;
canceled;
func multEX_0 -> strict multLoopStr_0 equals :: ALGSTR_1:def 21
multLoopStr_0(# REAL ,multreal ,1,0 #);
correctness
coherence
multLoopStr_0(# REAL ,multreal ,1,0 #) is strict multLoopStr_0
;
;
end;

:: deftheorem Def18 ALGSTR_1:def 18 :
canceled;

:: deftheorem Def19 ALGSTR_1:def 19 :
canceled;

:: deftheorem Def20 ALGSTR_1:def 20 :
canceled;

:: deftheorem Def21 defines multEX_0 ALGSTR_1:def 21 :
multEX_0 = multLoopStr_0(# REAL ,multreal ,1,0 #);

registration
cluster multEX_0 -> non empty strict ;
coherence
not multEX_0 is empty
proof end;
end;

Lemma37: for b1, b2 being Element of multEX_0
for b3, b4 being Real st b1 = b3 & b2 = b4 holds
b1 * b2 = b3 * b4
by BINOP_2:def 11;

E38: now
let c1, c2 be Element of multEX_0 ;
assume E39: c2 = 1 ;
reconsider c3 = c1 as Real ;
thus c1 * c2 = multreal . c3,1 by E39
.= c3 * 1 by BINOP_2:def 11
.= c1 ;
thus c2 * c1 = multreal . 1,c3 by E39
.= 1 * c3 by BINOP_2:def 11
.= c1 ;
end;

registration
cluster multEX_0 -> non empty unital strict ;
coherence
multEX_0 is unital
proof end;
end;

Lemma39: 0 = 0. multEX_0
;

Lemma40: 1 = 1. multEX_0
proof end;

theorem Th27: :: ALGSTR_1:27
canceled;

theorem Th28: :: ALGSTR_1:28
canceled;

theorem Th29: :: ALGSTR_1:29
canceled;

theorem Th30: :: ALGSTR_1:30
canceled;

theorem Th31: :: ALGSTR_1:31
canceled;

theorem Th32: :: ALGSTR_1:32
for b1, b2 being Real st b1 <> 0 holds
ex b3 being Real st b2 = b1 * b3
proof end;

theorem Th33: :: ALGSTR_1:33
for b1, b2 being Real st b1 <> 0 holds
ex b3 being Real st b2 = b3 * b1
proof end;

Lemma43: for b1, b2 being Element of multEX_0 st b1 <> 0. multEX_0 holds
ex b3 being Element of multEX_0 st b1 * b3 = b2
proof end;

Lemma44: for b1, b2 being Element of multEX_0 st b1 <> 0. multEX_0 holds
ex b3 being Element of multEX_0 st b3 * b1 = b2
proof end;

Lemma45: for b1, b2, b3 being Element of multEX_0 st b1 <> 0. multEX_0 & b1 * b2 = b1 * b3 holds
b2 = b3
proof end;

Lemma46: for b1, b2, b3 being Element of multEX_0 st b1 <> 0. multEX_0 & b2 * b1 = b3 * b1 holds
b2 = b3
proof end;

Lemma47: for b1 being Element of multEX_0 holds b1 * (0. multEX_0 ) = 0. multEX_0
proof end;

Lemma48: for b1 being Element of multEX_0 holds (0. multEX_0 ) * b1 = 0. multEX_0
proof end;

definition
let c1 be non empty multLoopStr_0 ;
attr a1 is almost_invertible means :Def22: :: ALGSTR_1:def 22
( ( for b1, b2 being Element of a1 st b1 <> 0. a1 holds
ex b3 being Element of a1 st b1 * b3 = b2 ) & ( for b1, b2 being Element of a1 st b1 <> 0. a1 holds
ex b3 being Element of a1 st b3 * b1 = b2 ) );
attr a1 is almost_cancelable means :Def23: :: ALGSTR_1:def 23
( ( for b1, b2, b3 being Element of a1 st b1 <> 0. a1 & b1 * b2 = b1 * b3 holds
b2 = b3 ) & ( for b1, b2, b3 being Element of a1 st b1 <> 0. a1 & b2 * b1 = b3 * b1 holds
b2 = b3 ) );
end;

:: deftheorem Def22 defines almost_invertible ALGSTR_1:def 22 :
for b1 being non empty multLoopStr_0 holds
( b1 is almost_invertible iff ( ( for b2, b3 being Element of b1 st b2 <> 0. b1 holds
ex b4 being Element of b1 st b2 * b4 = b3 ) & ( for b2, b3 being Element of b1 st b2 <> 0. b1 holds
ex b4 being Element of b1 st b4 * b2 = b3 ) ) );

:: deftheorem Def23 defines almost_cancelable ALGSTR_1:def 23 :
for b1 being non empty multLoopStr_0 holds
( b1 is almost_cancelable iff ( ( for b2, b3, b4 being Element of b1 st b2 <> 0. b1 & b2 * b3 = b2 * b4 holds
b3 = b4 ) & ( for b2, b3, b4 being Element of b1 st b2 <> 0. b1 & b3 * b2 = b4 * b2 holds
b3 = b4 ) ) );

definition
let c1 be non empty multLoopStr_0 ;
attr a1 is multLoop_0-like means :Def24: :: ALGSTR_1:def 24
( a1 is almost_invertible & a1 is almost_cancelable & ( for b1 being Element of a1 holds b1 * (0. a1) = 0. a1 ) & ( for b1 being Element of a1 holds (0. a1) * b1 = 0. a1 ) );
end;

:: deftheorem Def24 defines multLoop_0-like ALGSTR_1:def 24 :
for b1 being non empty multLoopStr_0 holds
( b1 is multLoop_0-like iff ( b1 is almost_invertible & b1 is almost_cancelable & ( for b2 being Element of b1 holds b2 * (0. b1) = 0. b1 ) & ( for b2 being Element of b1 holds (0. b1) * b2 = 0. b1 ) ) );

theorem Th34: :: ALGSTR_1:34
for b1 being non empty multLoopStr_0 holds
( b1 is multLoop_0-like iff ( ( for b2, b3 being Element of b1 st b2 <> 0. b1 holds
ex b4 being Element of b1 st b2 * b4 = b3 ) & ( for b2, b3 being Element of b1 st b2 <> 0. b1 holds
ex b4 being Element of b1 st b4 * b2 = b3 ) & ( for b2, b3, b4 being Element of b1 st b2 <> 0. b1 & b2 * b3 = b2 * b4 holds
b3 = b4 ) & ( for b2, b3, b4 being Element of b1 st b2 <> 0. b1 & b3 * b2 = b4 * b2 holds
b3 = b4 ) & ( for b2 being Element of b1 holds b2 * (0. b1) = 0. b1 ) & ( for b2 being Element of b1 holds (0. b1) * b2 = 0. b1 ) ) )
proof end;

registration
cluster non empty multLoop_0-like -> non empty almost_invertible almost_cancelable multLoopStr_0 ;
coherence
for b1 being non empty multLoopStr_0 st b1 is multLoop_0-like holds
( b1 is almost_invertible & b1 is almost_cancelable )
by Def24;
end;

registration
cluster non empty unital strict non degenerated almost_invertible almost_cancelable multLoop_0-like multLoopStr_0 ;
existence
ex b1 being non empty multLoopStr_0 st
( b1 is strict & b1 is unital & b1 is multLoop_0-like & not b1 is degenerated )
proof end;
end;

definition
mode multLoop_0 is non empty unital non degenerated multLoop_0-like multLoopStr_0 ;
end;

registration
cluster multEX_0 -> non empty unital strict almost_invertible almost_cancelable multLoop_0-like ;
coherence
( multEX_0 is unital & multEX_0 is multLoop_0-like )
by Lemma43, Lemma44, Lemma45, Lemma46, Lemma47, Lemma48, Th34;
end;

Lemma53: for b1, b2, b3 being Element of multEX_0 holds (b1 * b2) * b3 = b1 * (b2 * b3)
proof end;

registration
cluster associative strict multLoopStr_0 ;
existence
ex b1 being multLoop_0 st
( b1 is strict & b1 is associative & not b1 is degenerated )
proof end;
end;

definition
mode multGroup_0 is associative non degenerated multLoop_0;
end;

Lemma54: for b1 being non empty multLoopStr_0
for b2, b3 being Element of b1 st 0. b1 <> 1. b1 & ( for b4 being Element of b1 holds b4 * (1. b1) = b4 ) & ( for b4 being Element of b1 st b4 <> 0. b1 holds
ex b5 being Element of b1 st b4 * b5 = 1. b1 ) & ( for b4, b5, b6 being Element of b1 holds (b4 * b5) * b6 = b4 * (b5 * b6) ) & ( for b4 being Element of b1 holds b4 * (0. b1) = 0. b1 ) & b2 * b3 = 1. b1 holds
b3 * b2 = 1. b1
proof end;

Lemma55: for b1 being non empty multLoopStr_0
for b2 being Element of b1 st 0. b1 <> 1. b1 & ( for b3 being Element of b1 holds b3 * (1. b1) = b3 ) & ( for b3 being Element of b1 st b3 <> 0. b1 holds
ex b4 being Element of b1 st b3 * b4 = 1. b1 ) & ( for b3, b4, b5 being Element of b1 holds (b3 * b4) * b5 = b3 * (b4 * b5) ) & ( for b3 being Element of b1 holds b3 * (0. b1) = 0. b1 ) holds
(1. b1) * b2 = b2 * (1. b1)
proof end;

Lemma56: for b1 being non empty multLoopStr_0 st 0. b1 <> 1. b1 & ( for b2 being Element of b1 holds b2 * (1. b1) = b2 ) & ( for b2 being Element of b1 st b2 <> 0. b1 holds
ex b3 being Element of b1 st b2 * b3 = 1. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 * b3) * b4 = b2 * (b3 * b4) ) & ( for b2 being Element of b1 holds b2 * (0. b1) = 0. b1 ) holds
for b2 being Element of b1 st b2 <> 0. b1 holds
ex b3 being Element of b1 st b3 * b2 = 1. b1
proof end;

theorem Th35: :: ALGSTR_1:35
canceled;

theorem Th36: :: ALGSTR_1:36
for b1 being non empty multLoopStr_0 holds
( b1 is multGroup_0 iff ( 0. b1 <> 1. b1 & ( for b2 being Element of b1 holds b2 * (1. b1) = b2 ) & ( for b2 being Element of b1 st b2 <> 0. b1 holds
ex b3 being Element of b1 st b2 * b3 = 1. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 * b3) * b4 = b2 * (b3 * b4) ) & ( for b2 being Element of b1 holds b2 * (0. b1) = 0. b1 ) & ( for b2 being Element of b1 holds (0. b1) * b2 = 0. b1 ) ) )
proof end;

registration
cluster multEX_0 -> non empty unital associative strict almost_invertible almost_cancelable multLoop_0-like ;
coherence
multEX_0 is associative
by Lemma53, GROUP_1:def 4;
end;

Lemma58: for b1, b2 being Element of multEX_0 holds b1 * b2 = b2 * b1
proof end;

registration
cluster commutative strict multLoopStr_0 ;
existence
ex b1 being multGroup_0 st
( b1 is strict & b1 is commutative )
proof end;
end;

theorem Th37: :: ALGSTR_1:37
canceled;

theorem Th38: :: ALGSTR_1:38
for b1 being non empty multLoopStr_0 holds
( b1 is commutative multGroup_0 iff ( 0. b1 <> 1. b1 & ( for b2 being Element of b1 holds b2 * (1. b1) = b2 ) & ( for b2 being Element of b1 st b2 <> 0. b1 holds
ex b3 being Element of b1 st b2 * b3 = 1. b1 ) & ( for b2, b3, b4 being Element of b1 holds (b2 * b3) * b4 = b2 * (b3 * b4) ) & ( for b2 being Element of b1 holds b2 * (0. b1) = 0. b1 ) & ( for b2 being Element of b1 holds (0. b1) * b2 = 0. b1 ) & ( for b2, b3 being Element of b1 holds b2 * b3 = b3 * b2 ) ) ) by Th36, GROUP_1:def 16;

definition
let c1 be non empty almost_invertible almost_cancelable multLoopStr_0 ;
let c2 be Element of c1;
assume E59: c2 <> 0. c1 ;
func c2 " -> Element of a1 means :Def25: :: ALGSTR_1:def 25
a2 * a3 = 1. a1;
existence
ex b1 being Element of c1 st c2 * b1 = 1. c1
by E59, Def22;
uniqueness
for b1, b2 being Element of c1 st c2 * b1 = 1. c1 & c2 * b2 = 1. c1 holds
b1 = b2
by E59, Def23;
end;

:: deftheorem Def25 defines " ALGSTR_1:def 25 :
for b1 being non empty almost_invertible almost_cancelable multLoopStr_0
for b2 being Element of b1 st b2 <> 0. b1 holds
for b3 being Element of b1 holds
( b3 = b2 " iff b2 * b3 = 1. b1 );

theorem Th39: :: ALGSTR_1:39
canceled;

theorem Th40: :: ALGSTR_1:40
for b1 being non empty unital associative almost_invertible almost_cancelable multLoopStr_0
for b2 being Element of b1 st b2 <> 0. b1 holds
( b2 * (b2 " ) = 1. b1 & (b2 " ) * b2 = 1. b1 )
proof end;

definition
let c1 be non empty almost_invertible almost_cancelable multLoopStr_0 ;
let c2, c3 be Element of c1;
func c2 / c3 -> Element of a1 equals :: ALGSTR_1:def 26
a2 * (a3 " );
correctness
coherence
c2 * (c3 " ) is Element of c1
;
;
end;

:: deftheorem Def26 defines / ALGSTR_1:def 26 :
for b1 being non empty almost_invertible almost_cancelable multLoopStr_0
for b2, b3 being Element of b1 holds b2 / b3 = b2 * (b3 " );