src/HOL/MicroJava/BV/JType.thy
author kleing
Mon, 20 Nov 2000 16:41:25 +0100
changeset 10497 7c6985b4de40
child 10592 fc0b575a2cf7
permissions -rw-r--r--
BCV integration (type system is semilattice)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10497
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     1
(*  Title:      HOL/BCV/JType.thy
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     2
    ID:         $Id$
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     3
    Author:     Tobias Nipkow
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     4
    Copyright   2000 TUM
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     5
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     6
The type system of the JVM
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     7
*)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     8
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
     9
header "JVM Type System as Semilattice"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    10
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    11
theory JType = WellForm + Err:
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    12
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    13
constdefs
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    14
  is_ref :: "ty => bool"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    15
  "is_ref T == case T of PrimT t => False | RefT r => True"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    16
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    17
  sup :: "'c prog => ty => ty => ty err"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    18
  "sup G T1 T2 ==
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    19
  case T1 of PrimT P1 => (case T2 of PrimT P2 => (if P1 = P2 then OK (PrimT P1) else Err) | RefT R => Err)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    20
           | RefT R1 => (case T2 of PrimT P => Err | RefT R2 => 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    21
  (case R1 of NullT => (case R2 of NullT => OK NT | ClassT C => OK (Class C))
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    22
            | ClassT C => (case R2 of NullT => OK (Class C) 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    23
                                    | ClassT D => OK (Class (some_lub ((subcls1 G)^* ) C D)))))"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    24
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    25
  subtype :: "'c prog => ty => ty => bool"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    26
  "subtype G T1 T2 == G \<turnstile> T1 \<preceq> T2"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    27
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    28
  is_ty :: "'c prog => ty => bool"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    29
  "is_ty G T == case T of PrimT P => True | RefT R =>
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    30
               (case R of NullT => True | ClassT C => (C,Object):(subcls1 G)^*)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    31
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    32
translations
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    33
  "types G" == "Collect (is_type G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    34
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    35
constdefs
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    36
  esl :: "'c prog => ty esl"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    37
  "esl G == (types G, subtype G, sup G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    38
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    39
lemma PrimT_PrimT: "(G \<turnstile> xb \<preceq> PrimT p) = (xb = PrimT p)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    40
  by (auto elim: widen.elims)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    41
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    42
lemma PrimT_PrimT2: "(G \<turnstile> PrimT p \<preceq> xb) = (xb = PrimT p)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    43
  by (auto elim: widen.elims)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    44
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    45
lemma is_tyI:
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    46
  "[| is_type G T; wf_prog wf_mb G |] ==> is_ty G T"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    47
  by (auto simp add: is_ty_def dest: subcls_C_Object 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    48
           split: ty.splits ref_ty.splits)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    49
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    50
lemma is_type_conv: 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    51
  "wf_prog wf_mb G ==> is_type G T = is_ty G T"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    52
proof
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    53
  assume "is_type G T" "wf_prog wf_mb G" 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    54
  thus "is_ty G T"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    55
    by (rule is_tyI)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    56
next
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    57
  assume wf: "wf_prog wf_mb G" and
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    58
         ty: "is_ty G T"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    59
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    60
  show "is_type G T"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    61
  proof (cases T)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    62
    case PrimT
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    63
    thus ?thesis by simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    64
  next
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    65
    fix R assume R: "T = RefT R"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    66
    with wf
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    67
    have "R = ClassT Object \<Longrightarrow> ?thesis" by simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    68
    moreover    
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    69
    from R wf ty
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    70
    have "R \<noteq> ClassT Object \<Longrightarrow> ?thesis"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    71
      by (auto simp add: is_ty_def subcls1_def is_class_def class_def 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    72
               elim: converse_rtranclE
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    73
               split: ref_ty.splits)    
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    74
    ultimately    
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    75
    show ?thesis by blast
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    76
  qed
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    77
qed
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    78
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    79
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    80
lemma order_widen:
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    81
  "acyclic (subcls1 G) ==> order (subtype G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    82
  apply (unfold order_def lesub_def subtype_def)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    83
  apply (auto intro: widen_trans)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    84
  apply (case_tac x)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    85
   apply (case_tac y)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    86
    apply (auto simp add: PrimT_PrimT)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    87
   apply (case_tac y)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    88
    apply simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    89
  apply simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    90
  apply (case_tac ref_ty)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    91
   apply (case_tac ref_tya)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    92
    apply simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    93
   apply simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    94
  apply (case_tac ref_tya)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    95
   apply simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    96
  apply simp
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    97
  apply (auto dest: acyclic_impl_antisym_rtrancl antisymD)  
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    98
  done
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
    99
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   100
lemma closed_err_types:
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   101
  "[| wf_prog wf_mb G; univalent (subcls1 G); acyclic (subcls1 G) |] 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   102
  ==> closed (err (types G)) (lift2 (sup G))"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   103
  apply (unfold closed_def plussub_def lift2_def sup_def)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   104
  apply (auto split: err.split)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   105
  apply (drule is_tyI, assumption)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   106
  apply (auto simp add: is_ty_def is_type_conv simp del: is_type.simps 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   107
              split: ty.split ref_ty.split)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   108
  apply (blast dest!: is_lub_some_lub is_lubD is_ubD intro!: is_ubI)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   109
  done
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   110
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   111
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   112
lemma err_semilat_JType_esl_lemma:
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   113
  "[| wf_prog wf_mb G; univalent (subcls1 G); acyclic (subcls1 G) |] 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   114
  ==> err_semilat (esl G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   115
proof -
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   116
  assume wf_prog:   "wf_prog wf_mb G"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   117
  assume univalent: "univalent (subcls1 G)" 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   118
  assume acyclic:   "acyclic (subcls1 G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   119
  
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   120
  hence "order (subtype G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   121
    by (rule order_widen)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   122
  moreover
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   123
  from wf_prog univalent acyclic
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   124
  have "closed (err (types G)) (lift2 (sup G))"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   125
    by (rule closed_err_types)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   126
  moreover
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   127
  
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   128
  { fix c1 c2
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   129
    assume is_class: "is_class G c1" "is_class G c2"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   130
    with wf_prog 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   131
    obtain 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   132
      "G \<turnstile> c1 \<preceq>C Object"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   133
      "G \<turnstile> c2 \<preceq>C Object"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   134
      by (blast intro: subcls_C_Object)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   135
    with wf_prog univalent
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   136
    obtain u where
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   137
      "is_lub ((subcls1 G)^* ) c1 c2 u"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   138
      by (blast dest: univalent_has_lubs)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   139
    with acyclic
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   140
    have "G \<turnstile> c1 \<preceq>C some_lub ((subcls1 G)^* ) c1 c2"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   141
      by (simp add: some_lub_conv) (blast dest: is_lubD is_ubD)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   142
  } note this [intro]
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   143
      
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   144
  { fix t1 t2 s
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   145
    assume "is_type G t1" "is_type G t2" "sup G t1 t2 = OK s"    
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   146
    hence "subtype G t1 s"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   147
      by (unfold sup_def subtype_def) 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   148
         (cases s, auto intro: widen.null 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   149
                        split: ty.splits ref_ty.splits if_splits)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   150
  } note this [intro]
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   151
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   152
  have
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   153
    "\<forall>x\<in>err (types G). \<forall>y\<in>err (types G). x <=_(le (subtype G)) x +_(lift2 (sup G)) y"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   154
    by (auto simp add: lesub_def plussub_def le_def lift2_def split: err.split)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   155
  moreover
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   156
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   157
  { fix c1 c2
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   158
    assume "is_class G c1" "is_class G c2"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   159
    with wf_prog
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   160
    obtain 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   161
      "G \<turnstile> c1 \<preceq>C Object"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   162
      "G \<turnstile> c2 \<preceq>C Object"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   163
      by (blast intro: subcls_C_Object)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   164
    with wf_prog univalent
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   165
    obtain u where
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   166
      "is_lub ((subcls1 G)^* ) c2 c1 u"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   167
      by (blast dest: univalent_has_lubs)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   168
    with acyclic
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   169
    have "G \<turnstile> c1 \<preceq>C some_lub ((subcls1 G)^* ) c2 c1"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   170
      by (simp add: some_lub_conv) (blast dest: is_lubD is_ubD)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   171
  } note this [intro]
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   172
      
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   173
  have "\<forall>x\<in>err (types G). \<forall>y\<in>err (types G). 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   174
    y <=_(le (subtype G)) x +_(lift2 (sup G)) y"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   175
    by (auto simp add: lesub_def plussub_def le_def sup_def subtype_def lift2_def 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   176
             split: err.split ty.splits ref_ty.splits if_splits intro: widen.null)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   177
  moreover
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   178
    
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   179
  have [intro]: 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   180
    "!!a b c. [| G \<turnstile> a \<preceq> c; G \<turnstile> b \<preceq> c; sup G a b = Err |] ==> False"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   181
    by (auto simp add: PrimT_PrimT PrimT_PrimT2 sup_def 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   182
             split: ty.splits ref_ty.splits)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   183
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   184
  { fix c1 c2 D
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   185
    assume is_class: "is_class G c1" "is_class G c2"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   186
    assume le: "G \<turnstile> c1 \<preceq>C D" "G \<turnstile> c2 \<preceq>C D"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   187
    from wf_prog is_class
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   188
    obtain 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   189
      "G \<turnstile> c1 \<preceq>C Object"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   190
      "G \<turnstile> c2 \<preceq>C Object"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   191
      by (blast intro: subcls_C_Object)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   192
    with wf_prog univalent
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   193
    obtain u where
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   194
      lub: "is_lub ((subcls1 G)^* ) c1 c2 u"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   195
      by (blast dest: univalent_has_lubs)   
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   196
    with acyclic
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   197
    have "some_lub ((subcls1 G)^* ) c1 c2 = u"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   198
      by (rule some_lub_conv)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   199
    moreover
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   200
    from lub le
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   201
    have "G \<turnstile> u \<preceq>C D" 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   202
      by (simp add: is_lub_def is_ub_def)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   203
    ultimately     
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   204
    have "G \<turnstile> some_lub ((subcls1 G)\<^sup>*) c1 c2 \<preceq>C D"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   205
      by blast
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   206
  } note this [intro]
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   207
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   208
  have [dest!]:
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   209
    "!!C T. G \<turnstile> Class C \<preceq> T ==> \<exists>D. T=Class D \<and> G \<turnstile> C \<preceq>C D"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   210
    by (frule widen_Class, auto)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   211
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   212
  { fix a b c d
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   213
    assume "is_type G a" "is_type G b" "is_type G c" and
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   214
           "G \<turnstile> a \<preceq> c" "G \<turnstile> b \<preceq> c" and
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   215
           "sup G a b = OK d" 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   216
    hence "G \<turnstile> d \<preceq> c"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   217
      by (auto simp add: sup_def split: ty.splits ref_ty.splits if_splits)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   218
  } note this [intro]
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   219
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   220
  have
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   221
    "\<forall>x\<in>err (types G). \<forall>y\<in>err (types G). \<forall>z\<in>err (types G). 
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   222
    x <=_(le (subtype G)) z \<and> y <=_(le (subtype G)) z \<longrightarrow> x +_(lift2 (sup G)) y <=_(le (subtype G)) z"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   223
    by (simp add: lift2_def plussub_def lesub_def subtype_def le_def split: err.splits) blast
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   224
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   225
  ultimately
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   226
  
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   227
  show ?thesis
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   228
    by (unfold esl_def semilat_def sl_def) auto
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   229
qed
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   230
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   231
lemma univalent_subcls1:
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   232
  "wf_prog wf_mb G ==> univalent (subcls1 G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   233
  by (unfold wf_prog_def unique_def univalent_def subcls1_def) auto
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   234
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   235
ML_setup {* bind_thm ("acyclic_subcls1", acyclic_subcls1) *}
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   236
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   237
theorem "wf_prog wf_mb G ==> err_semilat (esl G)"
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   238
  by (frule acyclic_subcls1, frule univalent_subcls1, rule err_semilat_JType_esl_lemma)
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   239
7c6985b4de40 BCV integration (type system is semilattice)
kleing
parents:
diff changeset
   240
end