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