src/ZF/Coind/ECR.thy
author paulson
Wed, 10 Jul 2002 16:54:07 +0200
changeset 13339 0f89104dd377
parent 12610 8b9845807f77
child 16417 9bc16273c2d4
permissions -rw-r--r--
Fixed quantified variable name preservation for ball and bex (bounded quants) Requires tweaking of other scripts. Also routine tidying.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     1
(*  Title:      ZF/Coind/ECR.thy
915
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
     2
    ID:         $Id$
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     3
    Author:     Jacob Frost, Cambridge University Computer Laboratory
915
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
     4
    Copyright   1995  University of Cambridge
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
     5
*)
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
     6
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
     7
theory ECR = Static + Dynamic:
915
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
     8
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
     9
(* The extended correspondence relation *)
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
    10
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
    11
consts
1401
0c439768f45c removed quotes from consts and syntax sections
clasohm
parents: 1155
diff changeset
    12
  HasTyRel :: i
915
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
    13
coinductive
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
    14
  domains "HasTyRel" <= "Val * Ty"
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    15
  intros
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    16
    htr_constI [intro!]:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    17
      "[| c \<in> Const; t \<in> Ty; isof(c,t) |] ==> <v_const(c),t> \<in> HasTyRel"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    18
    htr_closI [intro]:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    19
      "[| x \<in> ExVar; e \<in> Exp; t \<in> Ty; ve \<in> ValEnv; te \<in> TyEnv; 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    20
          <te,e_fn(x,e),t> \<in> ElabRel;  
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
    21
          ve_dom(ve) = te_dom(te);   
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    22
          {<ve_app(ve,y),te_app(te,y)>.y \<in> ve_dom(ve)} \<in> Pow(HasTyRel) |] 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    23
       ==> <v_clos(x,e,ve),t> \<in> HasTyRel" 
6117
f9aad8ccd590 tidying of datatype and inductive definitions
paulson
parents: 1478
diff changeset
    24
  monos  Pow_mono
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    25
  type_intros Val_ValEnv.intros
915
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
    26
  
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
    27
(* Pointwise extension to environments *)
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
    28
 
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    29
constdefs
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    30
  hastyenv :: "[i,i] => o"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    31
    "hastyenv(ve,te) ==                        
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    32
	 ve_dom(ve) = te_dom(te) &          
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    33
	 (\<forall>x \<in> ve_dom(ve). <ve_app(ve,x),te_app(te,x)> \<in> HasTyRel)"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    34
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    35
(* Specialised co-induction rule *)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    36
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    37
lemma htr_closCI [intro]:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    38
     "[| x \<in> ExVar; e \<in> Exp; t \<in> Ty; ve \<in> ValEnv; te \<in> TyEnv;   
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    39
         <te, e_fn(x, e), t> \<in> ElabRel; ve_dom(ve) = te_dom(te);  
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    40
         {<ve_app(ve,y),te_app(te,y)>.y \<in> ve_dom(ve)} \<in>
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    41
           Pow({<v_clos(x,e,ve),t>} Un HasTyRel) |]     
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    42
      ==> <v_clos(x, e, ve),t> \<in> HasTyRel"
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12610
diff changeset
    43
apply (rule singletonI [THEN HasTyRel.coinduct], auto)
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    44
done
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    45
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    46
(* Specialised elimination rules *)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    47
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12595
diff changeset
    48
inductive_cases
8b9845807f77 tuned document sources;
wenzelm
parents: 12595
diff changeset
    49
    htr_constE [elim!]: "<v_const(c),t> \<in> HasTyRel"
8b9845807f77 tuned document sources;
wenzelm
parents: 12595
diff changeset
    50
  and htr_closE [elim]: "<v_clos(x,e,ve),t> \<in> HasTyRel"
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    51
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    52
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    53
(* Properties of the pointwise extension to environments *)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    54
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    55
lemmas HasTyRel_non_zero =
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    56
       HasTyRel.dom_subset [THEN subsetD, THEN SigmaD1, THEN ValNEE, standard]
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    57
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    58
lemma hastyenv_owr: 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    59
  "[| ve \<in> ValEnv; te \<in> TyEnv; hastyenv(ve,te); <v,t> \<in> HasTyRel |] 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    60
   ==> hastyenv(ve_owr(ve,x,v),te_owr(te,x,t))"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    61
by (auto simp add: hastyenv_def ve_app_owr HasTyRel_non_zero)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    62
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    63
lemma basic_consistency_lem: 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    64
  "[| ve \<in> ValEnv; te \<in> TyEnv; isofenv(ve,te) |] ==> hastyenv(ve,te)"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    65
apply (unfold isofenv_def hastyenv_def)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    66
apply (force intro: te_appI ve_domI) 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    67
done
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    68
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    69
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    70
(* ############################################################ *)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    71
(* The Consistency theorem                                      *)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    72
(* ############################################################ *)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    73
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    74
lemma consistency_const:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    75
     "[| c \<in> Const; hastyenv(ve,te);<te,e_const(c),t> \<in> ElabRel |] 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    76
      ==> <v_const(c), t> \<in> HasTyRel"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    77
by blast
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    78
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    79
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    80
lemma consistency_var: 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    81
  "[| x \<in> ve_dom(ve); hastyenv(ve,te); <te,e_var(x),t> \<in> ElabRel |] ==>      
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    82
   <ve_app(ve,x),t> \<in> HasTyRel"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    83
by (unfold hastyenv_def, blast)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    84
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    85
lemma consistency_fn: 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    86
  "[| ve \<in> ValEnv; x \<in> ExVar; e \<in> Exp; hastyenv(ve,te);        
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    87
           <te,e_fn(x,e),t> \<in> ElabRel   
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    88
        |] ==> <v_clos(x, e, ve), t> \<in> HasTyRel"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    89
by (unfold hastyenv_def, blast)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    90
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    91
declare ElabRel.dom_subset [THEN subsetD, dest]
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    92
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    93
declare Ty.intros [simp, intro!]
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    94
declare TyEnv.intros [simp, intro!]
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    95
declare Val_ValEnv.intros [simp, intro!]
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    96
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    97
lemma consistency_fix: 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    98
  "[| ve \<in> ValEnv; x \<in> ExVar; e \<in> Exp; f \<in> ExVar; cl \<in> Val;                
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
    99
      v_clos(x,e,ve_owr(ve,f,cl)) = cl;                           
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   100
      hastyenv(ve,te); <te,e_fix(f,x,e),t> \<in> ElabRel |] ==>        
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   101
   <cl,t> \<in> HasTyRel"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   102
apply (unfold hastyenv_def)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12610
diff changeset
   103
apply (erule elab_fixE, safe)
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   104
apply (rule subst, assumption) 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   105
apply (rule_tac te="te_owr(te, f, t_fun(t1, t2))" in htr_closCI)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   106
apply simp_all
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   107
apply (blast intro: ve_owrI) 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   108
apply (rule ElabRel.fnI)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12610
diff changeset
   109
apply (simp_all add: ValNEE, force)
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   110
done
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   111
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   112
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   113
lemma consistency_app1:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   114
 "[| ve \<in> ValEnv; e1 \<in> Exp; e2 \<in> Exp; c1 \<in> Const; c2 \<in> Const;    
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   115
     <ve,e1,v_const(c1)> \<in> EvalRel;                       
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   116
     \<forall>t te.                                          
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   117
       hastyenv(ve,te) --> <te,e1,t> \<in> ElabRel --> <v_const(c1),t> \<in> HasTyRel;
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   118
     <ve, e2, v_const(c2)> \<in> EvalRel;                   
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   119
     \<forall>t te.                                          
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   120
       hastyenv(ve,te) --> <te,e2,t> \<in> ElabRel --> <v_const(c2),t> \<in> HasTyRel;
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   121
     hastyenv(ve, te);                                  
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   122
     <te,e_app(e1,e2),t> \<in> ElabRel |] 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   123
  ==> <v_const(c_app(c1, c2)),t> \<in> HasTyRel"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   124
by (blast intro!: c_appI intro: isof_app)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   125
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   126
lemma consistency_app2:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   127
 "[| ve \<in> ValEnv; vem \<in> ValEnv; e1 \<in> Exp; e2 \<in> Exp; em \<in> Exp; xm \<in> ExVar; 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   128
     v \<in> Val;   
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   129
     <ve,e1,v_clos(xm,em,vem)> \<in> EvalRel;        
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   130
     \<forall>t te. hastyenv(ve,te) -->                     
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   131
            <te,e1,t> \<in> ElabRel --> <v_clos(xm,em,vem),t> \<in> HasTyRel;         
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   132
     <ve,e2,v2> \<in> EvalRel;                       
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   133
     \<forall>t te. hastyenv(ve,te) --> <te,e2,t> \<in> ElabRel --> <v2,t> \<in> HasTyRel;
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   134
     <ve_owr(vem,xm,v2),em,v> \<in> EvalRel;         
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   135
     \<forall>t te. hastyenv(ve_owr(vem,xm,v2),te) -->      
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   136
            <te,em,t> \<in> ElabRel --> <v,t> \<in> HasTyRel;
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   137
     hastyenv(ve,te); <te,e_app(e1,e2),t> \<in> ElabRel |] 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   138
   ==> <v,t> \<in> HasTyRel"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   139
apply (erule elab_appE)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   140
apply (drule spec [THEN spec, THEN mp, THEN mp], assumption+)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   141
apply (drule spec [THEN spec, THEN mp, THEN mp], assumption+)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   142
apply (erule htr_closE)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12610
diff changeset
   143
apply (erule elab_fnE, simp)
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   144
apply clarify
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   145
apply (drule spec [THEN spec, THEN mp, THEN mp])
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   146
prefer 2 apply assumption+
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12610
diff changeset
   147
apply (rule hastyenv_owr, assumption)
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   148
apply assumption 
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 12610
diff changeset
   149
apply (simp add: hastyenv_def, blast+)
12595
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   150
done
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   151
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   152
lemma consistency [rule_format]:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   153
   "<ve,e,v> \<in> EvalRel 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   154
    ==> (\<forall>t te. hastyenv(ve,te) --> <te,e,t> \<in> ElabRel --> <v,t> \<in> HasTyRel)"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   155
apply (erule EvalRel.induct)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   156
apply (simp_all add: consistency_const consistency_var consistency_fn 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   157
                     consistency_fix consistency_app1)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   158
apply (blast intro: consistency_app2)
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   159
done
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   160
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   161
lemma basic_consistency:
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   162
     "[| ve \<in> ValEnv; te \<in> TyEnv; isofenv(ve,te);                    
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   163
         <ve,e,v_const(c)> \<in> EvalRel; <te,e,t> \<in> ElabRel |] 
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   164
      ==> isof(c,t)"
0480d02221b8 conversion to Isar
paulson
parents: 11318
diff changeset
   165
by (blast dest: consistency intro!: basic_consistency_lem)
915
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
   166
6dae0daf57b7 New example by Jacob Frost, tidied by lcp
lcp
parents:
diff changeset
   167
end