src/HOL/Library/FuncSet.thy
author hoelzl
Mon, 23 Aug 2010 19:35:57 +0200
changeset 38656 d5d342611edb
parent 33271 7be66dee1a5a
child 39198 f967a16dfcdd
permissions -rw-r--r--
Rewrite the Probability theory. Introduced pinfreal as real numbers with infinity. Use pinfreal as value for measures. Introduces Lebesgue Measure based on the integral in Multivariate Analysis. Proved Radon Nikodym for arbitrary sigma finite measure spaces.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
     1
(*  Title:      HOL/Library/FuncSet.thy
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
     2
    Author:     Florian Kammueller and Lawrence C Paulson
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
     3
*)
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
     4
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
     5
header {* Pi and Function Sets *}
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
     6
15131
c69542757a4d New theory header syntax.
nipkow
parents: 14853
diff changeset
     7
theory FuncSet
30663
0b6aff7451b2 Main is (Complex_Main) base entry point in library theories
haftmann
parents: 28524
diff changeset
     8
imports Hilbert_Choice Main
15131
c69542757a4d New theory header syntax.
nipkow
parents: 14853
diff changeset
     9
begin
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    10
19736
wenzelm
parents: 19656
diff changeset
    11
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    12
  Pi :: "['a set, 'a => 'b set] => ('a => 'b) set" where
19736
wenzelm
parents: 19656
diff changeset
    13
  "Pi A B = {f. \<forall>x. x \<in> A --> f x \<in> B x}"
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    14
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    15
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    16
  extensional :: "'a set => ('a => 'b) set" where
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 27487
diff changeset
    17
  "extensional A = {f. \<forall>x. x~:A --> f x = undefined}"
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    18
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    19
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    20
  "restrict" :: "['a => 'b, 'a set] => ('a => 'b)" where
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 27487
diff changeset
    21
  "restrict f A = (%x. if x \<in> A then f x else undefined)"
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    22
19536
1a3a3cf8b4fa replaced syntax/translations by abbreviation;
wenzelm
parents: 17781
diff changeset
    23
abbreviation
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    24
  funcset :: "['a set, 'b set] => ('a => 'b) set"
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    25
    (infixr "->" 60) where
19536
1a3a3cf8b4fa replaced syntax/translations by abbreviation;
wenzelm
parents: 17781
diff changeset
    26
  "A -> B == Pi A (%_. B)"
1a3a3cf8b4fa replaced syntax/translations by abbreviation;
wenzelm
parents: 17781
diff changeset
    27
21210
c17fd2df4e9e renamed 'const_syntax' to 'notation';
wenzelm
parents: 20770
diff changeset
    28
notation (xsymbols)
19656
09be06943252 tuned concrete syntax -- abbreviation/const_syntax;
wenzelm
parents: 19536
diff changeset
    29
  funcset  (infixr "\<rightarrow>" 60)
19536
1a3a3cf8b4fa replaced syntax/translations by abbreviation;
wenzelm
parents: 17781
diff changeset
    30
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    31
syntax
19736
wenzelm
parents: 19656
diff changeset
    32
  "_Pi"  :: "[pttrn, 'a set, 'b set] => ('a => 'b) set"  ("(3PI _:_./ _)" 10)
wenzelm
parents: 19656
diff changeset
    33
  "_lam" :: "[pttrn, 'a set, 'a => 'b] => ('a=>'b)"  ("(3%_:_./ _)" [0,0,3] 3)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    34
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    35
syntax (xsymbols)
19736
wenzelm
parents: 19656
diff changeset
    36
  "_Pi" :: "[pttrn, 'a set, 'b set] => ('a => 'b) set"  ("(3\<Pi> _\<in>_./ _)"   10)
wenzelm
parents: 19656
diff changeset
    37
  "_lam" :: "[pttrn, 'a set, 'a => 'b] => ('a=>'b)"  ("(3\<lambda>_\<in>_./ _)" [0,0,3] 3)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    38
14565
c6dc17aab88a use more symbols in HTML output
kleing
parents: 13595
diff changeset
    39
syntax (HTML output)
19736
wenzelm
parents: 19656
diff changeset
    40
  "_Pi" :: "[pttrn, 'a set, 'b set] => ('a => 'b) set"  ("(3\<Pi> _\<in>_./ _)"   10)
wenzelm
parents: 19656
diff changeset
    41
  "_lam" :: "[pttrn, 'a set, 'a => 'b] => ('a=>'b)"  ("(3\<lambda>_\<in>_./ _)" [0,0,3] 3)
14565
c6dc17aab88a use more symbols in HTML output
kleing
parents: 13595
diff changeset
    42
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    43
translations
20770
2c583720436e fixed translations: CONST;
wenzelm
parents: 20362
diff changeset
    44
  "PI x:A. B" == "CONST Pi A (%x. B)"
2c583720436e fixed translations: CONST;
wenzelm
parents: 20362
diff changeset
    45
  "%x:A. f" == "CONST restrict (%x. f) A"
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    46
19736
wenzelm
parents: 19656
diff changeset
    47
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    48
  "compose" :: "['a set, 'b => 'c, 'a => 'b] => ('a => 'c)" where
19736
wenzelm
parents: 19656
diff changeset
    49
  "compose A g f = (\<lambda>x\<in>A. g (f x))"
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    50
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    51
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    52
subsection{*Basic Properties of @{term Pi}*}
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    53
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    54
lemma Pi_I[intro!]: "(!!x. x \<in> A ==> f x \<in> B x) ==> f \<in> Pi A B"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
    55
  by (simp add: Pi_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    56
31731
nipkow
parents: 31727
diff changeset
    57
lemma Pi_I'[simp]: "(!!x. x : A --> f x : B x) ==> f : Pi A B"
nipkow
parents: 31727
diff changeset
    58
by(simp add:Pi_def)
nipkow
parents: 31727
diff changeset
    59
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    60
lemma funcsetI: "(!!x. x \<in> A ==> f x \<in> B) ==> f \<in> A -> B"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
    61
  by (simp add: Pi_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    62
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    63
lemma Pi_mem: "[|f: Pi A B; x \<in> A|] ==> f x \<in> B x"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
    64
  by (simp add: Pi_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    65
31759
1e652c39d617 fixed name
nipkow
parents: 31754
diff changeset
    66
lemma PiE [elim]:
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    67
  "f : Pi A B ==> (f x : B x ==> Q) ==> (x ~: A ==> Q) ==> Q"
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    68
by(auto simp: Pi_def)
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    69
38656
d5d342611edb Rewrite the Probability theory.
hoelzl
parents: 33271
diff changeset
    70
lemma Pi_cong:
d5d342611edb Rewrite the Probability theory.
hoelzl
parents: 33271
diff changeset
    71
  "(\<And> w. w \<in> A \<Longrightarrow> f w = g w) \<Longrightarrow> f \<in> Pi A B \<longleftrightarrow> g \<in> Pi A B"
d5d342611edb Rewrite the Probability theory.
hoelzl
parents: 33271
diff changeset
    72
  by (auto simp: Pi_def)
d5d342611edb Rewrite the Probability theory.
hoelzl
parents: 33271
diff changeset
    73
31769
d5f39775edd2 lemma funcset_id by Jeremy Avigad
haftmann
parents: 31731
diff changeset
    74
lemma funcset_id [simp]: "(\<lambda>x. x) \<in> A \<rightarrow> A"
d5f39775edd2 lemma funcset_id by Jeremy Avigad
haftmann
parents: 31731
diff changeset
    75
  by (auto intro: Pi_I)
d5f39775edd2 lemma funcset_id by Jeremy Avigad
haftmann
parents: 31731
diff changeset
    76
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    77
lemma funcset_mem: "[|f \<in> A -> B; x \<in> A|] ==> f x \<in> B"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
    78
  by (simp add: Pi_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    79
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
    80
lemma funcset_image: "f \<in> A\<rightarrow>B ==> f ` A \<subseteq> B"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    81
by auto
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
    82
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    83
lemma Pi_eq_empty[simp]: "((PI x: A. B x) = {}) = (\<exists>x\<in>A. B(x) = {})"
13593
e39f0751e4bf Tidied. New Pi-theorem.
paulson
parents: 13586
diff changeset
    84
apply (simp add: Pi_def, auto)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    85
txt{*Converse direction requires Axiom of Choice to exhibit a function
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    86
picking an element from each non-empty @{term "B x"}*}
13593
e39f0751e4bf Tidied. New Pi-theorem.
paulson
parents: 13586
diff changeset
    87
apply (drule_tac x = "%u. SOME y. y \<in> B u" in spec, auto)
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
    88
apply (cut_tac P= "%y. y \<in> B x" in some_eq_ex, auto)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    89
done
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
    90
13593
e39f0751e4bf Tidied. New Pi-theorem.
paulson
parents: 13586
diff changeset
    91
lemma Pi_empty [simp]: "Pi {} B = UNIV"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    92
by (simp add: Pi_def)
13593
e39f0751e4bf Tidied. New Pi-theorem.
paulson
parents: 13586
diff changeset
    93
e39f0751e4bf Tidied. New Pi-theorem.
paulson
parents: 13586
diff changeset
    94
lemma Pi_UNIV [simp]: "A -> UNIV = UNIV"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
    95
by (simp add: Pi_def)
31727
2621a957d417 Made Pi_I [simp]
nipkow
parents: 30663
diff changeset
    96
(*
2621a957d417 Made Pi_I [simp]
nipkow
parents: 30663
diff changeset
    97
lemma funcset_id [simp]: "(%x. x): A -> A"
2621a957d417 Made Pi_I [simp]
nipkow
parents: 30663
diff changeset
    98
  by (simp add: Pi_def)
2621a957d417 Made Pi_I [simp]
nipkow
parents: 30663
diff changeset
    99
*)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   100
text{*Covariance of Pi-sets in their second argument*}
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   101
lemma Pi_mono: "(!!x. x \<in> A ==> B x <= C x) ==> Pi A B <= Pi A C"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   102
by auto
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   103
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   104
text{*Contravariance of Pi-sets in their first argument*}
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   105
lemma Pi_anti_mono: "A' <= A ==> Pi A B <= Pi A' B"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   106
by auto
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   107
33271
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   108
lemma prod_final:
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   109
  assumes 1: "fst \<circ> f \<in> Pi A B" and 2: "snd \<circ> f \<in> Pi A C"
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   110
  shows "f \<in> (\<Pi> z \<in> A. B z \<times> C z)"
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   111
proof (rule Pi_I) 
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   112
  fix z
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   113
  assume z: "z \<in> A" 
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   114
  have "f z = (fst (f z), snd (f z))" 
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   115
    by simp
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   116
  also have "...  \<in> B z \<times> C z"
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   117
    by (metis SigmaI PiE o_apply 1 2 z) 
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   118
  finally show "f z \<in> B z \<times> C z" .
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   119
qed
7be66dee1a5a New theory Probability, which contains a development of measure theory
paulson
parents: 33057
diff changeset
   120
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   121
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   122
subsection{*Composition With a Restricted Domain: @{term compose}*}
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   123
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   124
lemma funcset_compose:
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   125
  "[| f \<in> A -> B; g \<in> B -> C |]==> compose A g f \<in> A -> C"
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   126
by (simp add: Pi_def compose_def restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   127
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   128
lemma compose_assoc:
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   129
    "[| f \<in> A -> B; g \<in> B -> C; h \<in> C -> D |]
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   130
      ==> compose A h (compose A g f) = compose A (compose B h g) f"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   131
by (simp add: expand_fun_eq Pi_def compose_def restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   132
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   133
lemma compose_eq: "x \<in> A ==> compose A g f x = g(f(x))"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   134
by (simp add: compose_def restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   135
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   136
lemma surj_compose: "[| f ` A = B; g ` B = C |] ==> compose A g f ` A = C"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   137
  by (auto simp add: image_def compose_eq)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   138
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   139
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   140
subsection{*Bounded Abstraction: @{term restrict}*}
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   141
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   142
lemma restrict_in_funcset: "(!!x. x \<in> A ==> f x \<in> B) ==> (\<lambda>x\<in>A. f x) \<in> A -> B"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   143
  by (simp add: Pi_def restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   144
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   145
lemma restrictI[intro!]: "(!!x. x \<in> A ==> f x \<in> B x) ==> (\<lambda>x\<in>A. f x) \<in> Pi A B"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   146
  by (simp add: Pi_def restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   147
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   148
lemma restrict_apply [simp]:
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 27487
diff changeset
   149
    "(\<lambda>y\<in>A. f y) x = (if x \<in> A then f x else undefined)"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   150
  by (simp add: restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   151
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   152
lemma restrict_ext:
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   153
    "(!!x. x \<in> A ==> f x = g x) ==> (\<lambda>x\<in>A. f x) = (\<lambda>x\<in>A. g x)"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   154
  by (simp add: expand_fun_eq Pi_def restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   155
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   156
lemma inj_on_restrict_eq [simp]: "inj_on (restrict f A) A = inj_on f A"
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   157
  by (simp add: inj_on_def restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   158
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   159
lemma Id_compose:
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   160
    "[|f \<in> A -> B;  f \<in> extensional A|] ==> compose A (\<lambda>y\<in>B. y) f = f"
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   161
  by (auto simp add: expand_fun_eq compose_def extensional_def Pi_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   162
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   163
lemma compose_Id:
14706
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   164
    "[|g \<in> A -> B;  g \<in> extensional A|] ==> compose A g (\<lambda>x\<in>A. x) = g"
71590b7733b7 tuned document;
wenzelm
parents: 14565
diff changeset
   165
  by (auto simp add: expand_fun_eq compose_def extensional_def Pi_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   166
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   167
lemma image_restrict_eq [simp]: "(restrict f A) ` A = f ` A"
19736
wenzelm
parents: 19656
diff changeset
   168
  by (auto simp add: restrict_def)
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   169
14745
94be403deb84 new lemmas
paulson
parents: 14706
diff changeset
   170
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   171
subsection{*Bijections Between Sets*}
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   172
26106
be52145f482d moved bij_betw from Library/FuncSet to Fun, redistributed some lemmas
nipkow
parents: 21404
diff changeset
   173
text{*The definition of @{const bij_betw} is in @{text "Fun.thy"}, but most of
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   174
the theorems belong here, or need at least @{term Hilbert_Choice}.*}
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   175
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   176
lemma bij_betw_imp_funcset: "bij_betw f A B \<Longrightarrow> f \<in> A \<rightarrow> B"
32988
d1d4d7a08a66 Inv -> inv_onto, inv abbr. inv_onto UNIV.
nipkow
parents: 31770
diff changeset
   177
by (auto simp add: bij_betw_def)
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   178
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   179
lemma inj_on_compose:
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   180
  "[| bij_betw f A B; inj_on g B |] ==> inj_on (compose A g f) A"
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   181
by (auto simp add: bij_betw_def inj_on_def compose_eq)
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   182
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   183
lemma bij_betw_compose:
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   184
  "[| bij_betw f A B; bij_betw g B C |] ==> bij_betw (compose A g f) A C"
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   185
apply (simp add: bij_betw_def compose_eq inj_on_compose)
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   186
apply (auto simp add: compose_def image_def)
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   187
done
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   188
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   189
lemma bij_betw_restrict_eq [simp]:
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   190
  "bij_betw (restrict f A) A B = bij_betw f A B"
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   191
by (simp add: bij_betw_def)
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   192
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   193
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   194
subsection{*Extensionality*}
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   195
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 27487
diff changeset
   196
lemma extensional_arb: "[|f \<in> extensional A; x\<notin> A|] ==> f x = undefined"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   197
by (simp add: extensional_def)
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   198
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   199
lemma restrict_extensional [simp]: "restrict f A \<in> extensional A"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   200
by (simp add: restrict_def extensional_def)
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   201
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   202
lemma compose_extensional [simp]: "compose A f g \<in> extensional A"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   203
by (simp add: compose_def)
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   204
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   205
lemma extensionalityI:
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   206
  "[| f \<in> extensional A; g \<in> extensional A;
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   207
      !!x. x\<in>A ==> f x = g x |] ==> f = g"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   208
by (force simp add: expand_fun_eq extensional_def)
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   209
33057
764547b68538 inv_onto -> inv_into
nipkow
parents: 32988
diff changeset
   210
lemma inv_into_funcset: "f ` A = B ==> (\<lambda>x\<in>B. inv_into A f x) : B -> A"
764547b68538 inv_onto -> inv_into
nipkow
parents: 32988
diff changeset
   211
by (unfold inv_into_def) (fast intro: someI2)
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   212
33057
764547b68538 inv_onto -> inv_into
nipkow
parents: 32988
diff changeset
   213
lemma compose_inv_into_id:
764547b68538 inv_onto -> inv_into
nipkow
parents: 32988
diff changeset
   214
  "bij_betw f A B ==> compose A (\<lambda>y\<in>B. inv_into A f y) f = (\<lambda>x\<in>A. x)"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   215
apply (simp add: bij_betw_def compose_def)
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   216
apply (rule restrict_ext, auto)
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   217
done
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   218
33057
764547b68538 inv_onto -> inv_into
nipkow
parents: 32988
diff changeset
   219
lemma compose_id_inv_into:
764547b68538 inv_onto -> inv_into
nipkow
parents: 32988
diff changeset
   220
  "f ` A = B ==> compose B f (\<lambda>y\<in>B. inv_into A f y) = (\<lambda>x\<in>B. x)"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   221
apply (simp add: compose_def)
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   222
apply (rule restrict_ext)
33057
764547b68538 inv_onto -> inv_into
nipkow
parents: 32988
diff changeset
   223
apply (simp add: f_inv_into_f)
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   224
done
14853
8d710bece29f more on bij_betw
paulson
parents: 14762
diff changeset
   225
14762
bd349ff7907a new bij_betw operator
paulson
parents: 14745
diff changeset
   226
14745
94be403deb84 new lemmas
paulson
parents: 14706
diff changeset
   227
subsection{*Cardinality*}
94be403deb84 new lemmas
paulson
parents: 14706
diff changeset
   228
94be403deb84 new lemmas
paulson
parents: 14706
diff changeset
   229
lemma card_inj: "[|f \<in> A\<rightarrow>B; inj_on f A; finite B|] ==> card(A) \<le> card(B)"
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   230
by (rule card_inj_on_le) auto
14745
94be403deb84 new lemmas
paulson
parents: 14706
diff changeset
   231
94be403deb84 new lemmas
paulson
parents: 14706
diff changeset
   232
lemma card_bij:
31754
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   233
  "[|f \<in> A\<rightarrow>B; inj_on f A;
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   234
     g \<in> B\<rightarrow>A; inj_on g B; finite A; finite B|] ==> card(A) = card(B)"
b5260f5272a4 tuned FuncSet
nipkow
parents: 31731
diff changeset
   235
by (blast intro: card_inj order_antisym)
14745
94be403deb84 new lemmas
paulson
parents: 14706
diff changeset
   236
13586
0f339348df0e new theory for Pi-sets, restrict, etc.
paulson
parents:
diff changeset
   237
end