src/CCL/Type.ML
author kleing
Thu, 29 Jun 2006 01:08:08 +0200
changeset 19960 a0e3f2df9b0e
parent 17456 bcf7544875b2
permissions -rw-r--r--
use -f in cp to overwrite read-only files (e.g. .svn in document/)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
     1
(*  Title:      CCL/Type.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1459
d12da312eff4 expanded tabs
clasohm
parents: 1087
diff changeset
     3
    Author:     Martin Coen, Cambridge University Computer Laboratory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
val simp_type_defs = [Subtype_def,Unit_def,Bool_def,Plus_def,Sigma_def,Pi_def,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
                      Lift_def,Tall_def,Tex_def];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
val ind_type_defs = [Nat_def,List_def];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
val simp_data_defs = [one_def,inl_def,inr_def];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
val ind_data_defs = [zero_def,succ_def,nil_def,cons_def];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    14
goal (the_context ()) "A <= B <-> (ALL x. x:A --> x:B)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
by (fast_tac set_cs 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
    16
qed "subsetXH";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
(*** Exhaustion Rules ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
fun mk_XH_tac thy defs rls s = prove_goalw thy defs s (fn _ => [cfast_tac rls 1]);
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    21
val XH_tac = mk_XH_tac (the_context ()) simp_type_defs [];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
val EmptyXH = XH_tac "a : {} <-> False";
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    24
val SubtypeXH = XH_tac "a : {x:A. P(x)} <-> (a:A & P(a))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
val UnitXH = XH_tac "a : Unit          <-> a=one";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
val BoolXH = XH_tac "a : Bool          <-> a=true | a=false";
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    27
val PlusXH = XH_tac "a : A+B           <-> (EX x:A. a=inl(x)) | (EX x:B. a=inr(x))";
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    28
val PiXH   = XH_tac "a : PROD x:A. B(x) <-> (EX b. a=lam x. b(x) & (ALL x:A. b(x):B(x)))";
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    29
val SgXH   = XH_tac "a : SUM x:A. B(x)  <-> (EX x:A. EX y:B(x).a=<x,y>)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val XHs = [EmptyXH,SubtypeXH,UnitXH,BoolXH,PlusXH,PiXH,SgXH];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
val LiftXH = XH_tac "a : [A] <-> (a=bot | a:A)";
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    34
val TallXH = XH_tac "a : TALL X. B(X) <-> (ALL X. a:B(X))";
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    35
val TexXH  = XH_tac "a : TEX X. B(X) <-> (EX X. a:B(X))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
val case_rls = XH_to_Es XHs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
(*** Canonical Type Rules ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    41
fun mk_canT_tac thy xhs s = prove_goal thy s
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
                 (fn prems => [fast_tac (set_cs addIs (prems @ (xhs RL [iffD2]))) 1]);
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    43
val canT_tac = mk_canT_tac (the_context ()) XHs;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
val oneT   = canT_tac "one : Unit";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
val trueT  = canT_tac "true : Bool";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
val falseT = canT_tac "false : Bool";
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    48
val lamT   = canT_tac "[| !!x. x:A ==> b(x):B(x) |] ==> lam x. b(x) : Pi(A,B)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
val pairT  = canT_tac "[| a:A; b:B(a) |] ==> <a,b>:Sigma(A,B)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
val inlT   = canT_tac "a:A ==> inl(a) : A+B";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
val inrT   = canT_tac "b:B ==> inr(b) : A+B";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
val canTs = [oneT,trueT,falseT,pairT,lamT,inlT,inrT];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
(*** Non-Canonical Type Rules ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
local
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    58
val lemma = prove_goal (the_context ()) "[| a:B(u);  u=v |] ==> a : B(v)"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
                   (fn prems => [cfast_tac prems 1]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
in
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    61
fun mk_ncanT_tac thy defs top_crls crls s = prove_goalw thy defs s
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
  (fn major::prems => [(resolve_tac ([major] RL top_crls) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
                       (REPEAT_SOME (eresolve_tac (crls @ [exE,bexE,conjE,disjE]))),
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    64
                       (ALLGOALS (asm_simp_tac term_ss)),
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    65
                       (ALLGOALS (ares_tac (prems RL [lemma]) ORELSE'
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
    66
                                  etac bspec )),
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
                       (safe_tac (ccl_cs addSIs prems))]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    70
val ncanT_tac = mk_ncanT_tac (the_context ()) [] case_rls case_rls;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    72
val ifT = ncanT_tac
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
     "[| b:Bool; b=true ==> t:A(true); b=false ==> u:A(false) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
\     if b then t else u : A(b)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    76
val applyT = ncanT_tac
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
    "[| f : Pi(A,B);  a:A |] ==> f ` a : B(a)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    79
val splitT = ncanT_tac
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
    "[| p:Sigma(A,B); !!x y. [| x:A;  y:B(x); p=<x,y>  |] ==> c(x,y):C(<x,y>) |] ==>  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
\     split(p,c):C(p)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    83
val whenT = ncanT_tac
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
     "[| p:A+B; !!x.[| x:A;  p=inl(x) |] ==> a(x):C(inl(x)); \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
\               !!y.[| y:B;  p=inr(y) |] ==> b(y):C(inr(y)) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
\     when(p,a,b) : C(p)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
val ncanTs = [ifT,applyT,splitT,whenT];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
(*** Subtypes ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
val SubtypeD1 = standard ((SubtypeXH RS iffD1) RS conjunct1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
val SubtypeD2 = standard ((SubtypeXH RS iffD1) RS conjunct2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
    95
val prems = goal (the_context ())
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
     "[| a:A;  P(a) |] ==> a : {x:A. P(x)}";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
by (REPEAT (resolve_tac (prems@[SubtypeXH RS iffD2,conjI]) 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
    98
qed "SubtypeI";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   100
val prems = goal (the_context ())
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
     "[| a : {x:A. P(x)};  [| a:A;  P(a) |] ==> Q |] ==> Q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
by (REPEAT (resolve_tac (prems@[SubtypeD1,SubtypeD2]) 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   103
qed "SubtypeE";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
(*** Monotonicity ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
5062
fbdb0b541314 isatool fixgoal;
wenzelm
parents: 3837
diff changeset
   107
Goal "mono (%X. X)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
by (REPEAT (ares_tac [monoI] 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   109
qed "idM";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
5062
fbdb0b541314 isatool fixgoal;
wenzelm
parents: 3837
diff changeset
   111
Goal "mono(%X. A)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
by (REPEAT (ares_tac [monoI,subset_refl] 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   113
qed "constM";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   115
val major::prems = goal (the_context ())
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   116
    "mono(%X. A(X)) ==> mono(%X.[A(X)])";
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   117
by (rtac (subsetI RS monoI) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   118
by (dtac (LiftXH RS iffD1) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   119
by (etac disjE 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   120
by (etac (disjI1 RS (LiftXH RS iffD2)) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   121
by (rtac (disjI2 RS (LiftXH RS iffD2)) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   122
by (etac (major RS monoD RS subsetD) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   123
by (assume_tac 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   124
qed "LiftM";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   126
val prems = goal (the_context ())
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   127
    "[| mono(%X. A(X)); !!x X. x:A(X) ==> mono(%X. B(X,x)) |] ==> \
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   128
\    mono(%X. Sigma(A(X),B(X)))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
by (REPEAT (ares_tac ([subsetI RS monoI] @ canTs) 1 ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
            eresolve_tac ([bspec,exE,conjE,disjE,bexE] @ case_rls) 1 ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
            (resolve_tac (prems RL [monoD RS subsetD]) 1 THEN assume_tac 1) ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
            hyp_subst_tac 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   133
qed "SgM";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   135
val prems = goal (the_context ())
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   136
    "[| !!x. x:A ==> mono(%X. B(X,x)) |] ==> mono(%X. Pi(A,B(X)))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
by (REPEAT (ares_tac ([subsetI RS monoI] @ canTs) 1 ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
            eresolve_tac ([bspec,exE,conjE,disjE,bexE] @ case_rls) 1 ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
            (resolve_tac (prems RL [monoD RS subsetD]) 1 THEN assume_tac 1) ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
            hyp_subst_tac 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   141
qed "PiM";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   143
val prems = goal (the_context ())
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   144
     "[| mono(%X. A(X));  mono(%X. B(X)) |] ==> mono(%X. A(X)+B(X))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
by (REPEAT (ares_tac ([subsetI RS monoI] @ canTs) 1 ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
            eresolve_tac ([bspec,exE,conjE,disjE,bexE] @ case_rls) 1 ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
            (resolve_tac (prems RL [monoD RS subsetD]) 1 THEN assume_tac 1) ORELSE
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
            hyp_subst_tac 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   149
qed "PlusM";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
(**************** RECURSIVE TYPES ******************)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
(*** Conversion Rules for Fixed Points via monotonicity and Tarski ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
5062
fbdb0b541314 isatool fixgoal;
wenzelm
parents: 3837
diff changeset
   155
Goal "mono(%X. Unit+X)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
by (REPEAT (ares_tac [PlusM,constM,idM] 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   157
qed "NatM";
1087
c1ccf6679a96 replaced store_thm by bind_thm
clasohm
parents: 757
diff changeset
   158
bind_thm("def_NatB", result() RS (Nat_def RS def_lfp_Tarski));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
5062
fbdb0b541314 isatool fixgoal;
wenzelm
parents: 3837
diff changeset
   160
Goal "mono(%X.(Unit+Sigma(A,%y. X)))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
by (REPEAT (ares_tac [PlusM,SgM,constM,idM] 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   162
qed "ListM";
1087
c1ccf6679a96 replaced store_thm by bind_thm
clasohm
parents: 757
diff changeset
   163
bind_thm("def_ListB", result() RS (List_def RS def_lfp_Tarski));
c1ccf6679a96 replaced store_thm by bind_thm
clasohm
parents: 757
diff changeset
   164
bind_thm("def_ListsB", result() RS (Lists_def RS def_gfp_Tarski));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
5062
fbdb0b541314 isatool fixgoal;
wenzelm
parents: 3837
diff changeset
   166
Goal "mono(%X.({} + Sigma(A,%y. X)))";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
by (REPEAT (ares_tac [PlusM,SgM,constM,idM] 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   168
qed "IListsM";
1087
c1ccf6679a96 replaced store_thm by bind_thm
clasohm
parents: 757
diff changeset
   169
bind_thm("def_IListsB", result() RS (ILists_def RS def_gfp_Tarski));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
val ind_type_eqs = [def_NatB,def_ListB,def_ListsB,def_IListsB];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
(*** Exhaustion Rules ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   175
fun mk_iXH_tac teqs ddefs rls s = prove_goalw (the_context ()) ddefs s
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
           (fn _ => [resolve_tac (teqs RL [XHlemma1]) 1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
                     fast_tac (set_cs addSIs canTs addSEs case_rls) 1]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
val iXH_tac = mk_iXH_tac ind_type_eqs ind_data_defs [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   181
val NatXH  = iXH_tac "a : Nat <-> (a=zero | (EX x:Nat. a=succ(x)))";
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   182
val ListXH = iXH_tac "a : List(A) <-> (a=[] | (EX x:A. EX xs:List(A).a=x$xs))";
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   183
val ListsXH = iXH_tac "a : Lists(A) <-> (a=[] | (EX x:A. EX xs:Lists(A).a=x$xs))";
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   184
val IListsXH = iXH_tac "a : ILists(A) <-> (EX x:A. EX xs:ILists(A).a=x$xs)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
val iXHs = [NatXH,ListXH];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
val icase_rls = XH_to_Es iXHs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
(*** Type Rules ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   191
val icanT_tac = mk_canT_tac (the_context ()) iXHs;
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   192
val incanT_tac = mk_ncanT_tac (the_context ()) [] icase_rls case_rls;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
val zeroT = icanT_tac "zero : Nat";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
val succT = icanT_tac "n:Nat ==> succ(n) : Nat";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
val nilT  = icanT_tac "[] : List(A)";
289
78541329ff35 changed "." to "$" to eliminate ambiguity
clasohm
parents: 8
diff changeset
   197
val consT = icanT_tac "[| h:A;  t:List(A) |] ==> h$t : List(A)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
val icanTs = [zeroT,succT,nilT,consT];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   201
val ncaseT = incanT_tac
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
     "[| n:Nat; n=zero ==> b:C(zero); \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
\        !!x.[| x:Nat;  n=succ(x) |] ==> c(x):C(succ(x)) |] ==>  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
\     ncase(n,b,c) : C(n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
val lcaseT = incanT_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
     "[| l:List(A); l=[] ==> b:C([]); \
289
78541329ff35 changed "." to "$" to eliminate ambiguity
clasohm
parents: 8
diff changeset
   208
\        !!h t.[| h:A;  t:List(A); l=h$t |] ==> c(h,t):C(h$t) |] ==> \
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
\     lcase(l,b,c) : C(l)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
val incanTs = [ncaseT,lcaseT];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
(*** Induction Rules ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
val ind_Ms = [NatM,ListM];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   217
fun mk_ind_tac ddefs tdefs Ms canTs case_rls s = prove_goalw (the_context ()) ddefs s
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
     (fn major::prems => [resolve_tac (Ms RL ([major] RL (tdefs RL [def_induct]))) 1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
                          fast_tac (set_cs addSIs (prems @ canTs) addSEs case_rls) 1]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
val ind_tac = mk_ind_tac ind_data_defs ind_type_defs ind_Ms canTs case_rls;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
val Nat_ind = ind_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
     "[| n:Nat; P(zero); !!x.[| x:Nat; P(x) |] ==> P(succ(x)) |] ==>  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
\     P(n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
val List_ind = ind_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
     "[| l:List(A); P([]); \
289
78541329ff35 changed "." to "$" to eliminate ambiguity
clasohm
parents: 8
diff changeset
   229
\        !!x xs.[| x:A;  xs:List(A); P(xs) |] ==> P(x$xs) |] ==> \
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
\     P(l)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
val inds = [Nat_ind,List_ind];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
(*** Primitive Recursive Rules ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   236
fun mk_prec_tac inds s = prove_goal (the_context ()) s
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
     (fn major::prems => [resolve_tac ([major] RL inds) 1,
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
   238
                          ALLGOALS (simp_tac term_ss THEN'
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
                                    fast_tac (set_cs addSIs prems))]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
val prec_tac = mk_prec_tac inds;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
val nrecT = prec_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
     "[| n:Nat; b:C(zero); \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
\        !!x g.[| x:Nat; g:C(x) |] ==> c(x,g):C(succ(x)) |] ==>  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
\     nrec(n,b,c) : C(n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
val lrecT = prec_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
     "[| l:List(A); b:C([]); \
289
78541329ff35 changed "." to "$" to eliminate ambiguity
clasohm
parents: 8
diff changeset
   249
\        !!x xs g.[| x:A;  xs:List(A); g:C(xs) |] ==> c(x,xs,g):C(x$xs) |] ==>  \
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
\     lrec(l,b,c) : C(l)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252
val precTs = [nrecT,lrecT];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   253
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   254
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   255
(*** Theorem proving ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   256
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   257
val [major,minor] = goal (the_context ())
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   258
    "[| <a,b> : Sigma(A,B);  [| a:A;  b:B(a) |] ==> P   \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
\    |] ==> P";
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   260
by (rtac (major RS (XH_to_E SgXH)) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   261
by (rtac minor 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   262
by (ALLGOALS (fast_tac term_cs));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   263
qed "SgE2";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   264
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   265
(* General theorem proving ignores non-canonical term-formers,             *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   266
(*         - intro rules are type rules for canonical terms                *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   267
(*         - elim rules are case rules (no non-canonical terms appear)     *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
val type_cs = term_cs addSIs (SubtypeI::(canTs @ icanTs))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
                      addSEs (SubtypeE::(XH_to_Es XHs));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   273
(*** Infinite Data Types ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   274
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   275
val [mono] = goal (the_context ()) "mono(f) ==> lfp(f) <= gfp(f)";
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   276
by (rtac (lfp_lowerbound RS subset_trans) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   277
by (rtac (mono RS gfp_lemma3) 1);
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   278
by (rtac subset_refl 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   279
qed "lfp_subset_gfp";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   280
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   281
val prems = goal (the_context ())
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   282
    "[| a:A;  !!x X.[| x:A;  ALL y:A. t(y):X |] ==> t(x) : B(X) |] ==> \
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   283
\    t(a) : gfp(B)";
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   284
by (rtac coinduct 1);
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   285
by (res_inst_tac [("P","%x. EX y:A. x=t(y)")] CollectI 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   286
by (ALLGOALS (fast_tac (ccl_cs addSIs prems)));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   287
qed "gfpI";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   288
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   289
val rew::prem::prems = goal (the_context ())
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
   290
    "[| C==gfp(B);  a:A;  !!x X.[| x:A;  ALL y:A. t(y):X |] ==> t(x) : B(X) |] ==> \
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   291
\    t(a) : C";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   292
by (rewtac rew);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   293
by (REPEAT (ares_tac ((prem RS gfpI)::prems) 1));
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
   294
qed "def_gfpI";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   295
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   296
(* EG *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   297
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 5062
diff changeset
   298
val prems = goal (the_context ())
289
78541329ff35 changed "." to "$" to eliminate ambiguity
clasohm
parents: 8
diff changeset
   299
    "letrec g x be zero$g(x) in g(bot) : Lists(Nat)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   300
by (rtac (refl RS (XH_to_I UnitXH) RS (Lists_def RS def_gfpI)) 1);
2035
e329b36d9136 Ran expandshort; used stac instead of ssubst
paulson
parents: 1459
diff changeset
   301
by (stac letrecB 1);
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
   302
by (rewtac cons_def);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   303
by (fast_tac type_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   304
result();