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