src/HOL/Multivariate_Analysis/Finite_Cartesian_Product.thy
author huffman
Fri, 05 Mar 2010 14:05:25 -0800
changeset 35596 49a02dab35ed
parent 35397 69e2c0839091
child 36590 2cdaae32b682
permissions -rw-r--r--
add comment
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35253
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
     1
(*  Title:      HOL/Multivariate_Analysis/Finite_Cartesian_Product.thy
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
     2
    Author:     Amine Chaieb, University of Cambridge
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     3
*)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     4
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     5
header {* Definition of finite Cartesian product types. *}
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     6
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     7
theory Finite_Cartesian_Product
35253
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
     8
imports Main
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     9
begin
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    10
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    11
subsection {* Finite Cartesian products, with indexing and lambdas. *}
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    12
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    13
typedef (open Cart)
34291
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    14
  ('a, 'b) cart = "UNIV :: (('b::finite) \<Rightarrow> 'a) set"
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    15
  morphisms Cart_nth Cart_lambda ..
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    16
35254
0f17eda72e60 binder notation for default print_mode -- to avoid strange output if "xsymbols" is not active;
wenzelm
parents: 35253
diff changeset
    17
notation
0f17eda72e60 binder notation for default print_mode -- to avoid strange output if "xsymbols" is not active;
wenzelm
parents: 35253
diff changeset
    18
  Cart_nth (infixl "$" 90) and
0f17eda72e60 binder notation for default print_mode -- to avoid strange output if "xsymbols" is not active;
wenzelm
parents: 35253
diff changeset
    19
  Cart_lambda (binder "\<chi>" 10)
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    20
34290
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    21
(*
34291
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    22
  Translate "'b ^ 'n" into "'b ^ ('n :: finite)". When 'n has already more than
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    23
  the finite type class write "cart 'b 'n"
34290
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    24
*)
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    25
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    26
syntax "_finite_cart" :: "type \<Rightarrow> type \<Rightarrow> type" ("(_ ^/ _)" [15, 16] 15)
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    27
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    28
parse_translation {*
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    29
let
35397
69e2c0839091 more precise syntax antiquotations;
wenzelm
parents: 35254
diff changeset
    30
  fun cart t u = Syntax.const @{type_syntax cart} $ t $ u;
34290
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    31
  fun finite_cart_tr [t, u as Free (x, _)] =
35113
1a0c129bb2e0 modernized translations;
wenzelm
parents: 34964
diff changeset
    32
        if Syntax.is_tid x then
35397
69e2c0839091 more precise syntax antiquotations;
wenzelm
parents: 35254
diff changeset
    33
          cart t (Syntax.const @{syntax_const "_ofsort"} $ u $ Syntax.const @{class_syntax finite})
34290
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    34
        else cart t u
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    35
    | finite_cart_tr [t, u] = cart t u
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    36
in
35113
1a0c129bb2e0 modernized translations;
wenzelm
parents: 34964
diff changeset
    37
  [(@{syntax_const "_finite_cart"}, finite_cart_tr)]
34290
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    38
end
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    39
*}
1edf0f223c6e added syntax translation to automatically add finite typeclass to index type of cartesian product type
hoelzl
parents: 34289
diff changeset
    40
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    41
lemma stupid_ext: "(\<forall>x. f x = g x) \<longleftrightarrow> (f = g)"
35253
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    42
  by (auto intro: ext)
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    43
34291
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    44
lemma Cart_eq: "(x = y) \<longleftrightarrow> (\<forall>i. x$i = y$i)"
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    45
  by (simp add: Cart_nth_inject [symmetric] expand_fun_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    46
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    47
lemma Cart_lambda_beta [simp]: "Cart_lambda g $ i = g i"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    48
  by (simp add: Cart_lambda_inverse)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    49
34291
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    50
lemma Cart_lambda_unique: "(\<forall>i. f$i = g i) \<longleftrightarrow> Cart_lambda g = f"
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    51
  by (auto simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    52
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    53
lemma Cart_lambda_eta: "(\<chi> i. (g$i)) = g"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    54
  by (simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    55
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    56
text{* A non-standard sum to "paste" Cartesian products. *}
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    57
34291
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    58
definition "pastecart f g = (\<chi> i. case i of Inl a \<Rightarrow> f$a | Inr b \<Rightarrow> g$b)"
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    59
definition "fstcart f = (\<chi> i. (f$(Inl i)))"
4e896680897e finite annotation on cartesian product is now implicit.
hoelzl
parents: 34290
diff changeset
    60
definition "sndcart f = (\<chi> i. (f$(Inr i)))"
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    61
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    62
lemma nth_pastecart_Inl [simp]: "pastecart f g $ Inl a = f$a"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    63
  unfolding pastecart_def by simp
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    64
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    65
lemma nth_pastecart_Inr [simp]: "pastecart f g $ Inr b = g$b"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    66
  unfolding pastecart_def by simp
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    67
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    68
lemma nth_fstcart [simp]: "fstcart f $ i = f $ Inl i"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    69
  unfolding fstcart_def by simp
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    70
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    71
lemma nth_sndtcart [simp]: "sndcart f $ i = f $ Inr i"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    72
  unfolding sndcart_def by simp
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    73
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    74
lemma finite_sum_image: "(UNIV::('a + 'b) set) = range Inl \<union> range Inr"
35253
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    75
  apply auto
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    76
  apply (case_tac x)
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    77
   apply auto
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    78
  done
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    79
34964
4e8be3c04d37 Replaced vec1 and dest_vec1 by abbreviation.
hoelzl
parents: 34291
diff changeset
    80
lemma fstcart_pastecart[simp]: "fstcart (pastecart x y) = x"
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    81
  by (simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    82
34964
4e8be3c04d37 Replaced vec1 and dest_vec1 by abbreviation.
hoelzl
parents: 34291
diff changeset
    83
lemma sndcart_pastecart[simp]: "sndcart (pastecart x y) = y"
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    84
  by (simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    85
34964
4e8be3c04d37 Replaced vec1 and dest_vec1 by abbreviation.
hoelzl
parents: 34291
diff changeset
    86
lemma pastecart_fst_snd[simp]: "pastecart (fstcart z) (sndcart z) = z"
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    87
  by (simp add: Cart_eq pastecart_def fstcart_def sndcart_def split: sum.split)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    88
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    89
lemma pastecart_eq: "(x = y) \<longleftrightarrow> (fstcart x = fstcart y) \<and> (sndcart x = sndcart y)"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    90
  using pastecart_fst_snd[of x] pastecart_fst_snd[of y] by metis
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    91
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    92
lemma forall_pastecart: "(\<forall>p. P p) \<longleftrightarrow> (\<forall>x y. P (pastecart x y))"
35253
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    93
  by (metis pastecart_fst_snd)
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    94
35253
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    95
lemma exists_pastecart: "(\<exists>p. P p) \<longleftrightarrow> (\<exists>x y. P (pastecart x y))"
68dd8b51c6b8 tuned headers;
wenzelm
parents: 35113
diff changeset
    96
  by (metis pastecart_fst_snd)
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    97
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    98
end