:: LATTICE2 semantic presentation

theorem Th1: :: LATTICE2:1
canceled;

theorem Th2: :: LATTICE2:2
for b1 being set
for b2 being non empty set
for b3 being Subset of b1
for b4 being Function of b1,b2 holds dom (b4 | b3) = b3
proof end;

theorem Th3: :: LATTICE2:3
canceled;

theorem Th4: :: LATTICE2:4
canceled;

theorem Th5: :: LATTICE2:5
for b1 being set
for b2 being non empty set
for b3 being Subset of b1
for b4, b5 being Function of b1,b2 holds
( b4 | b3 = b5 | b3 iff for b6 being Element of b1 st b6 in b3 holds
b5 . b6 = b4 . b6 )
proof end;

theorem Th6: :: LATTICE2:6
for b1 being set
for b2 being non empty set
for b3, b4 being Function of b1,b2
for b5 being set holds b3 +* (b4 | b5) is Function of b1,b2
proof end;

theorem Th7: :: LATTICE2:7
for b1 being set
for b2 being non empty set
for b3 being Subset of b1
for b4, b5 being Function of b1,b2 holds (b4 | b3) +* b5 = b5
proof end;

theorem Th8: :: LATTICE2:8
for b1, b2 being Function st b2 <= b1 holds
b1 +* b2 = b1
proof end;

theorem Th9: :: LATTICE2:9
for b1 being set
for b2 being non empty set
for b3 being Subset of b1
for b4 being Function of b1,b2 holds b4 +* (b4 | b3) = b4
proof end;

theorem Th10: :: LATTICE2:10
for b1 being set
for b2 being non empty set
for b3 being Subset of b1
for b4, b5 being Function of b1,b2 st ( for b6 being Element of b1 st b6 in b3 holds
b4 . b6 = b5 . b6 ) holds
b5 +* (b4 | b3) = b5
proof end;

theorem Th11: :: LATTICE2:11
canceled;

theorem Th12: :: LATTICE2:12
for b1 being set
for b2 being non empty set
for b3, b4 being Function of b1,b2
for b5 being Finite_Subset of b1 holds (b3 | b5) +* b4 = b4
proof end;

theorem Th13: :: LATTICE2:13
for b1 being set
for b2 being non empty set
for b3 being Function of b1,b2
for b4 being Finite_Subset of b1 holds dom (b3 | b4) = b4
proof end;

theorem Th14: :: LATTICE2:14
for b1 being set
for b2 being non empty set
for b3, b4 being Function of b1,b2
for b5 being Finite_Subset of b1 st ( for b6 being Element of b1 st b6 in b5 holds
b3 . b6 = b4 . b6 ) holds
b4 +* (b3 | b5) = b4
proof end;

theorem Th15: :: LATTICE2:15
canceled;

theorem Th16: :: LATTICE2:16
for b1 being set
for b2 being non empty set
for b3, b4 being Function of b1,b2
for b5 being Finite_Subset of b1 st b3 | b5 = b4 | b5 holds
b3 .: b5 = b4 .: b5
proof end;

definition
let c1 be non empty set ;
let c2, c3 be BinOp of c1;
pred c2 absorbs c3 means :Def1: :: LATTICE2:def 1
for b1, b2 being Element of a1 holds a2 . b1,(a3 . b1,b2) = b1;
end;

:: deftheorem Def1 defines absorbs LATTICE2:def 1 :
for b1 being non empty set
for b2, b3 being BinOp of b1 holds
( b2 absorbs b3 iff for b4, b5 being Element of b1 holds b2 . b4,(b3 . b4,b5) = b4 );

notation
let c1 be non empty set ;
let c2, c3 be BinOp of c1;
antonym c2 doesn't_absorb c3 for c2 absorbs c3;
end;

theorem Th17: :: LATTICE2:17
for b1 being non empty LattStr st the L_join of b1 is commutative & the L_join of b1 is associative & the L_meet of b1 is commutative & the L_meet of b1 is associative & the L_join of b1 absorbs the L_meet of b1 & the L_meet of b1 absorbs the L_join of b1 holds
b1 is Lattice-like
proof end;

definition
let c1 be LattStr ;
func c1 .: -> strict LattStr equals :: LATTICE2:def 2
LattStr(# the carrier of a1,the L_meet of a1,the L_join of a1 #);
correctness
coherence
LattStr(# the carrier of c1,the L_meet of c1,the L_join of c1 #) is strict LattStr
;
;
end;

:: deftheorem Def2 defines .: LATTICE2:def 2 :
for b1 being LattStr holds b1 .: = LattStr(# the carrier of b1,the L_meet of b1,the L_join of b1 #);

registration
let c1 be non empty LattStr ;
cluster a1 .: -> non empty strict ;
coherence
not c1 .: is empty
;
end;

theorem Th18: :: LATTICE2:18
for b1 being non empty LattStr holds
( the carrier of b1 = the carrier of (b1 .: ) & the L_join of b1 = the L_meet of (b1 .: ) & the L_meet of b1 = the L_join of (b1 .: ) ) ;

theorem Th19: :: LATTICE2:19
for b1 being non empty strict LattStr holds (b1 .: ) .: = b1 ;

theorem Th20: :: LATTICE2:20
canceled;

theorem Th21: :: LATTICE2:21
for b1 being Lattice
for b2 being Element of b1 st ( for b3 being Element of b1 holds b2 "\/" b3 = b3 ) holds
b2 = Bottom b1
proof end;

theorem Th22: :: LATTICE2:22
for b1 being Lattice
for b2 being Element of b1 st ( for b3 being Element of b1 holds the L_join of b1 . b2,b3 = b3 ) holds
b2 = Bottom b1
proof end;

theorem Th23: :: LATTICE2:23
canceled;

theorem Th24: :: LATTICE2:24
for b1 being Lattice
for b2 being Element of b1 st ( for b3 being Element of b1 holds b2 "/\" b3 = b3 ) holds
b2 = Top b1
proof end;

theorem Th25: :: LATTICE2:25
for b1 being Lattice
for b2 being Element of b1 st ( for b3 being Element of b1 holds the L_meet of b1 . b2,b3 = b3 ) holds
b2 = Top b1
proof end;

theorem Th26: :: LATTICE2:26
for b1 being Lattice holds the L_join of b1 is idempotent
proof end;

theorem Th27: :: LATTICE2:27
for b1 being non empty join-commutative \/-SemiLattStr holds the L_join of b1 is commutative
proof end;

theorem Th28: :: LATTICE2:28
for b1 being Lattice st the L_join of b1 has_a_unity holds
Bottom b1 = the_unity_wrt the L_join of b1
proof end;

theorem Th29: :: LATTICE2:29
for b1 being non empty join-associative \/-SemiLattStr holds the L_join of b1 is associative
proof end;

theorem Th30: :: LATTICE2:30
for b1 being Lattice holds the L_meet of b1 is idempotent
proof end;

theorem Th31: :: LATTICE2:31
for b1 being non empty meet-commutative /\-SemiLattStr holds the L_meet of b1 is commutative
proof end;

theorem Th32: :: LATTICE2:32
for b1 being non empty meet-associative /\-SemiLattStr holds the L_meet of b1 is associative
proof end;

registration
let c1 be non empty join-commutative \/-SemiLattStr ;
cluster the L_join of a1 -> commutative ;
coherence
the L_join of c1 is commutative
by Th27;
end;

registration
let c1 be non empty join-associative \/-SemiLattStr ;
cluster the L_join of a1 -> associative ;
coherence
the L_join of c1 is associative
by Th29;
end;

registration
let c1 be non empty meet-commutative /\-SemiLattStr ;
cluster the L_meet of a1 -> commutative ;
coherence
the L_meet of c1 is commutative
by Th31;
end;

registration
let c1 be non empty meet-associative /\-SemiLattStr ;
cluster the L_meet of a1 -> associative ;
coherence
the L_meet of c1 is associative
by Th32;
end;

theorem Th33: :: LATTICE2:33
for b1 being Lattice st the L_meet of b1 has_a_unity holds
Top b1 = the_unity_wrt the L_meet of b1
proof end;

theorem Th34: :: LATTICE2:34
for b1 being Lattice holds the L_join of b1 is_distributive_wrt the L_join of b1
proof end;

theorem Th35: :: LATTICE2:35
for b1 being Lattice st b1 is D_Lattice holds
the L_join of b1 is_distributive_wrt the L_meet of b1
proof end;

theorem Th36: :: LATTICE2:36
for b1 being Lattice st the L_join of b1 is_distributive_wrt the L_meet of b1 holds
b1 is distributive
proof end;

theorem Th37: :: LATTICE2:37
for b1 being Lattice st b1 is D_Lattice holds
the L_meet of b1 is_distributive_wrt the L_join of b1
proof end;

theorem Th38: :: LATTICE2:38
for b1 being Lattice st the L_meet of b1 is_distributive_wrt the L_join of b1 holds
b1 is distributive
proof end;

theorem Th39: :: LATTICE2:39
for b1 being Lattice holds the L_meet of b1 is_distributive_wrt the L_meet of b1
proof end;

theorem Th40: :: LATTICE2:40
for b1 being Lattice holds the L_join of b1 absorbs the L_meet of b1
proof end;

theorem Th41: :: LATTICE2:41
for b1 being Lattice holds the L_meet of b1 absorbs the L_join of b1
proof end;

definition
let c1 be non empty set ;
let c2 be Lattice;
let c3 be Finite_Subset of c1;
let c4 be Function of c1,the carrier of c2;
func FinJoin c3,c4 -> Element of a2 equals :: LATTICE2:def 3
the L_join of a2 $$ a3,a4;
correctness
coherence
the L_join of c2 $$ c3,c4 is Element of c2
;
;
func FinMeet c3,c4 -> Element of a2 equals :: LATTICE2:def 4
the L_meet of a2 $$ a3,a4;
correctness
coherence
the L_meet of c2 $$ c3,c4 is Element of c2
;
;
end;

:: deftheorem Def3 defines FinJoin LATTICE2:def 3 :
for b1 being non empty set
for b2 being Lattice
for b3 being Finite_Subset of b1
for b4 being Function of b1,the carrier of b2 holds FinJoin b3,b4 = the L_join of b2 $$ b3,b4;

:: deftheorem Def4 defines FinMeet LATTICE2:def 4 :
for b1 being non empty set
for b2 being Lattice
for b3 being Finite_Subset of b1
for b4 being Function of b1,the carrier of b2 holds FinMeet b3,b4 = the L_meet of b2 $$ b3,b4;

theorem Th42: :: LATTICE2:42
canceled;

theorem Th43: :: LATTICE2:43
for b1 being Lattice
for b2 being non empty set
for b3 being Element of b2
for b4 being Finite_Subset of b2
for b5 being Function of b2,the carrier of b1 st b3 in b4 holds
b5 . b3 [= FinJoin b4,b5
proof end;

theorem Th44: :: LATTICE2:44
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st ex b6 being Element of b3 st
( b6 in b4 & b2 [= b5 . b6 ) holds
b2 [= FinJoin b4,b5
proof end;

theorem Th45: :: LATTICE2:45
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st ( for b6 being Element of b3 st b6 in b4 holds
b5 . b6 = b2 ) & b4 <> {} holds
FinJoin b4,b5 = b2
proof end;

theorem Th46: :: LATTICE2:46
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st FinJoin b4,b5 [= b2 holds
for b6 being Element of b3 st b6 in b4 holds
b5 . b6 [= b2
proof end;

theorem Th47: :: LATTICE2:47
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st b4 <> {} & ( for b6 being Element of b3 st b6 in b4 holds
b5 . b6 [= b2 ) holds
FinJoin b4,b5 [= b2
proof end;

theorem Th48: :: LATTICE2:48
for b1 being Lattice
for b2 being non empty set
for b3 being Finite_Subset of b2
for b4, b5 being Function of b2,the carrier of b1 st b3 <> {} & ( for b6 being Element of b2 st b6 in b3 holds
b4 . b6 [= b5 . b6 ) holds
FinJoin b3,b4 [= FinJoin b3,b5
proof end;

theorem Th49: :: LATTICE2:49
for b1 being Lattice
for b2 being non empty set
for b3 being Finite_Subset of b2
for b4, b5 being Function of b2,the carrier of b1 st b3 <> {} & b4 | b3 = b5 | b3 holds
FinJoin b3,b4 = FinJoin b3,b5
proof end;

theorem Th50: :: LATTICE2:50
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st b4 <> {} holds
b2 "\/" (FinJoin b4,b5) = FinJoin b4,(the L_join of b1 [;] b2,b5)
proof end;

registration
let c1 be Lattice;
cluster a1 .: -> non empty strict Lattice-like ;
coherence
c1 .: is Lattice-like
proof end;
end;

theorem Th51: :: LATTICE2:51
for b1 being non empty set
for b2 being Lattice
for b3 being Finite_Subset of b1
for b4 being Function of b1,the carrier of b2
for b5 being Function of b1,the carrier of (b2 .: ) st b4 = b5 holds
( FinJoin b3,b4 = FinMeet b3,b5 & FinMeet b3,b4 = FinJoin b3,b5 ) ;

theorem Th52: :: LATTICE2:52
for b1 being Lattice
for b2, b3 being Element of b1
for b4, b5 being Element of (b1 .: ) st b2 = b4 & b3 = b5 holds
( b2 "/\" b3 = b4 "\/" b5 & b2 "\/" b3 = b4 "/\" b5 ) ;

theorem Th53: :: LATTICE2:53
for b1 being Lattice
for b2, b3 being Element of b1 st b2 [= b3 holds
for b4, b5 being Element of (b1 .: ) st b2 = b4 & b3 = b5 holds
b5 [= b4
proof end;

theorem Th54: :: LATTICE2:54
for b1 being Lattice
for b2, b3 being Element of b1
for b4, b5 being Element of (b1 .: ) st b4 [= b5 & b2 = b4 & b3 = b5 holds
b3 [= b2
proof end;

theorem Th55: :: LATTICE2:55
for b1 being Lattice
for b2 being non empty set
for b3 being Element of b2
for b4 being Finite_Subset of b2
for b5 being Function of b2,the carrier of b1 st b3 in b4 holds
FinMeet b4,b5 [= b5 . b3
proof end;

theorem Th56: :: LATTICE2:56
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st ex b6 being Element of b3 st
( b6 in b4 & b5 . b6 [= b2 ) holds
FinMeet b4,b5 [= b2
proof end;

theorem Th57: :: LATTICE2:57
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st ( for b6 being Element of b3 st b6 in b4 holds
b5 . b6 = b2 ) & b4 <> {} holds
FinMeet b4,b5 = b2
proof end;

theorem Th58: :: LATTICE2:58
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st b4 <> {} holds
b2 "/\" (FinMeet b4,b5) = FinMeet b4,(the L_meet of b1 [;] b2,b5)
proof end;

theorem Th59: :: LATTICE2:59
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st b2 [= FinMeet b4,b5 holds
for b6 being Element of b3 st b6 in b4 holds
b2 [= b5 . b6
proof end;

theorem Th60: :: LATTICE2:60
for b1 being Lattice
for b2 being non empty set
for b3 being Finite_Subset of b2
for b4, b5 being Function of b2,the carrier of b1 st b3 <> {} & b4 | b3 = b5 | b3 holds
FinMeet b3,b4 = FinMeet b3,b5
proof end;

theorem Th61: :: LATTICE2:61
for b1 being Lattice
for b2 being Element of b1
for b3 being non empty set
for b4 being Finite_Subset of b3
for b5 being Function of b3,the carrier of b1 st b4 <> {} & ( for b6 being Element of b3 st b6 in b4 holds
b2 [= b5 . b6 ) holds
b2 [= FinMeet b4,b5
proof end;

theorem Th62: :: LATTICE2:62
for b1 being Lattice
for b2 being non empty set
for b3 being Finite_Subset of b2
for b4, b5 being Function of b2,the carrier of b1 st b3 <> {} & ( for b6 being Element of b2 st b6 in b3 holds
b4 . b6 [= b5 . b6 ) holds
FinMeet b3,b4 [= FinMeet b3,b5
proof end;

theorem Th63: :: LATTICE2:63
for b1 being Lattice holds
( b1 is lower-bounded iff b1 .: is upper-bounded )
proof end;

theorem Th64: :: LATTICE2:64
for b1 being Lattice holds
( b1 is upper-bounded iff b1 .: is lower-bounded )
proof end;

theorem Th65: :: LATTICE2:65
for b1 being Lattice holds
( b1 is D_Lattice iff b1 .: is D_Lattice )
proof end;

theorem Th66: :: LATTICE2:66
for b1 being 0_Lattice holds Bottom b1 is_a_unity_wrt the L_join of b1
proof end;

theorem Th67: :: LATTICE2:67
for b1 being 0_Lattice holds the L_join of b1 has_a_unity
proof end;

theorem Th68: :: LATTICE2:68
for b1 being 0_Lattice holds Bottom b1 = the_unity_wrt the L_join of b1
proof end;

theorem Th69: :: LATTICE2:69
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being 0_Lattice
for b4, b5 being Function of b1,the carrier of b3 st b4 | b2 = b5 | b2 holds
FinJoin b2,b4 = FinJoin b2,b5
proof end;

theorem Th70: :: LATTICE2:70
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being 0_Lattice
for b4 being Function of b1,the carrier of b3
for b5 being Element of b3 st ( for b6 being Element of b1 st b6 in b2 holds
b4 . b6 [= b5 ) holds
FinJoin b2,b4 [= b5
proof end;

theorem Th71: :: LATTICE2:71
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being 0_Lattice
for b4, b5 being Function of b1,the carrier of b3 st ( for b6 being Element of b1 st b6 in b2 holds
b4 . b6 [= b5 . b6 ) holds
FinJoin b2,b4 [= FinJoin b2,b5
proof end;

theorem Th72: :: LATTICE2:72
for b1 being 1_Lattice holds Top b1 is_a_unity_wrt the L_meet of b1
proof end;

theorem Th73: :: LATTICE2:73
for b1 being 1_Lattice holds the L_meet of b1 has_a_unity
proof end;

theorem Th74: :: LATTICE2:74
for b1 being 1_Lattice holds Top b1 = the_unity_wrt the L_meet of b1
proof end;

theorem Th75: :: LATTICE2:75
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being 1_Lattice
for b4, b5 being Function of b1,the carrier of b3 st b4 | b2 = b5 | b2 holds
FinMeet b2,b4 = FinMeet b2,b5
proof end;

theorem Th76: :: LATTICE2:76
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being 1_Lattice
for b4 being Function of b1,the carrier of b3
for b5 being Element of b3 st ( for b6 being Element of b1 st b6 in b2 holds
b5 [= b4 . b6 ) holds
b5 [= FinMeet b2,b4
proof end;

theorem Th77: :: LATTICE2:77
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being 1_Lattice
for b4, b5 being Function of b1,the carrier of b3 st ( for b6 being Element of b1 st b6 in b2 holds
b4 . b6 [= b5 . b6 ) holds
FinMeet b2,b4 [= FinMeet b2,b5
proof end;

theorem Th78: :: LATTICE2:78
for b1 being 0_Lattice holds Bottom b1 = Top (b1 .: )
proof end;

theorem Th79: :: LATTICE2:79
for b1 being 1_Lattice holds Top b1 = Bottom (b1 .: )
proof end;

definition
mode D0_Lattice is distributive lower-bounded Lattice;
end;

theorem Th80: :: LATTICE2:80
for b1 being D0_Lattice holds the L_meet of b1 is_distributive_wrt the L_join of b1 by Th37;

theorem Th81: :: LATTICE2:81
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being D0_Lattice
for b4 being Function of b1,the carrier of b3
for b5 being Element of b3 holds the L_meet of b3 . b5,(FinJoin b2,b4) = FinJoin b2,(the L_meet of b3 [;] b5,b4)
proof end;

theorem Th82: :: LATTICE2:82
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being D0_Lattice
for b4, b5 being Function of b1,the carrier of b3
for b6 being Element of b3 st ( for b7 being Element of b1 st b7 in b2 holds
b4 . b7 = b6 "/\" (b5 . b7) ) holds
b6 "/\" (FinJoin b2,b5) = FinJoin b2,b4
proof end;

theorem Th83: :: LATTICE2:83
for b1 being non empty set
for b2 being Finite_Subset of b1
for b3 being D0_Lattice
for b4 being Function of b1,the carrier of b3
for b5 being Element of b3 holds b5 "/\" (FinJoin b2,b4) = FinJoin b2,(the L_meet of b3 [;] b5,b4) by Th81;

definition
let c1 be Lattice;
canceled;
attr a1 is Heyting means :Def6: :: LATTICE2:def 6
( a1 is implicative & a1 is lower-bounded );
end;

:: deftheorem Def5 LATTICE2:def 5 :
canceled;

:: deftheorem Def6 defines Heyting LATTICE2:def 6 :
for b1 being Lattice holds
( b1 is Heyting iff ( b1 is implicative & b1 is lower-bounded ) );

registration
cluster Heyting LattStr ;
existence
ex b1 being Lattice st b1 is Heyting
proof end;
end;

registration
cluster Heyting -> lower-bounded implicative LattStr ;
coherence
for b1 being Lattice st b1 is Heyting holds
( b1 is implicative & b1 is lower-bounded )
by Def6;
cluster lower-bounded implicative -> Heyting LattStr ;
coherence
for b1 being Lattice st b1 is implicative & b1 is lower-bounded holds
b1 is Heyting
by Def6;
end;

definition
mode H_Lattice is Heyting Lattice;
end;

registration
cluster strict lower-bounded implicative Heyting LattStr ;
existence
ex b1 being Lattice st
( b1 is Heyting & b1 is strict )
proof end;
end;

theorem Th84: :: LATTICE2:84
for b1 being 0_Lattice holds
( b1 is H_Lattice iff for b2, b3 being Element of b1 ex b4 being Element of b1 st
( b2 "/\" b4 [= b3 & ( for b5 being Element of b1 st b2 "/\" b5 [= b3 holds
b5 [= b4 ) ) )
proof end;

theorem Th85: :: LATTICE2:85
for b1 being Lattice holds
( b1 is finite iff b1 .: is finite )
proof end;

Lemma54: for b1 being Lattice st b1 is finite holds
b1 is lower-bounded
proof end;

Lemma55: for b1 being Lattice st b1 is finite holds
b1 is upper-bounded
proof end;

registration
cluster finite -> lower-bounded LattStr ;
coherence
for b1 being Lattice st b1 is finite holds
b1 is lower-bounded
by Lemma54;
cluster finite -> upper-bounded LattStr ;
coherence
for b1 being Lattice st b1 is finite holds
b1 is upper-bounded
by Lemma55;
end;

registration
cluster finite -> bounded LattStr ;
coherence
for b1 being Lattice st b1 is finite holds
b1 is bounded
proof end;
end;

registration
cluster finite distributive -> lower-bounded implicative Heyting LattStr ;
coherence
for b1 being Lattice st b1 is distributive & b1 is finite holds
b1 is Heyting
proof end;
end;