:: FUNCT_6 semantic presentation

theorem Th1: :: FUNCT_6:1
for b1, b2 being set holds
( b1 in product <*b2*> iff ex b3 being set st
( b3 in b2 & b1 = <*b3*> ) )
proof end;

theorem Th2: :: FUNCT_6:2
for b1, b2, b3 being set holds
( b1 in product <*b2,b3*> iff ex b4, b5 being set st
( b4 in b2 & b5 in b3 & b1 = <*b4,b5*> ) )
proof end;

theorem Th3: :: FUNCT_6:3
for b1, b2, b3, b4 being set holds
( b1 in product <*b2,b3,b4*> iff ex b5, b6, b7 being set st
( b5 in b2 & b6 in b3 & b7 in b4 & b1 = <*b5,b6,b7*> ) )
proof end;

theorem Th4: :: FUNCT_6:4
for b1 being non empty set holds product <*b1*> = 1 -tuples_on b1
proof end;

theorem Th5: :: FUNCT_6:5
for b1, b2 being non empty set holds product <*b1,b2*> = { <*b3,b4*> where B is Element of b1, B is Element of b2 : verum }
proof end;

theorem Th6: :: FUNCT_6:6
for b1 being non empty set holds product <*b1,b1*> = 2 -tuples_on b1
proof end;

theorem Th7: :: FUNCT_6:7
for b1, b2, b3 being non empty set holds product <*b1,b2,b3*> = { <*b4,b5,b6*> where B is Element of b1, B is Element of b2, B is Element of b3 : verum }
proof end;

theorem Th8: :: FUNCT_6:8
for b1 being non empty set holds product <*b1,b1,b1*> = 3 -tuples_on b1
proof end;

theorem Th9: :: FUNCT_6:9
for b1 being Nat
for b2 being non empty set holds product (b1 |-> b2) = b1 -tuples_on b2
proof end;

theorem Th10: :: FUNCT_6:10
for b1 being Function holds product b1 c= Funcs (dom b1),(Union b1)
proof end;

theorem Th11: :: FUNCT_6:11
for b1 being set
for b2 being Function st b1 in dom (~ b2) holds
ex b3, b4 being set st b1 = [b3,b4]
proof end;

theorem Th12: :: FUNCT_6:12
for b1, b2, b3 being set holds ~ ([:b1,b2:] --> b3) = [:b2,b1:] --> b3
proof end;

theorem Th13: :: FUNCT_6:13
for b1 being Function holds
( curry b1 = curry' (~ b1) & uncurry b1 = ~ (uncurry' b1) )
proof end;

theorem Th14: :: FUNCT_6:14
for b1, b2, b3 being set st [:b1,b2:] <> {} holds
( curry ([:b1,b2:] --> b3) = b1 --> (b2 --> b3) & curry' ([:b1,b2:] --> b3) = b2 --> (b1 --> b3) )
proof end;

theorem Th15: :: FUNCT_6:15
for b1, b2, b3 being set holds
( uncurry (b1 --> (b2 --> b3)) = [:b1,b2:] --> b3 & uncurry' (b1 --> (b2 --> b3)) = [:b2,b1:] --> b3 )
proof end;

theorem Th16: :: FUNCT_6:16
for b1 being set
for b2, b3 being Function st b1 in dom b2 & b3 = b2 . b1 holds
( rng b3 c= rng (uncurry b2) & rng b3 c= rng (uncurry' b2) )
proof end;

theorem Th17: :: FUNCT_6:17
for b1 being set
for b2 being Function holds
( dom (uncurry (b1 --> b2)) = [:b1,(dom b2):] & rng (uncurry (b1 --> b2)) c= rng b2 & dom (uncurry' (b1 --> b2)) = [:(dom b2),b1:] & rng (uncurry' (b1 --> b2)) c= rng b2 )
proof end;

theorem Th18: :: FUNCT_6:18
for b1 being set
for b2 being Function st b1 <> {} holds
( rng (uncurry (b1 --> b2)) = rng b2 & rng (uncurry' (b1 --> b2)) = rng b2 )
proof end;

theorem Th19: :: FUNCT_6:19
for b1, b2, b3 being set
for b4 being Function st [:b1,b2:] <> {} & b4 in Funcs [:b1,b2:],b3 holds
( curry b4 in Funcs b1,(Funcs b2,b3) & curry' b4 in Funcs b2,(Funcs b1,b3) )
proof end;

theorem Th20: :: FUNCT_6:20
for b1, b2, b3 being set
for b4 being Function st b4 in Funcs b1,(Funcs b2,b3) holds
( uncurry b4 in Funcs [:b1,b2:],b3 & uncurry' b4 in Funcs [:b2,b1:],b3 )
proof end;

theorem Th21: :: FUNCT_6:21
for b1, b2, b3, b4, b5 being set
for b6 being Function st ( curry b6 in Funcs b1,(Funcs b2,b3) or curry' b6 in Funcs b2,(Funcs b1,b3) ) & dom b6 c= [:b4,b5:] holds
b6 in Funcs [:b1,b2:],b3
proof end;

theorem Th22: :: FUNCT_6:22
for b1, b2, b3, b4, b5 being set
for b6 being Function st ( uncurry b6 in Funcs [:b1,b2:],b3 or uncurry' b6 in Funcs [:b2,b1:],b3 ) & rng b6 c= PFuncs b4,b5 & dom b6 = b1 holds
b6 in Funcs b1,(Funcs b2,b3)
proof end;

theorem Th23: :: FUNCT_6:23
for b1, b2, b3 being set
for b4 being Function st b4 in PFuncs [:b1,b2:],b3 holds
( curry b4 in PFuncs b1,(PFuncs b2,b3) & curry' b4 in PFuncs b2,(PFuncs b1,b3) )
proof end;

theorem Th24: :: FUNCT_6:24
for b1, b2, b3 being set
for b4 being Function st b4 in PFuncs b1,(PFuncs b2,b3) holds
( uncurry b4 in PFuncs [:b1,b2:],b3 & uncurry' b4 in PFuncs [:b2,b1:],b3 )
proof end;

theorem Th25: :: FUNCT_6:25
for b1, b2, b3, b4, b5 being set
for b6 being Function st ( curry b6 in PFuncs b1,(PFuncs b2,b3) or curry' b6 in PFuncs b2,(PFuncs b1,b3) ) & dom b6 c= [:b4,b5:] holds
b6 in PFuncs [:b1,b2:],b3
proof end;

theorem Th26: :: FUNCT_6:26
for b1, b2, b3, b4, b5 being set
for b6 being Function st ( uncurry b6 in PFuncs [:b1,b2:],b3 or uncurry' b6 in PFuncs [:b2,b1:],b3 ) & rng b6 c= PFuncs b4,b5 & dom b6 c= b1 holds
b6 in PFuncs b1,(PFuncs b2,b3)
proof end;

definition
let c1 be set ;
func SubFuncs c1 -> set means :Def1: :: FUNCT_6:def 1
for b1 being set holds
( b1 in a2 iff ( b1 in a1 & b1 is Function ) );
existence
ex b1 being set st
for b2 being set holds
( b2 in b1 iff ( b2 in c1 & b2 is Function ) )
proof end;
uniqueness
for b1, b2 being set st ( for b3 being set holds
( b3 in b1 iff ( b3 in c1 & b3 is Function ) ) ) & ( for b3 being set holds
( b3 in b2 iff ( b3 in c1 & b3 is Function ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def1 defines SubFuncs FUNCT_6:def 1 :
for b1 being set
for b2 being set holds
( b2 = SubFuncs b1 iff for b3 being set holds
( b3 in b2 iff ( b3 in b1 & b3 is Function ) ) );

theorem Th27: :: FUNCT_6:27
for b1 being set holds SubFuncs b1 c= b1
proof end;

theorem Th28: :: FUNCT_6:28
for b1 being set
for b2 being Function holds
( b1 in b2 " (SubFuncs (rng b2)) iff ( b1 in dom b2 & b2 . b1 is Function ) )
proof end;

Lemma18: for b1 being set st ( for b2 being set st b2 in b1 holds
b2 is Function ) holds
SubFuncs b1 = b1
proof end;

theorem Th29: :: FUNCT_6:29
for b1, b2, b3 being Function holds
( SubFuncs {} = {} & SubFuncs {b1} = {b1} & SubFuncs {b1,b2} = {b1,b2} & SubFuncs {b1,b2,b3} = {b1,b2,b3} )
proof end;

theorem Th30: :: FUNCT_6:30
for b1, b2 being set st b1 c= SubFuncs b2 holds
SubFuncs b1 = b1
proof end;

definition
let c1 be Function;
func doms c1 -> Function means :Def2: :: FUNCT_6:def 2
( dom a2 = a1 " (SubFuncs (rng a1)) & ( for b1 being set st b1 in a1 " (SubFuncs (rng a1)) holds
a2 . b1 = proj1 (a1 . b1) ) );
existence
ex b1 being Function st
( dom b1 = c1 " (SubFuncs (rng c1)) & ( for b2 being set st b2 in c1 " (SubFuncs (rng c1)) holds
b1 . b2 = proj1 (c1 . b2) ) )
proof end;
uniqueness
for b1, b2 being Function st dom b1 = c1 " (SubFuncs (rng c1)) & ( for b3 being set st b3 in c1 " (SubFuncs (rng c1)) holds
b1 . b3 = proj1 (c1 . b3) ) & dom b2 = c1 " (SubFuncs (rng c1)) & ( for b3 being set st b3 in c1 " (SubFuncs (rng c1)) holds
b2 . b3 = proj1 (c1 . b3) ) holds
b1 = b2
proof end;
func rngs c1 -> Function means :Def3: :: FUNCT_6:def 3
( dom a2 = a1 " (SubFuncs (rng a1)) & ( for b1 being set st b1 in a1 " (SubFuncs (rng a1)) holds
a2 . b1 = proj2 (a1 . b1) ) );
existence
ex b1 being Function st
( dom b1 = c1 " (SubFuncs (rng c1)) & ( for b2 being set st b2 in c1 " (SubFuncs (rng c1)) holds
b1 . b2 = proj2 (c1 . b2) ) )
proof end;
uniqueness
for b1, b2 being Function st dom b1 = c1 " (SubFuncs (rng c1)) & ( for b3 being set st b3 in c1 " (SubFuncs (rng c1)) holds
b1 . b3 = proj2 (c1 . b3) ) & dom b2 = c1 " (SubFuncs (rng c1)) & ( for b3 being set st b3 in c1 " (SubFuncs (rng c1)) holds
b2 . b3 = proj2 (c1 . b3) ) holds
b1 = b2
proof end;
func meet c1 -> set equals :: FUNCT_6:def 4
meet (rng a1);
correctness
coherence
meet (rng c1) is set
;
;
end;

:: deftheorem Def2 defines doms FUNCT_6:def 2 :
for b1, b2 being Function holds
( b2 = doms b1 iff ( dom b2 = b1 " (SubFuncs (rng b1)) & ( for b3 being set st b3 in b1 " (SubFuncs (rng b1)) holds
b2 . b3 = proj1 (b1 . b3) ) ) );

:: deftheorem Def3 defines rngs FUNCT_6:def 3 :
for b1, b2 being Function holds
( b2 = rngs b1 iff ( dom b2 = b1 " (SubFuncs (rng b1)) & ( for b3 being set st b3 in b1 " (SubFuncs (rng b1)) holds
b2 . b3 = proj2 (b1 . b3) ) ) );

:: deftheorem Def4 defines meet FUNCT_6:def 4 :
for b1 being Function holds meet b1 = meet (rng b1);

theorem Th31: :: FUNCT_6:31
for b1 being set
for b2, b3 being Function st b1 in dom b2 & b3 = b2 . b1 holds
( b1 in dom (doms b2) & (doms b2) . b1 = dom b3 & b1 in dom (rngs b2) & (rngs b2) . b1 = rng b3 )
proof end;

theorem Th32: :: FUNCT_6:32
( doms {} = {} & rngs {} = {} )
proof end;

theorem Th33: :: FUNCT_6:33
for b1 being Function holds
( doms <*b1*> = <*(dom b1)*> & rngs <*b1*> = <*(rng b1)*> )
proof end;

theorem Th34: :: FUNCT_6:34
for b1, b2 being Function holds
( doms <*b1,b2*> = <*(dom b1),(dom b2)*> & rngs <*b1,b2*> = <*(rng b1),(rng b2)*> )
proof end;

theorem Th35: :: FUNCT_6:35
for b1, b2, b3 being Function holds
( doms <*b1,b2,b3*> = <*(dom b1),(dom b2),(dom b3)*> & rngs <*b1,b2,b3*> = <*(rng b1),(rng b2),(rng b3)*> )
proof end;

theorem Th36: :: FUNCT_6:36
for b1 being set
for b2 being Function holds
( doms (b1 --> b2) = b1 --> (dom b2) & rngs (b1 --> b2) = b1 --> (rng b2) )
proof end;

theorem Th37: :: FUNCT_6:37
for b1 being set
for b2 being Function st b2 <> {} holds
( b1 in meet b2 iff for b3 being set st b3 in dom b2 holds
b1 in b2 . b3 )
proof end;

theorem Th38: :: FUNCT_6:38
meet {} = {} by SETFAM_1:2;

theorem Th39: :: FUNCT_6:39
for b1 being set holds
( Union <*b1*> = b1 & meet <*b1*> = b1 )
proof end;

theorem Th40: :: FUNCT_6:40
for b1, b2 being set holds
( Union <*b1,b2*> = b1 \/ b2 & meet <*b1,b2*> = b1 /\ b2 )
proof end;

theorem Th41: :: FUNCT_6:41
for b1, b2, b3 being set holds
( Union <*b1,b2,b3*> = (b1 \/ b2) \/ b3 & meet <*b1,b2,b3*> = (b1 /\ b2) /\ b3 )
proof end;

theorem Th42: :: FUNCT_6:42
for b1 being set holds
( Union ({} --> b1) = {} & meet ({} --> b1) = {} )
proof end;

theorem Th43: :: FUNCT_6:43
for b1, b2 being set st b1 <> {} holds
( Union (b1 --> b2) = b2 & meet (b1 --> b2) = b2 )
proof end;

definition
let c1 be Function;
let c2, c3 be set ;
func c1 .. c2,c3 -> set equals :: FUNCT_6:def 5
(uncurry a1) . [a2,a3];
correctness
coherence
(uncurry c1) . [c2,c3] is set
;
;
end;

:: deftheorem Def5 defines .. FUNCT_6:def 5 :
for b1 being Function
for b2, b3 being set holds b1 .. b2,b3 = (uncurry b1) . [b2,b3];

theorem Th44: :: FUNCT_6:44
for b1, b2 being set
for b3, b4 being Function st b1 in dom b3 & b4 = b3 . b1 & b2 in dom b4 holds
b3 .. b1,b2 = b4 . b2 by FUNCT_5:45;

theorem Th45: :: FUNCT_6:45
for b1 being set
for b2, b3, b4 being Function st b1 in dom b2 holds
( <*b2*> .. 1,b1 = b2 . b1 & <*b2,b3*> .. 1,b1 = b2 . b1 & <*b2,b3,b4*> .. 1,b1 = b2 . b1 )
proof end;

theorem Th46: :: FUNCT_6:46
for b1 being set
for b2, b3, b4 being Function st b1 in dom b2 holds
( <*b3,b2*> .. 2,b1 = b2 . b1 & <*b3,b2,b4*> .. 2,b1 = b2 . b1 )
proof end;

theorem Th47: :: FUNCT_6:47
for b1 being set
for b2, b3, b4 being Function st b1 in dom b2 holds
<*b3,b4,b2*> .. 3,b1 = b2 . b1
proof end;

theorem Th48: :: FUNCT_6:48
for b1, b2, b3 being set
for b4 being Function st b1 in b2 & b3 in dom b4 holds
(b2 --> b4) .. b1,b3 = b4 . b3
proof end;

definition
let c1 be Function;
func <:c1:> -> Function equals :: FUNCT_6:def 6
curry ((uncurry' a1) | [:(meet (doms a1)),(dom a1):]);
correctness
coherence
curry ((uncurry' c1) | [:(meet (doms c1)),(dom c1):]) is Function
;
;
end;

:: deftheorem Def6 defines <: FUNCT_6:def 6 :
for b1 being Function holds <:b1:> = curry ((uncurry' b1) | [:(meet (doms b1)),(dom b1):]);

theorem Th49: :: FUNCT_6:49
for b1 being Function holds
( dom <:b1:> = meet (doms b1) & rng <:b1:> c= product (rngs b1) )
proof end;

theorem Th50: :: FUNCT_6:50
for b1 being set
for b2 being Function st b1 in dom <:b2:> holds
<:b2:> . b1 is Function
proof end;

theorem Th51: :: FUNCT_6:51
for b1 being set
for b2, b3 being Function st b1 in dom <:b2:> & b3 = <:b2:> . b1 holds
( dom b3 = b2 " (SubFuncs (rng b2)) & ( for b4 being set st b4 in dom b3 holds
( [b4,b1] in dom (uncurry b2) & b3 . b4 = (uncurry b2) . [b4,b1] ) ) )
proof end;

theorem Th52: :: FUNCT_6:52
for b1 being set
for b2 being Function st b1 in dom <:b2:> holds
for b3 being Function st b3 in rng b2 holds
b1 in dom b3
proof end;

theorem Th53: :: FUNCT_6:53
for b1 being set
for b2, b3 being Function st b2 in rng b3 & ( for b4 being Function st b4 in rng b3 holds
b1 in dom b4 ) holds
b1 in dom <:b3:>
proof end;

theorem Th54: :: FUNCT_6:54
for b1, b2 being set
for b3, b4, b5 being Function st b1 in dom b3 & b4 = b3 . b1 & b2 in dom <:b3:> & b5 = <:b3:> . b2 holds
b4 . b2 = b5 . b1
proof end;

theorem Th55: :: FUNCT_6:55
for b1, b2 being set
for b3 being Function st b1 in dom b3 & b3 . b1 is Function & b2 in dom <:b3:> holds
b3 .. b1,b2 = <:b3:> .. b2,b1
proof end;

definition
let c1 be Function;
func Frege c1 -> Function means :Def7: :: FUNCT_6:def 7
( dom a2 = product (doms a1) & ( for b1 being Function st b1 in product (doms a1) holds
ex b2 being Function st
( a2 . b1 = b2 & dom b2 = a1 " (SubFuncs (rng a1)) & ( for b3 being set st b3 in dom b2 holds
b2 . b3 = (uncurry a1) . [b3,(b1 . b3)] ) ) ) );
existence
ex b1 being Function st
( dom b1 = product (doms c1) & ( for b2 being Function st b2 in product (doms c1) holds
ex b3 being Function st
( b1 . b2 = b3 & dom b3 = c1 " (SubFuncs (rng c1)) & ( for b4 being set st b4 in dom b3 holds
b3 . b4 = (uncurry c1) . [b4,(b2 . b4)] ) ) ) )
proof end;
uniqueness
for b1, b2 being Function st dom b1 = product (doms c1) & ( for b3 being Function st b3 in product (doms c1) holds
ex b4 being Function st
( b1 . b3 = b4 & dom b4 = c1 " (SubFuncs (rng c1)) & ( for b5 being set st b5 in dom b4 holds
b4 . b5 = (uncurry c1) . [b5,(b3 . b5)] ) ) ) & dom b2 = product (doms c1) & ( for b3 being Function st b3 in product (doms c1) holds
ex b4 being Function st
( b2 . b3 = b4 & dom b4 = c1 " (SubFuncs (rng c1)) & ( for b5 being set st b5 in dom b4 holds
b4 . b5 = (uncurry c1) . [b5,(b3 . b5)] ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def7 defines Frege FUNCT_6:def 7 :
for b1, b2 being Function holds
( b2 = Frege b1 iff ( dom b2 = product (doms b1) & ( for b3 being Function st b3 in product (doms b1) holds
ex b4 being Function st
( b2 . b3 = b4 & dom b4 = b1 " (SubFuncs (rng b1)) & ( for b5 being set st b5 in dom b4 holds
b4 . b5 = (uncurry b1) . [b5,(b3 . b5)] ) ) ) ) );

theorem Th56: :: FUNCT_6:56
for b1 being set
for b2, b3 being Function st b2 in product (doms b3) & b1 in dom b2 holds
(Frege b3) .. b2,b1 = b3 .. b1,(b2 . b1)
proof end;

Lemma37: for b1 being Function holds rng (Frege b1) c= product (rngs b1)
proof end;

theorem Th57: :: FUNCT_6:57
for b1 being set
for b2, b3, b4, b5 being Function st b1 in dom b2 & b3 = b2 . b1 & b4 in product (doms b2) & b5 = (Frege b2) . b4 holds
( b4 . b1 in dom b3 & b5 . b1 = b3 . (b4 . b1) & b5 in product (rngs b2) )
proof end;

Lemma39: for b1 being Function holds product (rngs b1) c= rng (Frege b1)
proof end;

theorem Th58: :: FUNCT_6:58
for b1 being Function holds rng (Frege b1) = product (rngs b1)
proof end;

theorem Th59: :: FUNCT_6:59
for b1 being Function st not {} in rng b1 holds
( Frege b1 is one-to-one iff for b2 being Function st b2 in rng b1 holds
b2 is one-to-one )
proof end;

theorem Th60: :: FUNCT_6:60
( <:{} :> = {} & Frege {} = {{} } --> {} )
proof end;

theorem Th61: :: FUNCT_6:61
for b1 being Function holds
( dom <:<*b1*>:> = dom b1 & ( for b2 being set st b2 in dom b1 holds
<:<*b1*>:> . b2 = <*(b1 . b2)*> ) )
proof end;

theorem Th62: :: FUNCT_6:62
for b1, b2 being Function holds
( dom <:<*b1,b2*>:> = (dom b1) /\ (dom b2) & ( for b3 being set st b3 in (dom b1) /\ (dom b2) holds
<:<*b1,b2*>:> . b3 = <*(b1 . b3),(b2 . b3)*> ) )
proof end;

theorem Th63: :: FUNCT_6:63
for b1 being set
for b2 being Function st b1 <> {} holds
( dom <:(b1 --> b2):> = dom b2 & ( for b3 being set st b3 in dom b2 holds
<:(b1 --> b2):> . b3 = b1 --> (b2 . b3) ) )
proof end;

theorem Th64: :: FUNCT_6:64
for b1 being Function holds
( dom (Frege <*b1*>) = product <*(dom b1)*> & rng (Frege <*b1*>) = product <*(rng b1)*> & ( for b2 being set st b2 in dom b1 holds
(Frege <*b1*>) . <*b2*> = <*(b1 . b2)*> ) )
proof end;

theorem Th65: :: FUNCT_6:65
for b1, b2 being Function holds
( dom (Frege <*b1,b2*>) = product <*(dom b1),(dom b2)*> & rng (Frege <*b1,b2*>) = product <*(rng b1),(rng b2)*> & ( for b3, b4 being set st b3 in dom b1 & b4 in dom b2 holds
(Frege <*b1,b2*>) . <*b3,b4*> = <*(b1 . b3),(b2 . b4)*> ) )
proof end;

theorem Th66: :: FUNCT_6:66
for b1 being set
for b2 being Function holds
( dom (Frege (b1 --> b2)) = Funcs b1,(dom b2) & rng (Frege (b1 --> b2)) = Funcs b1,(rng b2) & ( for b3 being Function st b3 in Funcs b1,(dom b2) holds
(Frege (b1 --> b2)) . b3 = b2 * b3 ) )
proof end;

theorem Th67: :: FUNCT_6:67
for b1 being set
for b2, b3 being Function st b1 in dom b2 & b1 in dom b3 holds
for b4, b5 being set holds
( <:b2,b3:> . b1 = [b4,b5] iff <:<*b2,b3*>:> . b1 = <*b4,b5*> )
proof end;

theorem Th68: :: FUNCT_6:68
for b1, b2 being set
for b3, b4 being Function st b1 in dom b3 & b2 in dom b4 holds
for b5, b6 being set holds
( [:b3,b4:] . [b1,b2] = [b5,b6] iff (Frege <*b3,b4*>) . <*b1,b2*> = <*b5,b6*> )
proof end;

theorem Th69: :: FUNCT_6:69
for b1 being set
for b2, b3 being Function st dom b2 = b1 & dom b3 = b1 & ( for b4 being set st b4 in b1 holds
b2 . b4,b3 . b4 are_equipotent ) holds
product b2, product b3 are_equipotent
proof end;

theorem Th70: :: FUNCT_6:70
for b1, b2, b3 being Function st dom b1 = dom b2 & dom b3 = rng b2 & b2 is one-to-one & ( for b4 being set st b4 in dom b2 holds
b1 . b4,b3 . (b2 . b4) are_equipotent ) holds
product b1, product b3 are_equipotent
proof end;

theorem Th71: :: FUNCT_6:71
for b1 being set
for b2 being Function
for b3 being Permutation of b1 st dom b2 = b1 holds
product b2, product (b2 * b3) are_equipotent
proof end;

definition
let c1 be Function;
let c2 be set ;
func Funcs c1,c2 -> Function means :Def8: :: FUNCT_6:def 8
( dom a3 = dom a1 & ( for b1 being set st b1 in dom a1 holds
a3 . b1 = Funcs (a1 . b1),a2 ) );
existence
ex b1 being Function st
( dom b1 = dom c1 & ( for b2 being set st b2 in dom c1 holds
b1 . b2 = Funcs (c1 . b2),c2 ) )
proof end;
uniqueness
for b1, b2 being Function st dom b1 = dom c1 & ( for b3 being set st b3 in dom c1 holds
b1 . b3 = Funcs (c1 . b3),c2 ) & dom b2 = dom c1 & ( for b3 being set st b3 in dom c1 holds
b2 . b3 = Funcs (c1 . b3),c2 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def8 defines Funcs FUNCT_6:def 8 :
for b1 being Function
for b2 being set
for b3 being Function holds
( b3 = Funcs b1,b2 iff ( dom b3 = dom b1 & ( for b4 being set st b4 in dom b1 holds
b3 . b4 = Funcs (b1 . b4),b2 ) ) );

theorem Th72: :: FUNCT_6:72
for b1 being Function st not {} in rng b1 holds
Funcs b1,{} = (dom b1) --> {}
proof end;

theorem Th73: :: FUNCT_6:73
for b1 being set holds Funcs {} ,b1 = {}
proof end;

theorem Th74: :: FUNCT_6:74
for b1, b2 being set holds Funcs <*b1*>,b2 = <*(Funcs b1,b2)*>
proof end;

theorem Th75: :: FUNCT_6:75
for b1, b2, b3 being set holds Funcs <*b1,b2*>,b3 = <*(Funcs b1,b3),(Funcs b2,b3)*>
proof end;

theorem Th76: :: FUNCT_6:76
for b1, b2, b3 being set holds Funcs (b1 --> b2),b3 = b1 --> (Funcs b2,b3)
proof end;

Lemma47: for b1, b2, b3 being set
for b4, b5 being Function st [b1,b2] in dom b4 & b5 = (curry b4) . b1 & b3 in dom b5 holds
[b1,b3] in dom b4
proof end;

theorem Th77: :: FUNCT_6:77
for b1 being set
for b2 being Function holds Funcs (Union (disjoin b2)),b1, product (Funcs b2,b1) are_equipotent
proof end;

definition
let c1 be set ;
let c2 be Function;
func Funcs c1,c2 -> Function means :Def9: :: FUNCT_6:def 9
( dom a3 = dom a2 & ( for b1 being set st b1 in dom a2 holds
a3 . b1 = Funcs a1,(a2 . b1) ) );
existence
ex b1 being Function st
( dom b1 = dom c2 & ( for b2 being set st b2 in dom c2 holds
b1 . b2 = Funcs c1,(c2 . b2) ) )
proof end;
uniqueness
for b1, b2 being Function st dom b1 = dom c2 & ( for b3 being set st b3 in dom c2 holds
b1 . b3 = Funcs c1,(c2 . b3) ) & dom b2 = dom c2 & ( for b3 being set st b3 in dom c2 holds
b2 . b3 = Funcs c1,(c2 . b3) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def9 defines Funcs FUNCT_6:def 9 :
for b1 being set
for b2, b3 being Function holds
( b3 = Funcs b1,b2 iff ( dom b3 = dom b2 & ( for b4 being set st b4 in dom b2 holds
b3 . b4 = Funcs b1,(b2 . b4) ) ) );

Lemma49: for b1 being set
for b2 being Function st b2 <> {} & b1 <> {} holds
product (Funcs b1,b2), Funcs b1,(product b2) are_equipotent
proof end;

theorem Th78: :: FUNCT_6:78
for b1 being Function holds Funcs {} ,b1 = (dom b1) --> {{} }
proof end;

theorem Th79: :: FUNCT_6:79
for b1 being set holds Funcs b1,{} = {}
proof end;

theorem Th80: :: FUNCT_6:80
for b1, b2 being set holds Funcs b1,<*b2*> = <*(Funcs b1,b2)*>
proof end;

theorem Th81: :: FUNCT_6:81
for b1, b2, b3 being set holds Funcs b1,<*b2,b3*> = <*(Funcs b1,b2),(Funcs b1,b3)*>
proof end;

theorem Th82: :: FUNCT_6:82
for b1, b2, b3 being set holds Funcs b1,(b2 --> b3) = b2 --> (Funcs b1,b3)
proof end;

theorem Th83: :: FUNCT_6:83
for b1 being set
for b2 being Function holds product (Funcs b1,b2), Funcs b1,(product b2) are_equipotent
proof end;

definition
let c1 be Function;
canceled;
canceled;
func commute c1 -> Function-yielding Function equals :: FUNCT_6:def 12
curry' (uncurry a1);
coherence
curry' (uncurry c1) is Function-yielding Function
proof end;
end;

:: deftheorem Def10 FUNCT_6:def 10 :
canceled;

:: deftheorem Def11 FUNCT_6:def 11 :
canceled;

:: deftheorem Def12 defines commute FUNCT_6:def 12 :
for b1 being Function holds commute b1 = curry' (uncurry b1);

theorem Th84: :: FUNCT_6:84
for b1 being Function
for b2 being set st b2 in dom (commute b1) holds
(commute b1) . b2 is Function ;

theorem Th85: :: FUNCT_6:85
for b1, b2, b3 being set
for b4 being Function st b1 <> {} & b2 <> {} & b4 in Funcs b1,(Funcs b2,b3) holds
commute b4 in Funcs b2,(Funcs b1,b3)
proof end;

theorem Th86: :: FUNCT_6:86
for b1, b2, b3 being set
for b4 being Function st b1 <> {} & b2 <> {} & b4 in Funcs b1,(Funcs b2,b3) holds
for b5, b6 being Function
for b7, b8 being set st b7 in b1 & b8 in b2 & b4 . b7 = b5 & (commute b4) . b8 = b6 holds
( b6 . b7 = b5 . b8 & dom b6 = b1 & dom b5 = b2 & rng b6 c= b3 & rng b5 c= b3 )
proof end;

theorem Th87: :: FUNCT_6:87
for b1, b2, b3 being set
for b4 being Function st b1 <> {} & b2 <> {} & b4 in Funcs b1,(Funcs b2,b3) holds
commute (commute b4) = b4
proof end;

Lemma53: for b1 being Function st dom b1 = {} holds
commute b1 = {}
by RELAT_1:64, FUNCT_5:49, FUNCT_5:50;

theorem Th88: :: FUNCT_6:88
commute {} = {} by Lemma53, RELAT_1:60;

theorem Th89: :: FUNCT_6:89
for b1 being Function-yielding Function holds dom (doms b1) = dom b1
proof end;

theorem Th90: :: FUNCT_6:90
for b1 being Function-yielding Function holds dom (rngs b1) = dom b1
proof end;