src/HOL/MiniML/MiniML.thy
author paulson
Mon, 15 Mar 2004 10:58:49 +0100
changeset 14470 1ffe42cfaefe
parent 14422 b8da5f258b04
permissions -rw-r--r--
auto update
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
     1
(* Title:     HOL/MiniML/MiniML.thy
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
     2
   ID:        $Id$
14422
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
     3
   Author:    Dieter Nazareth, Wolfgang Naraschewski and Tobias Nipkow
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1790
diff changeset
     4
   Copyright  1996 TU Muenchen
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
     5
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
     6
Mini_ML with type inference rules.
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
     7
*)
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
     8
14422
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
     9
theory MiniML = Generalize:
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    10
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    11
(* expressions *)
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    12
datatype
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1790
diff changeset
    13
        expr = Var nat | Abs expr | App expr expr | LET expr expr
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    14
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    15
(* type inference rules *)
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    16
consts
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1790
diff changeset
    17
        has_type :: "(ctxt * expr * typ)set"
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    18
syntax
14422
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    19
        "@has_type" :: "[ctxt, expr, typ] => bool"
1525
d127436567d0 modified priorities in syntax
nipkow
parents: 1476
diff changeset
    20
                       ("((_) |-/ (_) :: (_))" [60,0,60] 60)
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    21
translations 
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1790
diff changeset
    22
        "A |- e :: t" == "(A,e,t):has_type"
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    23
1790
2f3694c50101 Quotes now optional around inductive set
paulson
parents: 1525
diff changeset
    24
inductive has_type
14422
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    25
intros
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    26
  VarI: "[| n < length A; t <| A!n |] ==> A |- Var n :: t"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    27
  AbsI: "[| (mk_scheme t1)#A |- e :: t2 |] ==> A |- Abs e :: t1 -> t2"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    28
  AppI: "[| A |- e1 :: t2 -> t1; A |- e2 :: t2 |] 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    29
         ==> A |- App e1 e2 :: t1"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    30
  LETI: "[| A |- e1 :: t1; (gen A t1)#A |- e2 :: t |] ==> A |- LET e1 e2 :: t"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    31
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    32
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    33
declare has_type.intros [simp]
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    34
declare Un_upper1 [simp] Un_upper2 [simp]
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    35
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    36
declare is_bound_typ_instance_closed_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    37
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    38
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    39
lemma s'_t_equals_s_t: "!!t::typ. $(%n. if n : (free_tv A) Un (free_tv t) then (S n) else (TVar n)) t = $S t"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    40
apply (rule typ_substitutions_only_on_free_variables)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    41
apply (simp add: Ball_def)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    42
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    43
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    44
declare s'_t_equals_s_t [simp]
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    45
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    46
lemma s'_a_equals_s_a: "!!A::type_scheme list. $(%n. if n : (free_tv A) Un (free_tv t) then (S n) else (TVar n)) A = $S A"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    47
apply (rule scheme_list_substitutions_only_on_free_variables)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    48
apply (simp add: Ball_def)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    49
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    50
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    51
declare s'_a_equals_s_a [simp]
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    52
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    53
lemma replace_s_by_s': 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    54
 "$(%n. if n : (free_tv A) Un (free_tv t) then S n else TVar n) A |-  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    55
     e :: $(%n. if n : (free_tv A) Un (free_tv t) then S n else TVar n) t  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    56
  ==> $S A |- e :: $S t"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    57
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    58
apply (rule_tac P = "%A. A |- e :: $S t" in ssubst)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    59
apply (rule s'_a_equals_s_a [symmetric])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    60
apply (rule_tac P = "%t. $ (%n. if n : free_tv A Un free_tv (?t1 S) then S n else TVar n) A |- e :: t" in ssubst)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    61
apply (rule s'_t_equals_s_t [symmetric])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    62
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    63
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    64
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    65
lemma alpha_A': "!!A::type_scheme list. $ (%x. TVar (if x : free_tv A then x else n + x)) A = $ id_subst A"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    66
apply (rule scheme_list_substitutions_only_on_free_variables)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    67
apply (simp add: id_subst_def)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    68
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    69
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    70
lemma alpha_A: "!!A::type_scheme list. $ (%x. TVar (if x : free_tv A then x else n + x)) A = A"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    71
apply (rule alpha_A' [THEN ssubst])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    72
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    73
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    74
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    75
lemma S_o_alpha_typ: "$ (S o alpha) (t::typ) = $ S ($ (%x. TVar (alpha x)) t)"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    76
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    77
apply (simp_all)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    78
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    79
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    80
lemma S_o_alpha_typ': "$ (%u. (S o alpha) u) (t::typ) = $ S ($ (%x. TVar (alpha x)) t)"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    81
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    82
apply (simp_all)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    83
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    84
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    85
lemma S_o_alpha_type_scheme: "$ (S o alpha) (sch::type_scheme) = $ S ($ (%x. TVar (alpha x)) sch)"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    86
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    87
apply (simp_all)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    88
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    89
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    90
lemma S_o_alpha_type_scheme_list: "$ (S o alpha) (A::type_scheme list) = $ S ($ (%x. TVar (alpha x)) A)"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    91
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    92
apply (simp_all) 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    93
apply (rule S_o_alpha_type_scheme [unfolded o_def])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    94
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    95
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    96
lemma S'_A_eq_S'_alpha_A: "!!A::type_scheme list.  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    97
      $ (%n. if n : free_tv A Un free_tv t then S n else TVar n) A =  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    98
      $ ((%x. if x : free_tv A Un free_tv t then S x else TVar x) o  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
    99
         (%x. if x : free_tv A then x else n + x)) A"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   100
apply (subst S_o_alpha_type_scheme_list)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   101
apply (subst alpha_A)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   102
apply (rule refl)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   103
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   104
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   105
lemma dom_S': 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   106
 "dom (%n. if n : free_tv A Un free_tv t then S n else TVar n) <=  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   107
  free_tv A Un free_tv t"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   108
apply (unfold free_tv_subst dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   109
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   110
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   111
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   112
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   113
lemma cod_S': 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   114
  "!!(A::type_scheme list) (t::typ).   
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   115
   cod (%n. if n : free_tv A Un free_tv t then S n else TVar n) <=  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   116
   free_tv ($ S A) Un free_tv ($ S t)"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   117
apply (unfold free_tv_subst cod_def subset_def)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   118
apply (rule ballI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   119
apply (erule UN_E)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   120
apply (drule dom_S' [THEN subsetD])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   121
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   122
apply (fast dest: free_tv_of_substitutions_extend_to_scheme_lists intro: free_tv_of_substitutions_extend_to_types [THEN subsetD])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   123
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   124
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   125
lemma free_tv_S': 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   126
 "!!(A::type_scheme list) (t::typ).  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   127
  free_tv (%n. if n : free_tv A Un free_tv t then S n else TVar n) <=  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   128
  free_tv A Un free_tv ($ S A) Un free_tv t Un free_tv ($ S t)"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   129
apply (unfold free_tv_subst)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   130
apply (fast dest: dom_S' [THEN subsetD] cod_S' [THEN subsetD])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   131
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   132
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   133
lemma free_tv_alpha: "!!t1::typ.  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   134
      (free_tv ($ (%x. TVar (if x : free_tv A then x else n + x)) t1) - free_tv A) <=  
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   135
          {x. ? y. x = n + y}"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   136
apply (induct_tac "t1")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   137
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   138
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   139
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   140
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   141
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   142
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   143
lemma aux_plus: "!!(k::nat). n <= n + k"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   144
apply (induct_tac "k" rule: nat_induct)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   145
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   146
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   147
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   148
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   149
declare aux_plus [simp]
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   150
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   151
lemma new_tv_Int_free_tv_empty_type: "!!t::typ. new_tv n t ==> {x. ? y. x = n + y} Int free_tv t = {}"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   152
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   153
apply (cut_tac aux_plus)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   154
apply (drule new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   155
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   156
apply (rotate_tac 1)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   157
apply (drule new_tv_not_free_tv)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   158
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   159
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   160
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   161
lemma new_tv_Int_free_tv_empty_scheme: "!!sch::type_scheme. new_tv n sch ==> {x. ? y. x = n + y} Int free_tv sch = {}"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   162
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   163
apply (cut_tac aux_plus)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   164
apply (drule new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   165
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   166
apply (rotate_tac 1)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   167
apply (drule new_tv_not_free_tv)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   168
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   169
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   170
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   171
lemma new_tv_Int_free_tv_empty_scheme_list: "!A::type_scheme list. new_tv n A --> {x. ? y. x = n + y} Int free_tv A = {}"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   172
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   173
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   174
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   175
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   176
apply (fast dest: new_tv_Int_free_tv_empty_scheme)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   177
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   178
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   179
lemma gen_t_le_gen_alpha_t [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   180
   "new_tv n A --> gen A t <= gen A ($ (%x. TVar (if x : free_tv A then x else n + x)) t)"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   181
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   182
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   183
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   184
apply (hypsubst)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   185
apply (rule_tac x = " (%x. S (if n <= x then x - n else x))" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   186
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   187
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   188
apply (case_tac "nat : free_tv A")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   189
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   190
apply (subgoal_tac "n <= n + nat")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   191
apply (drule new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   192
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   193
apply (drule new_tv_not_free_tv)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   194
apply (drule new_tv_not_free_tv)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   195
apply (simp (no_asm_simp) add: diff_add_inverse)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   196
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   197
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   198
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   199
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   200
declare has_type.intros [intro!]
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   201
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   202
lemma has_type_le_env [rule_format (no_asm)]: "A |- e::t ==> !B. A <= B -->  B |- e::t"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   203
apply (erule has_type.induct)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   204
   apply (simp (no_asm) add: le_env_def)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   205
   apply (fastsimp elim: bound_typ_instance_trans)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   206
  apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   207
 apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   208
apply (slow elim: le_env_free_tv [THEN free_tv_subset_gen_le])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   209
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   210
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   211
(* has_type is closed w.r.t. substitution *)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   212
lemma has_type_cl_sub: "A |- e :: t ==> !S. $S A |- e :: $S t"
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   213
apply (erule has_type.induct)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   214
(* case VarI *)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   215
   apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   216
   apply (rule has_type.VarI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   217
    apply (simp add: app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   218
   apply (simp (no_asm_simp) add: app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   219
  (* case AbsI *)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   220
  apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   221
  apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   222
  apply (rule has_type.AbsI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   223
  apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   224
 (* case AppI *)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   225
 apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   226
 apply (rule has_type.AppI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   227
  apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   228
  apply (erule spec)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   229
 apply (erule spec)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   230
(* case LetI *)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   231
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   232
apply (rule replace_s_by_s')
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   233
apply (cut_tac A = "$ S A" and A' = "A" and t = "t" and t' = "$ S t" in ex_fresh_variable)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   234
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   235
apply (erule conjE)+ 
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   236
apply (rule_tac ?t1.0 = "$ ((%x. if x : free_tv A Un free_tv t then S x else TVar x) o (%x. if x : free_tv A then x else n + x)) t1" in has_type.LETI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   237
 apply (drule_tac x = " (%x. if x : free_tv A Un free_tv t then S x else TVar x) o (%x. if x : free_tv A then x else n + x) " in spec)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   238
 apply (subst S'_A_eq_S'_alpha_A)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   239
 apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   240
apply (subst S_o_alpha_typ)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   241
apply (subst gen_subst_commutes)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   242
 apply (rule subset_antisym)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   243
  apply (rule subsetI)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   244
  apply (erule IntE)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   245
  apply (drule free_tv_S' [THEN subsetD])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   246
  apply (drule free_tv_alpha [THEN subsetD])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   247
  apply (simp del: full_SetCompr_eq)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   248
  apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   249
  apply (hypsubst)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   250
  apply (subgoal_tac "new_tv (n + y) ($ S A) ")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   251
   apply (subgoal_tac "new_tv (n + y) ($ S t) ")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   252
    apply (subgoal_tac "new_tv (n + y) A")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   253
     apply (subgoal_tac "new_tv (n + y) t")
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   254
      apply (drule new_tv_not_free_tv)+
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   255
      apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   256
     apply (rule new_tv_le) prefer 2 apply assumption apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   257
    apply (rule new_tv_le) prefer 2 apply assumption apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   258
   apply (rule new_tv_le) prefer 2 apply assumption apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   259
  apply (rule new_tv_le) prefer 2 apply assumption apply simp
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   260
 apply fast
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   261
apply (rule has_type_le_env)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   262
 apply (drule spec)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   263
 apply (drule spec)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   264
 apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   265
apply (rule app_subst_Cons [THEN subst])
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   266
apply (rule S_compatible_le_scheme_lists)
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   267
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   268
done
b8da5f258b04 converted to Isar
kleing
parents: 4502
diff changeset
   269
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   270
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   271
end