src/HOL/Multivariate_Analysis/Finite_Cartesian_Product.thy
author huffman
Fri, 18 Dec 2009 19:00:11 -0800
changeset 34146 14595e0c27e8
parent 33715 8cce3a34c122
child 34289 c9c14c72d035
permissions -rw-r--r--
rename equals_zero_I to minus_unique (keep old name too)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33175
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     1
(* Title:      HOL/Library/Finite_Cartesian_Product
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     2
   Author:     Amine Chaieb, University of Cambridge
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
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
     8
imports Main (*FIXME: ATP_Linkup is only needed for metis at a few places. We could dispense of that by changing the proofs.*)
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)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    14
  ('a, 'b) "^" (infixl "^" 15)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    15
    = "UNIV :: ('b \<Rightarrow> 'a) set"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    16
  morphisms Cart_nth Cart_lambda ..
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    17
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    18
notation Cart_nth (infixl "$" 90)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    19
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    20
notation (xsymbols) Cart_lambda (binder "\<chi>" 10)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    21
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    22
lemma stupid_ext: "(\<forall>x. f x = g x) \<longleftrightarrow> (f = g)"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    23
  apply auto
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    24
  apply (rule ext)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    25
  apply auto
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    26
  done
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    27
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    28
lemma Cart_eq: "((x:: 'a ^ 'b) = y) \<longleftrightarrow> (\<forall>i. x$i = y$i)"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    29
  by (simp add: Cart_nth_inject [symmetric] expand_fun_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    30
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    31
lemma Cart_lambda_beta [simp]: "Cart_lambda g $ i = g i"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    32
  by (simp add: Cart_lambda_inverse)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    33
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    34
lemma Cart_lambda_unique:
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    35
  fixes f :: "'a ^ 'b"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    36
  shows "(\<forall>i. f$i = g i) \<longleftrightarrow> Cart_lambda g = f"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    37
  by (auto simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    38
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    39
lemma Cart_lambda_eta: "(\<chi> i. (g$i)) = g"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    40
  by (simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    41
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    42
text{* A non-standard sum to "paste" Cartesian products. *}
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    43
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    44
definition pastecart :: "'a ^ 'm \<Rightarrow> 'a ^ 'n \<Rightarrow> 'a ^ ('m + 'n)" where
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    45
  "pastecart f g = (\<chi> i. case i of Inl a \<Rightarrow> f$a | Inr b \<Rightarrow> g$b)"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    46
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    47
definition fstcart:: "'a ^('m + 'n) \<Rightarrow> 'a ^ 'm" where
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    48
  "fstcart f = (\<chi> i. (f$(Inl i)))"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    49
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    50
definition sndcart:: "'a ^('m + 'n) \<Rightarrow> 'a ^ 'n" where
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    51
  "sndcart f = (\<chi> i. (f$(Inr i)))"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    52
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    53
lemma nth_pastecart_Inl [simp]: "pastecart f g $ Inl a = f$a"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    54
  unfolding pastecart_def by simp
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    55
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    56
lemma nth_pastecart_Inr [simp]: "pastecart f g $ Inr b = g$b"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    57
  unfolding pastecart_def by simp
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    58
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    59
lemma nth_fstcart [simp]: "fstcart f $ i = f $ Inl i"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    60
  unfolding fstcart_def by simp
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    61
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    62
lemma nth_sndtcart [simp]: "sndcart f $ i = f $ Inr i"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    63
  unfolding sndcart_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 finite_sum_image: "(UNIV::('a + 'b) set) = range Inl \<union> range Inr"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    66
by (auto, case_tac x, auto)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    67
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    68
lemma fstcart_pastecart: "fstcart (pastecart (x::'a ^'m ) (y:: 'a ^ 'n)) = x"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    69
  by (simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    70
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    71
lemma sndcart_pastecart: "sndcart (pastecart (x::'a ^'m ) (y:: 'a ^ 'n)) = y"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    72
  by (simp add: Cart_eq)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    73
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    74
lemma pastecart_fst_snd: "pastecart (fstcart z) (sndcart z) = z"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    75
  by (simp add: Cart_eq pastecart_def fstcart_def sndcart_def split: sum.split)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    76
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    77
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
    78
  using pastecart_fst_snd[of x] pastecart_fst_snd[of y] by metis
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    79
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    80
lemma forall_pastecart: "(\<forall>p. P p) \<longleftrightarrow> (\<forall>x y. P (pastecart x y))"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    81
  by (metis pastecart_fst_snd fstcart_pastecart sndcart_pastecart)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    82
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    83
lemma exists_pastecart: "(\<exists>p. P p)  \<longleftrightarrow> (\<exists>x y. P (pastecart x y))"
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    84
  by (metis pastecart_fst_snd fstcart_pastecart sndcart_pastecart)
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    85
2083bde13ce1 distinguished session for multivariate analysis
himmelma
parents:
diff changeset
    86
end