src/HOL/ex/MT.thy
author wenzelm
Mon, 11 Jan 2016 21:21:02 +0100
changeset 62145 5b946c81dfbf
parent 61343 5b5656a63bd6
permissions -rw-r--r--
eliminated old defs;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
     1
(*  Title:      HOL/ex/MT.thy
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1376
diff changeset
     2
    Author:     Jacob Frost, Cambridge University Computer Laboratory
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     3
    Copyright   1993  University of Cambridge
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     4
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     5
Based upon the article
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     6
    Robin Milner and Mads Tofte,
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     7
    Co-induction in Relational Semantics,
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     8
    Theoretical Computer Science 87 (1991), pages 209-220.
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     9
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    10
Written up as
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    11
    Jacob Frost, A Case Study of Co_induction in Isabelle/HOL
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    12
    Report 308, Computer Lab, University of Cambridge (1993).
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    13
*)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    14
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60774
diff changeset
    15
section \<open>Milner-Tofte: Co-induction in Relational Semantics\<close>
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
    16
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    17
theory MT
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    18
imports Main
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    19
begin
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    20
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    21
typedecl Const
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    22
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    23
typedecl ExVar
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    24
typedecl Ex
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    25
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    26
typedecl TyConst
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    27
typedecl Ty
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    28
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    29
typedecl Clos
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    30
typedecl Val
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    31
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    32
typedecl ValEnv
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    33
typedecl TyEnv
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    34
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    35
consts
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    36
  c_app :: "[Const, Const] => Const"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    37
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    38
  e_const :: "Const => Ex"
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    39
  e_var :: "ExVar => Ex"
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    40
  e_fn :: "[ExVar, Ex] => Ex" ("fn _ => _" [0,51] 1000)
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    41
  e_fix :: "[ExVar, ExVar, Ex] => Ex" ("fix _ ( _ ) = _" [0,51,51] 1000)
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    42
  e_app :: "[Ex, Ex] => Ex" ("_ @@ _" [51,51] 1000)
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    43
  e_const_fst :: "Ex => Const"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    44
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    45
  t_const :: "TyConst => Ty"
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    46
  t_fun :: "[Ty, Ty] => Ty" ("_ -> _" [51,51] 1000)
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    47
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    48
  v_const :: "Const => Val"
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    49
  v_clos :: "Clos => Val"
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    50
1376
92f83b9d17e1 removed quotes from consts and syntax sections
clasohm
parents: 1151
diff changeset
    51
  ve_emp :: ValEnv
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    52
  ve_owr :: "[ValEnv, ExVar, Val] => ValEnv" ("_ + { _ |-> _ }" [36,0,0] 50)
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    53
  ve_dom :: "ValEnv => ExVar set"
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    54
  ve_app :: "[ValEnv, ExVar] => Val"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    55
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    56
  clos_mk :: "[ExVar, Ex, ValEnv] => Clos" ("<| _ , _ , _ |>" [0,0,0] 1000)
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    57
1376
92f83b9d17e1 removed quotes from consts and syntax sections
clasohm
parents: 1151
diff changeset
    58
  te_emp :: TyEnv
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    59
  te_owr :: "[TyEnv, ExVar, Ty] => TyEnv" ("_ + { _ |=> _ }" [36,0,0] 50)
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    60
  te_app :: "[TyEnv, ExVar] => Ty"
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    61
  te_dom :: "TyEnv => ExVar set"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    62
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
    63
  isof :: "[Const, Ty] => bool" ("_ isof _" [36,36] 50)
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    64
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    65
(*
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    66
  Expression constructors must be injective, distinct and it must be possible
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    67
  to do induction over expressions.
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    68
*)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    69
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    70
(* All the constructors are injective *)
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    71
axiomatization where
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    72
  e_const_inj: "e_const(c1) = e_const(c2) ==> c1 = c2" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    73
  e_var_inj: "e_var(ev1) = e_var(ev2) ==> ev1 = ev2" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    74
  e_fn_inj: "fn ev1 => e1 = fn ev2 => e2 ==> ev1 = ev2 & e1 = e2" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    75
  e_fix_inj:
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    76
    " fix ev11e(v12) = e1 = fix ev21(ev22) = e2 ==>
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    77
     ev11 = ev21 & ev12 = ev22 & e1 = e2" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    78
  e_app_inj: "e11 @@ e12 = e21 @@ e22 ==> e11 = e21 & e12 = e22"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    79
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    80
(* All constructors are distinct *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    81
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    82
axiomatization where
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    83
  e_disj_const_var: "~e_const(c) = e_var(ev)" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    84
  e_disj_const_fn: "~e_const(c) = fn ev => e" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    85
  e_disj_const_fix: "~e_const(c) = fix ev1(ev2) = e" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    86
  e_disj_const_app: "~e_const(c) = e1 @@ e2" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    87
  e_disj_var_fn: "~e_var(ev1) = fn ev2 => e" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    88
  e_disj_var_fix: "~e_var(ev) = fix ev1(ev2) = e" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    89
  e_disj_var_app: "~e_var(ev) = e1 @@ e2" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    90
  e_disj_fn_fix: "~fn ev1 => e1 = fix ev21(ev22) = e2" and
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    91
  e_disj_fn_app: "~fn ev1 => e1 = e21 @@ e22" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    92
  e_disj_fix_app: "~fix ev11(ev12) = e1 = e21 @@ e22"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    93
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    94
(* Strong elimination, induction on expressions  *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    95
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
    96
axiomatization where
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    97
  e_ind:
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    98
    " [|  !!ev. P(e_var(ev));
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
    99
         !!c. P(e_const(c));
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   100
         !!ev e. P(e) ==> P(fn ev => e);
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   101
         !!ev1 ev2 e. P(e) ==> P(fix ev1(ev2) = e);
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   102
         !!e1 e2. P(e1) ==> P(e2) ==> P(e1 @@ e2)
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   103
     |] ==>
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   104
   P(e)
1151
c820b3cc3df0 removed \...\ inside strings
clasohm
parents: 1026
diff changeset
   105
   "
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   106
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   107
(* Types - same scheme as for expressions *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   108
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   109
(* All constructors are injective *)
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   110
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   111
axiomatization where
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   112
  t_const_inj: "t_const(c1) = t_const(c2) ==> c1 = c2" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   113
  t_fun_inj: "t11 -> t12 = t21 -> t22 ==> t11 = t21 & t12 = t22"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   114
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   115
(* All constructors are distinct, not needed so far ... *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   116
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   117
(* Strong elimination, induction on types *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   118
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   119
axiomatization where
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   120
 t_ind:
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   121
    "[| !!p. P(t_const p); !!t1 t2. P(t1) ==> P(t2) ==> P(t_fun t1 t2) |]
1151
c820b3cc3df0 removed \...\ inside strings
clasohm
parents: 1026
diff changeset
   122
    ==> P(t)"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   123
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   124
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   125
(* Values - same scheme again *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   126
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   127
(* All constructors are injective *)
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   128
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   129
axiomatization where
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   130
  v_const_inj: "v_const(c1) = v_const(c2) ==> c1 = c2" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   131
  v_clos_inj:
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   132
    " v_clos(<|ev1,e1,ve1|>) = v_clos(<|ev2,e2,ve2|>) ==>
1151
c820b3cc3df0 removed \...\ inside strings
clasohm
parents: 1026
diff changeset
   133
     ev1 = ev2 & e1 = e2 & ve1 = ve2"
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   134
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   135
(* All constructors are distinct *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   136
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   137
axiomatization where
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   138
  v_disj_const_clos: "~v_const(c) = v_clos(cl)"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   139
15450
43dfc914d1b8 inserted quotes preparatory to conversion
paulson
parents: 12338
diff changeset
   140
(* No induction on values: they are a codatatype! ... *)
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   141
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   142
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   143
(*
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   144
  Value environments bind variables to values. Only the following trivial
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   145
  properties are needed.
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   146
*)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   147
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   148
axiomatization where
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   149
  ve_dom_owr: "ve_dom(ve + {ev |-> v}) = ve_dom(ve) Un {ev}" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   150
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   151
  ve_app_owr1: "ve_app (ve + {ev |-> v}) ev=v" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   152
  ve_app_owr2: "~ev1=ev2 ==> ve_app (ve+{ev1 |-> v}) ev2=ve_app ve ev2"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   153
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   154
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   155
(* Type Environments bind variables to types. The following trivial
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   156
properties are needed.  *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   157
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   158
axiomatization where
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   159
  te_dom_owr: "te_dom(te + {ev |=> t}) = te_dom(te) Un {ev}" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   160
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   161
  te_app_owr1: "te_app (te + {ev |=> t}) ev=t" and
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   162
  te_app_owr2: "~ev1=ev2 ==> te_app (te+{ev1 |=> t}) ev2=te_app te ev2"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   163
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   164
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   165
(* The dynamic semantics is defined inductively by a set of inference
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   166
rules.  These inference rules allows one to draw conclusions of the form ve
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   167
|- e ---> v, read the expression e evaluates to the value v in the value
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   168
environment ve.  Therefore the relation _ |- _ ---> _ is defined in Isabelle
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   169
as the least fixpoint of the functor eval_fun below.  From this definition
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   170
introduction rules and a strong elimination (induction) rule can be
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   171
derived.
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   172
*)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   173
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   174
definition eval_fun :: "((ValEnv * Ex) * Val) set => ((ValEnv * Ex) * Val) set"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   175
  where "eval_fun(s) ==
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   176
     { pp.
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   177
       (? ve c. pp=((ve,e_const(c)),v_const(c))) |
1151
c820b3cc3df0 removed \...\ inside strings
clasohm
parents: 1026
diff changeset
   178
       (? ve x. pp=((ve,e_var(x)),ve_app ve x) & x:ve_dom(ve)) |
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   179
       (? ve e x. pp=((ve,fn x => e),v_clos(<|x,e,ve|>)))|
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   180
       ( ? ve e x f cl.
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   181
           pp=((ve,fix f(x) = e),v_clos(cl)) &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   182
           cl=<|x, e, ve+{f |-> v_clos(cl)} |>
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   183
       ) |
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   184
       ( ? ve e1 e2 c1 c2.
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   185
           pp=((ve,e1 @@ e2),v_const(c_app c1 c2)) &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   186
           ((ve,e1),v_const(c1)):s & ((ve,e2),v_const(c2)):s
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   187
       ) |
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   188
       ( ? ve vem e1 e2 em xm v v2.
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   189
           pp=((ve,e1 @@ e2),v) &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   190
           ((ve,e1),v_clos(<|xm,em,vem|>)):s &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   191
           ((ve,e2),v2):s &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   192
           ((vem+{xm |-> v2},em),v):s
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   193
       )
1151
c820b3cc3df0 removed \...\ inside strings
clasohm
parents: 1026
diff changeset
   194
     }"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   195
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   196
definition eval_rel :: "((ValEnv * Ex) * Val) set"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   197
  where "eval_rel == lfp(eval_fun)"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   198
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   199
definition eval :: "[ValEnv, Ex, Val] => bool"  ("_ |- _ ---> _" [36,0,36] 50)
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   200
  where "ve |- e ---> v == ((ve,e),v) \<in> eval_rel"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   201
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   202
(* The static semantics is defined in the same way as the dynamic
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   203
semantics.  The relation te |- e ===> t express the expression e has the
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   204
type t in the type environment te.
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   205
*)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   206
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   207
definition elab_fun :: "((TyEnv * Ex) * Ty) set => ((TyEnv * Ex) * Ty) set"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   208
  where "elab_fun(s) ==
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   209
    { pp.
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   210
      (? te c t. pp=((te,e_const(c)),t) & c isof t) |
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   211
      (? te x. pp=((te,e_var(x)),te_app te x) & x:te_dom(te)) |
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   212
      (? te x e t1 t2. pp=((te,fn x => e),t1->t2) & ((te+{x |=> t1},e),t2):s) |
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   213
      (? te f x e t1 t2.
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   214
         pp=((te,fix f(x)=e),t1->t2) & ((te+{f |=> t1->t2}+{x |=> t1},e),t2):s
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   215
      ) |
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   216
      (? te e1 e2 t1 t2.
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   217
         pp=((te,e1 @@ e2),t2) & ((te,e1),t1->t2):s & ((te,e2),t1):s
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   218
      )
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   219
    }"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   220
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   221
definition elab_rel :: "((TyEnv * Ex) * Ty) set"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   222
  where "elab_rel == lfp(elab_fun)"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   223
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   224
definition elab :: "[TyEnv, Ex, Ty] => bool"  ("_ |- _ ===> _" [36,0,36] 50)
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   225
  where "te |- e ===> t == ((te,e),t):elab_rel"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   226
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   227
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   228
(* The original correspondence relation *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   229
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   230
definition isof_env :: "[ValEnv,TyEnv] => bool" ("_ isofenv _")
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   231
  where "ve isofenv te ==
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   232
    ve_dom(ve) = te_dom(te) &
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   233
     (! x.
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   234
         x:ve_dom(ve) -->
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   235
         (? c. ve_app ve x = v_const(c) & c isof te_app te x))"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   236
51305
4a96f9e28e6d eliminated legacy 'axioms';
wenzelm
parents: 42793
diff changeset
   237
axiomatization where
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   238
  isof_app: "[| c1 isof t1->t2; c2 isof t1 |] ==> c_app c1 c2 isof t2"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   239
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   240
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   241
(* The extented correspondence relation *)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   242
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   243
definition hasty_fun :: "(Val * Ty) set => (Val * Ty) set"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   244
  where "hasty_fun(r) ==
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   245
    { p.
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   246
       ( ? c t. p = (v_const(c),t) & c isof t) |
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   247
       ( ? ev e ve t te.
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   248
           p = (v_clos(<|ev,e,ve|>),t) &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   249
           te |- fn ev => e ===> t &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   250
           ve_dom(ve) = te_dom(te) &
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   251
           (! ev1. ev1:ve_dom(ve) --> (ve_app ve ev1,te_app te ev1) : r)
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   252
       )
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   253
    }"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   254
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   255
definition hasty_rel :: "(Val * Ty) set"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   256
  where "hasty_rel == gfp(hasty_fun)"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   257
62145
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   258
definition hasty :: "[Val, Ty] => bool" ("_ hasty _" [36,36] 50)
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   259
  where "v hasty t == (v,t) : hasty_rel"
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   260
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   261
definition hasty_env :: "[ValEnv,TyEnv] => bool" ("_ hastyenv _ " [36,36] 35)
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   262
  where "ve hastyenv te ==
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   263
    ve_dom(ve) = te_dom(te) &
5b946c81dfbf eliminated old defs;
wenzelm
parents: 61343
diff changeset
   264
      (! x. x: ve_dom(ve) --> ve_app ve x hasty te_app te x)"
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   265
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   266
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   267
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   268
(* Inference systems                                            *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   269
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   270
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60774
diff changeset
   271
ML \<open>
60774
6c28d8ed2488 proper context;
wenzelm
parents: 58889
diff changeset
   272
fun infsys_mono_tac ctxt = REPEAT (ares_tac ctxt (@{thms basic_monos} @ [allI, impI]) 1)
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60774
diff changeset
   273
\<close>
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   274
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   275
lemma infsys_p1: "P a b ==> P (fst (a,b)) (snd (a,b))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   276
  by simp
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   277
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   278
lemma infsys_p2: "P (fst (a,b)) (snd (a,b)) ==> P a b"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   279
  by simp
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   280
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   281
lemma infsys_pp1: "P a b c ==> P (fst(fst((a,b),c))) (snd(fst ((a,b),c))) (snd ((a,b),c))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   282
  by simp
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   283
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   284
lemma infsys_pp2: "P (fst(fst((a,b),c))) (snd(fst((a,b),c))) (snd((a,b),c)) ==> P a b c"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   285
  by simp
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   286
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   287
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   288
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   289
(* Fixpoints                                                    *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   290
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   291
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   292
(* Least fixpoints *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   293
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   294
lemma lfp_intro2: "[| mono(f); x:f(lfp(f)) |] ==> x:lfp(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   295
apply (rule subsetD)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   296
apply (rule lfp_lemma2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   297
apply assumption+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   298
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   299
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   300
lemma lfp_elim2:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   301
  assumes lfp: "x:lfp(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   302
    and mono: "mono(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   303
    and r: "!!y. y:f(lfp(f)) ==> P(y)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   304
  shows "P(x)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   305
apply (rule r)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   306
apply (rule subsetD)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   307
apply (rule lfp_lemma3)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   308
apply (rule mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   309
apply (rule lfp)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   310
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   311
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   312
lemma lfp_ind2:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   313
  assumes lfp: "x:lfp(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   314
    and mono: "mono(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   315
    and r: "!!y. y:f(lfp(f) Int {x. P(x)}) ==> P(y)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   316
  shows "P(x)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   317
apply (rule lfp_induct_set [OF lfp mono])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   318
apply (erule r)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   319
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   320
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   321
(* Greatest fixpoints *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   322
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   323
(* Note : "[| x:S; S <= f(S Un gfp(f)); mono(f) |] ==> x:gfp(f)" *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   324
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   325
lemma gfp_coind2:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   326
  assumes cih: "x:f({x} Un gfp(f))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   327
    and monoh: "mono(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   328
  shows "x:gfp(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   329
apply (rule cih [THEN [2] gfp_upperbound [THEN subsetD]])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   330
apply (rule monoh [THEN monoD])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   331
apply (rule UnE [THEN subsetI])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   332
apply assumption
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   333
apply (blast intro!: cih)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   334
apply (rule monoh [THEN monoD [THEN subsetD]])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   335
apply (rule Un_upper2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   336
apply (erule monoh [THEN gfp_lemma2, THEN subsetD])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   337
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   338
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   339
lemma gfp_elim2:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   340
  assumes gfph: "x:gfp(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   341
    and monoh: "mono(f)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   342
    and caseh: "!!y. y:f(gfp(f)) ==> P(y)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   343
  shows "P(x)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   344
apply (rule caseh)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   345
apply (rule subsetD)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   346
apply (rule gfp_lemma2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   347
apply (rule monoh)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   348
apply (rule gfph)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   349
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   350
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   351
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   352
(* Expressions                                                  *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   353
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   354
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   355
lemmas e_injs = e_const_inj e_var_inj e_fn_inj e_fix_inj e_app_inj
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   356
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   357
lemmas e_disjs =
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   358
  e_disj_const_var
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   359
  e_disj_const_fn
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   360
  e_disj_const_fix
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   361
  e_disj_const_app
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   362
  e_disj_var_fn
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   363
  e_disj_var_fix
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   364
  e_disj_var_app
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   365
  e_disj_fn_fix
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   366
  e_disj_fn_app
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   367
  e_disj_fix_app
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   368
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   369
lemmas e_disj_si = e_disjs  e_disjs [symmetric]
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   370
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   371
lemmas e_disj_se = e_disj_si [THEN notE]
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   372
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   373
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   374
(* Values                                                      *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   375
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   376
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   377
lemmas v_disjs = v_disj_const_clos
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   378
lemmas v_disj_si = v_disjs  v_disjs [symmetric]
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   379
lemmas v_disj_se = v_disj_si [THEN notE]
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   380
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   381
lemmas v_injs = v_const_inj v_clos_inj
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   382
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   383
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   384
(* Evaluations                                                  *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   385
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   386
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   387
(* Monotonicity of eval_fun *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   388
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   389
lemma eval_fun_mono: "mono(eval_fun)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   390
unfolding mono_def eval_fun_def
60774
6c28d8ed2488 proper context;
wenzelm
parents: 58889
diff changeset
   391
apply (tactic "infsys_mono_tac @{context}")
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   392
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   393
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   394
(* Introduction rules *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   395
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   396
lemma eval_const: "ve |- e_const(c) ---> v_const(c)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   397
unfolding eval_def eval_rel_def
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   398
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   399
apply (rule eval_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   400
apply (unfold eval_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   401
        (*Naughty!  But the quantifiers are nested VERY deeply...*)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   402
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   403
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   404
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   405
lemma eval_var2:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   406
  "ev:ve_dom(ve) ==> ve |- e_var(ev) ---> ve_app ve ev"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   407
apply (unfold eval_def eval_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   408
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   409
apply (rule eval_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   410
apply (unfold eval_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   411
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   412
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   413
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   414
lemma eval_fn:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   415
  "ve |- fn ev => e ---> v_clos(<|ev,e,ve|>)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   416
apply (unfold eval_def eval_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   417
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   418
apply (rule eval_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   419
apply (unfold eval_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   420
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   421
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   422
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   423
lemma eval_fix:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   424
  " cl = <| ev1, e, ve + {ev2 |-> v_clos(cl)} |> ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   425
    ve |- fix ev2(ev1) = e ---> v_clos(cl)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   426
apply (unfold eval_def eval_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   427
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   428
apply (rule eval_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   429
apply (unfold eval_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   430
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   431
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   432
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   433
lemma eval_app1:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   434
  " [| ve |- e1 ---> v_const(c1); ve |- e2 ---> v_const(c2) |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   435
    ve |- e1 @@ e2 ---> v_const(c_app c1 c2)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   436
apply (unfold eval_def eval_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   437
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   438
apply (rule eval_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   439
apply (unfold eval_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   440
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   441
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   442
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   443
lemma eval_app2:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   444
  " [|  ve |- e1 ---> v_clos(<|xm,em,vem|>);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   445
        ve |- e2 ---> v2;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   446
        vem + {xm |-> v2} |- em ---> v
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   447
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   448
    ve |- e1 @@ e2 ---> v"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   449
apply (unfold eval_def eval_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   450
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   451
apply (rule eval_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   452
apply (unfold eval_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   453
apply (blast intro!: disjI2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   454
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   455
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   456
(* Strong elimination, induction on evaluations *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   457
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   458
lemma eval_ind0:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   459
  " [| ve |- e ---> v;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   460
       !!ve c. P(((ve,e_const(c)),v_const(c)));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   461
       !!ev ve. ev:ve_dom(ve) ==> P(((ve,e_var(ev)),ve_app ve ev));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   462
       !!ev ve e. P(((ve,fn ev => e),v_clos(<|ev,e,ve|>)));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   463
       !!ev1 ev2 ve cl e.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   464
         cl = <| ev1, e, ve + {ev2 |-> v_clos(cl)} |> ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   465
         P(((ve,fix ev2(ev1) = e),v_clos(cl)));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   466
       !!ve c1 c2 e1 e2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   467
         [| P(((ve,e1),v_const(c1))); P(((ve,e2),v_const(c2))) |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   468
         P(((ve,e1 @@ e2),v_const(c_app c1 c2)));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   469
       !!ve vem xm e1 e2 em v v2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   470
         [|  P(((ve,e1),v_clos(<|xm,em,vem|>)));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   471
             P(((ve,e2),v2));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   472
             P(((vem + {xm |-> v2},em),v))
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   473
         |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   474
         P(((ve,e1 @@ e2),v))
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   475
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   476
    P(((ve,e),v))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   477
unfolding eval_def eval_rel_def
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   478
apply (erule lfp_ind2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   479
apply (rule eval_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   480
apply (unfold eval_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   481
apply (drule CollectD)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   482
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   483
apply auto
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   484
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   485
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   486
lemma eval_ind:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   487
  " [| ve |- e ---> v;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   488
       !!ve c. P ve (e_const c) (v_const c);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   489
       !!ev ve. ev:ve_dom(ve) ==> P ve (e_var ev) (ve_app ve ev);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   490
       !!ev ve e. P ve (fn ev => e) (v_clos <|ev,e,ve|>);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   491
       !!ev1 ev2 ve cl e.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   492
         cl = <| ev1, e, ve + {ev2 |-> v_clos(cl)} |> ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   493
         P ve (fix ev2(ev1) = e) (v_clos cl);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   494
       !!ve c1 c2 e1 e2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   495
         [| P ve e1 (v_const c1); P ve e2 (v_const c2) |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   496
         P ve (e1 @@ e2) (v_const(c_app c1 c2));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   497
       !!ve vem evm e1 e2 em v v2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   498
         [|  P ve e1 (v_clos <|evm,em,vem|>);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   499
             P ve e2 v2;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   500
             P (vem + {evm |-> v2}) em v
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   501
         |] ==> P ve (e1 @@ e2) v
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   502
    |] ==> P ve e v"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   503
apply (rule_tac P = "P" in infsys_pp2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   504
apply (rule eval_ind0)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   505
apply (rule infsys_pp1)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   506
apply auto
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   507
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   508
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   509
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   510
(* Elaborations                                                 *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   511
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   512
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   513
lemma elab_fun_mono: "mono(elab_fun)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   514
unfolding mono_def elab_fun_def
60774
6c28d8ed2488 proper context;
wenzelm
parents: 58889
diff changeset
   515
apply (tactic "infsys_mono_tac @{context}")
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   516
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   517
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   518
(* Introduction rules *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   519
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   520
lemma elab_const:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   521
  "c isof ty ==> te |- e_const(c) ===> ty"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   522
apply (unfold elab_def elab_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   523
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   524
apply (rule elab_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   525
apply (unfold elab_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   526
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   527
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   528
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   529
lemma elab_var:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   530
  "x:te_dom(te) ==> te |- e_var(x) ===> te_app te x"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   531
apply (unfold elab_def elab_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   532
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   533
apply (rule elab_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   534
apply (unfold elab_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   535
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   536
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   537
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   538
lemma elab_fn:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   539
  "te + {x |=> ty1} |- e ===> ty2 ==> te |- fn x => e ===> ty1->ty2"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   540
apply (unfold elab_def elab_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   541
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   542
apply (rule elab_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   543
apply (unfold elab_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   544
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   545
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   546
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   547
lemma elab_fix:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   548
  "te + {f |=> ty1->ty2} + {x |=> ty1} |- e ===> ty2 ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   549
         te |- fix f(x) = e ===> ty1->ty2"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   550
apply (unfold elab_def elab_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   551
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   552
apply (rule elab_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   553
apply (unfold elab_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   554
apply (blast intro!: exI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   555
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   556
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   557
lemma elab_app:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   558
  "[| te |- e1 ===> ty1->ty2; te |- e2 ===> ty1 |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   559
         te |- e1 @@ e2 ===> ty2"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   560
apply (unfold elab_def elab_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   561
apply (rule lfp_intro2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   562
apply (rule elab_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   563
apply (unfold elab_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   564
apply (blast intro!: disjI2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   565
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   566
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   567
(* Strong elimination, induction on elaborations *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   568
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   569
lemma elab_ind0:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   570
  assumes 1: "te |- e ===> t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   571
    and 2: "!!te c t. c isof t ==> P(((te,e_const(c)),t))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   572
    and 3: "!!te x. x:te_dom(te) ==> P(((te,e_var(x)),te_app te x))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   573
    and 4: "!!te x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   574
       [| te + {x |=> t1} |- e ===> t2; P(((te + {x |=> t1},e),t2)) |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   575
       P(((te,fn x => e),t1->t2))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   576
    and 5: "!!te f x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   577
       [| te + {f |=> t1->t2} + {x |=> t1} |- e ===> t2;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   578
          P(((te + {f |=> t1->t2} + {x |=> t1},e),t2))
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   579
       |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   580
       P(((te,fix f(x) = e),t1->t2))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   581
    and 6: "!!te e1 e2 t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   582
       [| te |- e1 ===> t1->t2; P(((te,e1),t1->t2));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   583
          te |- e2 ===> t1; P(((te,e2),t1))
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   584
       |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   585
       P(((te,e1 @@ e2),t2))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   586
  shows "P(((te,e),t))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   587
apply (rule lfp_ind2 [OF 1 [unfolded elab_def elab_rel_def]])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   588
apply (rule elab_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   589
apply (unfold elab_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   590
apply (drule CollectD)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   591
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   592
apply (erule 2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   593
apply (erule 3)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   594
apply (rule 4 [unfolded elab_def elab_rel_def]) apply blast+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   595
apply (rule 5 [unfolded elab_def elab_rel_def]) apply blast+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   596
apply (rule 6 [unfolded elab_def elab_rel_def]) apply blast+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   597
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   598
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   599
lemma elab_ind:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   600
  " [| te |- e ===> t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   601
        !!te c t. c isof t ==> P te (e_const c) t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   602
       !!te x. x:te_dom(te) ==> P te (e_var x) (te_app te x);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   603
       !!te x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   604
         [| te + {x |=> t1} |- e ===> t2; P (te + {x |=> t1}) e t2 |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   605
         P te (fn x => e) (t1->t2);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   606
       !!te f x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   607
         [| te + {f |=> t1->t2} + {x |=> t1} |- e ===> t2;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   608
            P (te + {f |=> t1->t2} + {x |=> t1}) e t2
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   609
         |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   610
         P te (fix f(x) = e) (t1->t2);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   611
       !!te e1 e2 t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   612
         [| te |- e1 ===> t1->t2; P te e1 (t1->t2);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   613
            te |- e2 ===> t1; P te e2 t1
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   614
         |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   615
         P te (e1 @@ e2) t2
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   616
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   617
    P te e t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   618
apply (rule_tac P = "P" in infsys_pp2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   619
apply (erule elab_ind0)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   620
apply (rule_tac [!] infsys_pp1)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   621
apply auto
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   622
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   623
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   624
(* Weak elimination, case analysis on elaborations *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   625
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   626
lemma elab_elim0:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   627
  assumes 1: "te |- e ===> t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   628
    and 2: "!!te c t. c isof t ==> P(((te,e_const(c)),t))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   629
    and 3: "!!te x. x:te_dom(te) ==> P(((te,e_var(x)),te_app te x))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   630
    and 4: "!!te x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   631
         te + {x |=> t1} |- e ===> t2 ==> P(((te,fn x => e),t1->t2))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   632
    and 5: "!!te f x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   633
         te + {f |=> t1->t2} + {x |=> t1} |- e ===> t2 ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   634
         P(((te,fix f(x) = e),t1->t2))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   635
    and 6: "!!te e1 e2 t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   636
         [| te |- e1 ===> t1->t2; te |- e2 ===> t1 |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   637
         P(((te,e1 @@ e2),t2))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   638
  shows "P(((te,e),t))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   639
apply (rule lfp_elim2 [OF 1 [unfolded elab_def elab_rel_def]])
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   640
apply (rule elab_fun_mono)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   641
apply (unfold elab_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   642
apply (drule CollectD)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   643
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   644
apply (erule 2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   645
apply (erule 3)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   646
apply (rule 4 [unfolded elab_def elab_rel_def]) apply blast+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   647
apply (rule 5 [unfolded elab_def elab_rel_def]) apply blast+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   648
apply (rule 6 [unfolded elab_def elab_rel_def]) apply blast+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   649
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   650
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   651
lemma elab_elim:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   652
  " [| te |- e ===> t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   653
        !!te c t. c isof t ==> P te (e_const c) t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   654
       !!te x. x:te_dom(te) ==> P te (e_var x) (te_app te x);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   655
       !!te x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   656
         te + {x |=> t1} |- e ===> t2 ==> P te (fn x => e) (t1->t2);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   657
       !!te f x e t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   658
         te + {f |=> t1->t2} + {x |=> t1} |- e ===> t2 ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   659
         P te (fix f(x) = e) (t1->t2);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   660
       !!te e1 e2 t1 t2.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   661
         [| te |- e1 ===> t1->t2; te |- e2 ===> t1 |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   662
         P te (e1 @@ e2) t2
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   663
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   664
    P te e t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   665
apply (rule_tac P = "P" in infsys_pp2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   666
apply (rule elab_elim0)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   667
apply auto
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   668
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   669
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   670
(* Elimination rules for each expression *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   671
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   672
lemma elab_const_elim_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   673
    "te |- e ===> t ==> (e = e_const(c) --> c isof t)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   674
apply (erule elab_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   675
apply (fast intro!: e_disj_si elim!: e_disj_se dest!: e_injs)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   676
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   677
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   678
lemma elab_const_elim: "te |- e_const(c) ===> t ==> c isof t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   679
apply (drule elab_const_elim_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   680
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   681
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   682
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   683
lemma elab_var_elim_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   684
  "te |- e ===> t ==> (e = e_var(x) --> t=te_app te x & x:te_dom(te))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   685
apply (erule elab_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   686
apply (fast intro!: e_disj_si elim!: e_disj_se dest!: e_injs)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   687
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   688
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   689
lemma elab_var_elim: "te |- e_var(ev) ===> t ==> t=te_app te ev & ev : te_dom(te)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   690
apply (drule elab_var_elim_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   691
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   692
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   693
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   694
lemma elab_fn_elim_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   695
  " te |- e ===> t ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   696
    ( e = fn x1 => e1 -->
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   697
      (? t1 t2. t=t_fun t1 t2 & te + {x1 |=> t1} |- e1 ===> t2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   698
    )"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   699
apply (erule elab_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   700
apply (fast intro!: e_disj_si elim!: e_disj_se dest!: e_injs)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   701
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   702
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   703
lemma elab_fn_elim: " te |- fn x1 => e1 ===> t ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   704
    (? t1 t2. t=t1->t2 & te + {x1 |=> t1} |- e1 ===> t2)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   705
apply (drule elab_fn_elim_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   706
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   707
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   708
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   709
lemma elab_fix_elim_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   710
  " te |- e ===> t ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   711
    (e = fix f(x) = e1 -->
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   712
    (? t1 t2. t=t1->t2 & te + {f |=> t1->t2} + {x |=> t1} |- e1 ===> t2))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   713
apply (erule elab_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   714
apply (fast intro!: e_disj_si elim!: e_disj_se dest!: e_injs)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   715
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   716
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   717
lemma elab_fix_elim: " te |- fix ev1(ev2) = e1 ===> t ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   718
    (? t1 t2. t=t1->t2 & te + {ev1 |=> t1->t2} + {ev2 |=> t1} |- e1 ===> t2)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   719
apply (drule elab_fix_elim_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   720
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   721
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   722
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   723
lemma elab_app_elim_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   724
  " te |- e ===> t2 ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   725
    (e = e1 @@ e2 --> (? t1 . te |- e1 ===> t1->t2 & te |- e2 ===> t1))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   726
apply (erule elab_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   727
apply (fast intro!: e_disj_si elim!: e_disj_se dest!: e_injs)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   728
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   729
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   730
lemma elab_app_elim: "te |- e1 @@ e2 ===> t2 ==> (? t1 . te |- e1 ===> t1->t2 & te |- e2 ===> t1)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   731
apply (drule elab_app_elim_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   732
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   733
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   734
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   735
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   736
(* The extended correspondence relation                       *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   737
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   738
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   739
(* Monotonicity of hasty_fun *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   740
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   741
lemma mono_hasty_fun: "mono(hasty_fun)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   742
unfolding mono_def hasty_fun_def
60774
6c28d8ed2488 proper context;
wenzelm
parents: 58889
diff changeset
   743
apply (tactic "infsys_mono_tac @{context}")
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   744
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   745
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   746
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   747
(*
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   748
  Because hasty_rel has been defined as the greatest fixpoint of hasty_fun it
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   749
  enjoys two strong indtroduction (co-induction) rules and an elimination rule.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   750
*)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   751
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   752
(* First strong indtroduction (co-induction) rule for hasty_rel *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   753
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   754
lemma hasty_rel_const_coind: "c isof t ==> (v_const(c),t) : hasty_rel"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   755
apply (unfold hasty_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   756
apply (rule gfp_coind2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   757
apply (unfold hasty_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   758
apply (rule CollectI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   759
apply (rule disjI1)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   760
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   761
apply (rule mono_hasty_fun)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   762
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   763
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   764
(* Second strong introduction (co-induction) rule for hasty_rel *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   765
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   766
lemma hasty_rel_clos_coind:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   767
  " [|  te |- fn ev => e ===> t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   768
        ve_dom(ve) = te_dom(te);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   769
        ! ev1.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   770
          ev1:ve_dom(ve) -->
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   771
          (ve_app ve ev1,te_app te ev1) : {(v_clos(<|ev,e,ve|>),t)} Un hasty_rel
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   772
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   773
    (v_clos(<|ev,e,ve|>),t) : hasty_rel"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   774
apply (unfold hasty_rel_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   775
apply (rule gfp_coind2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   776
apply (unfold hasty_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   777
apply (rule CollectI)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   778
apply (rule disjI2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   779
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   780
apply (rule mono_hasty_fun)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   781
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   782
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   783
(* Elimination rule for hasty_rel *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   784
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   785
lemma hasty_rel_elim0:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   786
  " [| !! c t. c isof t ==> P((v_const(c),t));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   787
       !! te ev e t ve.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   788
         [| te |- fn ev => e ===> t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   789
            ve_dom(ve) = te_dom(te);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   790
            !ev1. ev1:ve_dom(ve) --> (ve_app ve ev1,te_app te ev1) : hasty_rel
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   791
         |] ==> P((v_clos(<|ev,e,ve|>),t));
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   792
       (v,t) : hasty_rel
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   793
    |] ==> P(v,t)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   794
unfolding hasty_rel_def
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   795
apply (erule gfp_elim2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   796
apply (rule mono_hasty_fun)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   797
apply (unfold hasty_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   798
apply (drule CollectD)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   799
apply (fold hasty_fun_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   800
apply auto
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   801
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   802
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   803
lemma hasty_rel_elim:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   804
  " [| (v,t) : hasty_rel;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   805
       !! c t. c isof t ==> P (v_const c) t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   806
       !! te ev e t ve.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   807
         [| te |- fn ev => e ===> t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   808
            ve_dom(ve) = te_dom(te);
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   809
            !ev1. ev1:ve_dom(ve) --> (ve_app ve ev1,te_app te ev1) : hasty_rel
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   810
         |] ==> P (v_clos <|ev,e,ve|>) t
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   811
    |] ==> P v t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   812
apply (rule_tac P = "P" in infsys_p2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   813
apply (rule hasty_rel_elim0)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   814
apply auto
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   815
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   816
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   817
(* Introduction rules for hasty *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   818
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   819
lemma hasty_const: "c isof t ==> v_const(c) hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   820
apply (unfold hasty_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   821
apply (erule hasty_rel_const_coind)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   822
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   823
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   824
lemma hasty_clos:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   825
 "te |- fn ev => e ===> t & ve hastyenv te ==> v_clos(<|ev,e,ve|>) hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   826
apply (unfold hasty_def hasty_env_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   827
apply (rule hasty_rel_clos_coind)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   828
apply (blast del: equalityI)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   829
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   830
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   831
(* Elimination on constants for hasty *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   832
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   833
lemma hasty_elim_const_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   834
  "v hasty t ==> (!c.(v = v_const(c) --> c isof t))"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   835
apply (unfold hasty_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   836
apply (rule hasty_rel_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   837
apply (blast intro!: v_disj_si elim!: v_disj_se dest!: v_injs)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   838
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   839
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   840
lemma hasty_elim_const: "v_const(c) hasty t ==> c isof t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   841
apply (drule hasty_elim_const_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   842
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   843
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   844
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   845
(* Elimination on closures for hasty *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   846
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   847
lemma hasty_elim_clos_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   848
  " v hasty t ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   849
    ! x e ve.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   850
      v=v_clos(<|x,e,ve|>) --> (? te. te |- fn x => e ===> t & ve hastyenv te)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   851
apply (unfold hasty_env_def hasty_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   852
apply (rule hasty_rel_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   853
apply (blast intro!: v_disj_si elim!: v_disj_se dest!: v_injs)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   854
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   855
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   856
lemma hasty_elim_clos: "v_clos(<|ev,e,ve|>) hasty t ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   857
        ? te. te |- fn ev => e ===> t & ve hastyenv te "
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   858
apply (drule hasty_elim_clos_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   859
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   860
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   861
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   862
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   863
(* The pointwise extension of hasty to environments             *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   864
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   865
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   866
lemma hasty_env1: "[| ve hastyenv te; v hasty t |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   867
         ve + {ev |-> v} hastyenv te + {ev |=> t}"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   868
apply (unfold hasty_env_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   869
apply (simp del: mem_simps add: ve_dom_owr te_dom_owr)
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60774
diff changeset
   870
apply (tactic \<open>safe_tac (put_claset HOL_cs @{context})\<close>)
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   871
apply (case_tac "ev=x")
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   872
apply (simp (no_asm_simp) add: ve_app_owr1 te_app_owr1)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   873
apply (simp add: ve_app_owr2 te_app_owr2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   874
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   875
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   876
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   877
(* The Consistency theorem                                      *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   878
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   879
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   880
lemma consistency_const: "[| ve hastyenv te ; te |- e_const(c) ===> t |] ==> v_const(c) hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   881
apply (drule elab_const_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   882
apply (erule hasty_const)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   883
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   884
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   885
lemma consistency_var:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   886
  "[| ev : ve_dom(ve); ve hastyenv te ; te |- e_var(ev) ===> t |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   887
        ve_app ve ev hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   888
apply (unfold hasty_env_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   889
apply (drule elab_var_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   890
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   891
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   892
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   893
lemma consistency_fn: "[| ve hastyenv te ; te |- fn ev => e ===> t |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   894
        v_clos(<| ev, e, ve |>) hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   895
apply (rule hasty_clos)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   896
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   897
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   898
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   899
lemma consistency_fix:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   900
  "[| cl = <| ev1, e, ve + { ev2 |-> v_clos(cl) } |>;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   901
       ve hastyenv te ;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   902
       te |- fix ev2  ev1  = e ===> t
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   903
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   904
    v_clos(cl) hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   905
apply (unfold hasty_env_def hasty_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   906
apply (drule elab_fix_elim)
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60774
diff changeset
   907
apply (tactic \<open>safe_tac (put_claset HOL_cs @{context})\<close>)
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   908
(*Do a single unfolding of cl*)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   909
apply (frule ssubst) prefer 2 apply assumption
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   910
apply (rule hasty_rel_clos_coind)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   911
apply (erule elab_fn)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   912
apply (simp (no_asm_simp) add: ve_dom_owr te_dom_owr)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   913
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   914
apply (simp (no_asm_simp) del: mem_simps add: ve_dom_owr)
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60774
diff changeset
   915
apply (tactic \<open>safe_tac (put_claset HOL_cs @{context})\<close>)
24326
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   916
apply (case_tac "ev2=ev1a")
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   917
apply (simp (no_asm_simp) del: mem_simps add: ve_app_owr1 te_app_owr1)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   918
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   919
apply (simp add: ve_app_owr2 te_app_owr2)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   920
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   921
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   922
lemma consistency_app1: "[| ! t te. ve hastyenv te --> te |- e1 ===> t --> v_const(c1) hasty t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   923
       ! t te. ve hastyenv te  --> te |- e2 ===> t --> v_const(c2) hasty t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   924
       ve hastyenv te ; te |- e1 @@ e2 ===> t
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   925
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   926
    v_const(c_app c1 c2) hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   927
apply (drule elab_app_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   928
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   929
apply (rule hasty_const)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   930
apply (rule isof_app)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   931
apply (rule hasty_elim_const)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   932
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   933
apply (rule hasty_elim_const)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   934
apply blast
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   935
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   936
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   937
lemma consistency_app2: "[| ! t te.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   938
         ve hastyenv te  -->
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   939
         te |- e1 ===> t --> v_clos(<|evm, em, vem|>) hasty t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   940
       ! t te. ve hastyenv te  --> te |- e2 ===> t --> v2 hasty t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   941
       ! t te.
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   942
         vem + { evm |-> v2 } hastyenv te  --> te |- em ===> t --> v hasty t;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   943
       ve hastyenv te ;
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   944
       te |- e1 @@ e2 ===> t
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   945
    |] ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   946
    v hasty t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   947
apply (drule elab_app_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   948
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   949
apply (erule allE, erule allE, erule impE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   950
apply assumption
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   951
apply (erule impE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   952
apply assumption
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   953
apply (erule allE, erule allE, erule impE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   954
apply assumption
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   955
apply (erule impE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   956
apply assumption
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   957
apply (drule hasty_elim_clos)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   958
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   959
apply (drule elab_fn_elim)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   960
apply (blast intro: hasty_env1 dest!: t_fun_inj)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   961
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   962
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   963
lemma consistency: "ve |- e ---> v ==>
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   964
   (! t te. ve hastyenv te --> te |- e ===> t --> v hasty t)"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   965
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   966
(* Proof by induction on the structure of evaluations *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   967
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   968
apply (erule eval_ind)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   969
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   970
apply (blast intro: consistency_const consistency_var consistency_fn consistency_fix consistency_app1 consistency_app2)+
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   971
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   972
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   973
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   974
(* The Basic Consistency theorem                                *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   975
(* ############################################################ *)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   976
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   977
lemma basic_consistency_lem:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   978
  "ve isofenv te ==> ve hastyenv te"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   979
apply (unfold isof_env_def hasty_env_def)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   980
apply safe
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   981
apply (erule allE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   982
apply (erule impE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   983
apply assumption
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   984
apply (erule exE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   985
apply (erule conjE)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   986
apply (drule hasty_const)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   987
apply (simp (no_asm_simp))
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   988
done
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   989
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   990
lemma basic_consistency:
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   991
  "[| ve isofenv te; ve |- e ---> v_const(c); te |- e ===> t |] ==> c isof t"
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   992
apply (rule hasty_elim_const)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   993
apply (drule consistency)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   994
apply (blast intro!: basic_consistency_lem)
3e9d3ba894b8 converted ex/MT.ML;
wenzelm
parents: 17289
diff changeset
   995
done
17289
8608f7a881eb converted to Isar theory format;
wenzelm
parents: 15450
diff changeset
   996
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
   997
end