sum.ML
author clasohm
Sun, 24 Apr 1994 11:27:38 +0200
changeset 70 9459592608e2
parent 38 7ef6ba42914b
permissions -rw-r--r--
renamed theory files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	HOL/sum
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1991  University of Cambridge
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     6
For sum.ML.  The disjoint sum of two types
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     7
*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     8
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     9
open Sum;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    10
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    11
(** Inl_Rep and Inr_Rep: Representations of the constructors **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    12
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    13
(*This counts as a non-emptiness result for admitting 'a+'b as a type*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    14
goalw Sum.thy [Sum_def] "Inl_Rep(a) : Sum";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    15
by (EVERY1 [rtac CollectI, rtac disjI1, rtac exI, rtac refl]);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    16
val Inl_RepI = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    17
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    18
goalw Sum.thy [Sum_def] "Inr_Rep(b) : Sum";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    19
by (EVERY1 [rtac CollectI, rtac disjI2, rtac exI, rtac refl]);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    20
val Inr_RepI = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    21
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    22
goal Sum.thy "inj_onto(Abs_Sum,Sum)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    23
by (rtac inj_onto_inverseI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    24
by (etac Abs_Sum_inverse 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    25
val inj_onto_Abs_Sum = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    26
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    27
(** Distinctness of Inl and Inr **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    28
5
968d2dccf2de added ~= for "not equals" and added ~: for "not in"
lcp
parents: 2
diff changeset
    29
goalw Sum.thy [Inl_Rep_def, Inr_Rep_def] "Inl_Rep(a) ~= Inr_Rep(b)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    30
by (EVERY1 [rtac notI,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    31
	    etac (fun_cong RS fun_cong RS fun_cong RS iffE), 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    32
	    rtac (notE RS ccontr),  etac (mp RS conjunct2), 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    33
	    REPEAT o (ares_tac [refl,conjI]) ]);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    34
val Inl_Rep_not_Inr_Rep = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    35
5
968d2dccf2de added ~= for "not equals" and added ~: for "not in"
lcp
parents: 2
diff changeset
    36
goalw Sum.thy [Inl_def,Inr_def] "Inl(a) ~= Inr(b)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    37
by (rtac (inj_onto_Abs_Sum RS inj_onto_contraD) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    38
by (rtac Inl_Rep_not_Inr_Rep 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    39
by (rtac Inl_RepI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    40
by (rtac Inr_RepI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    41
val Inl_not_Inr = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    42
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    43
val Inl_neq_Inr = standard (Inl_not_Inr RS notE);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    44
val Inr_neq_Inl = sym RS Inl_neq_Inr;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    45
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    46
(** Injectiveness of Inl and Inr **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    47
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    48
val [major] = goalw Sum.thy [Inl_Rep_def] "Inl_Rep(a) = Inl_Rep(c) ==> a=c";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    49
by (rtac (major RS fun_cong RS fun_cong RS fun_cong RS iffE) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    50
by (fast_tac HOL_cs 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    51
val Inl_Rep_inject = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    52
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    53
val [major] = goalw Sum.thy [Inr_Rep_def] "Inr_Rep(b) = Inr_Rep(d) ==> b=d";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    54
by (rtac (major RS fun_cong RS fun_cong RS fun_cong RS iffE) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    55
by (fast_tac HOL_cs 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    56
val Inr_Rep_inject = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    57
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    58
goalw Sum.thy [Inl_def] "inj(Inl)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    59
by (rtac injI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    60
by (etac (inj_onto_Abs_Sum RS inj_ontoD RS Inl_Rep_inject) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    61
by (rtac Inl_RepI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    62
by (rtac Inl_RepI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    63
val inj_Inl = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    64
val Inl_inject = inj_Inl RS injD;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    65
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    66
goalw Sum.thy [Inr_def] "inj(Inr)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    67
by (rtac injI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    68
by (etac (inj_onto_Abs_Sum RS inj_ontoD RS Inr_Rep_inject) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    69
by (rtac Inr_RepI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    70
by (rtac Inr_RepI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    71
val inj_Inr = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    72
val Inr_inject = inj_Inr RS injD;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    73
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    74
goal Sum.thy "(Inl(x)=Inl(y)) = (x=y)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    75
br iffI 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    76
be (rewrite_rule [inj_def] Inl_inject) 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    77
be ssubst 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    78
br refl 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    79
val Inl_inj = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    80
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    81
goal Sum.thy "(Inr(x)=Inr(y)) = (x=y)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    82
br iffI 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    83
be (rewrite_rule [inj_def] Inr_inject) 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    84
be ssubst 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    85
br refl 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    86
val Inr_inj = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    87
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
    88
(** sum_case -- the selection operator for sums **)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    89
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
    90
goalw Sum.thy [sum_case_def] "sum_case(Inl(x), f, g) = f(x)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    91
by (fast_tac (set_cs addIs [select_equality] 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    92
		     addSEs [make_elim Inl_inject, Inl_neq_Inr]) 1);
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
    93
val sum_case_Inl = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    94
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
    95
goalw Sum.thy [sum_case_def] "sum_case(Inr(x), f, g) = g(x)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    96
by (fast_tac (set_cs addIs [select_equality] 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    97
		     addSEs [make_elim Inr_inject, Inr_neq_Inl]) 1);
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
    98
val sum_case_Inr = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    99
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   100
(** Exhaustion rule for sums -- a degenerate form of induction **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   101
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   102
val prems = goalw Sum.thy [Inl_def,Inr_def]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   103
    "[| !!x::'a. s = Inl(x) ==> P;  !!y::'b. s = Inr(y) ==> P \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   104
\    |] ==> P";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   105
by (rtac (rewrite_rule [Sum_def] Rep_Sum RS CollectE) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   106
by (REPEAT (eresolve_tac [disjE,exE] 1
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   107
     ORELSE EVERY1 [resolve_tac prems, 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   108
		    etac subst,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   109
		    rtac (Rep_Sum_inverse RS sym)]));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   110
val sumE = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   111
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   112
goal Sum.thy "sum_case(s, %x::'a. f(Inl(x)), %y::'b. f(Inr(y))) = f(s)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   113
by (EVERY1 [res_inst_tac [("s","s")] sumE, 
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   114
	    etac ssubst, rtac sum_case_Inl,
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   115
	    etac ssubst, rtac sum_case_Inr]);
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   116
val surjective_sum = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   117
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   118
goal Sum.thy "R(sum_case(s,f,g)) = \
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   119
\             ((! x. s = Inl(x) --> R(f(x))) & (! y. s = Inr(y) --> R(g(y))))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   120
by (rtac sumE 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   121
by (etac ssubst 1);
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   122
by (stac sum_case_Inl 1);
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   123
by (fast_tac (set_cs addSEs [make_elim Inl_inject, Inl_neq_Inr]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   124
by (etac ssubst 1);
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   125
by (stac sum_case_Inr 1);
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   126
by (fast_tac (set_cs addSEs [make_elim Inr_inject, Inr_neq_Inl]) 1);
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   127
val expand_sum_case = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   128
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   129
val sum_ss = pair_ss addsimps [sum_case_Inl, sum_case_Inr];
2
befa4e9f7c90 Added weak congruence rules to HOL: if_weak_cong, case_weak_cong,
lcp
parents: 0
diff changeset
   130
befa4e9f7c90 Added weak congruence rules to HOL: if_weak_cong, case_weak_cong,
lcp
parents: 0
diff changeset
   131
(*Prevents simplification of f and g: much faster*)
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   132
val sum_case_weak_cong = prove_goal Sum.thy
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 5
diff changeset
   133
  "s=t ==> sum_case(s,f,g) = sum_case(t,f,g)"
2
befa4e9f7c90 Added weak congruence rules to HOL: if_weak_cong, case_weak_cong,
lcp
parents: 0
diff changeset
   134
  (fn [prem] => [rtac (prem RS arg_cong) 1]);