src/HOL/MiniML/Instance.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:
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     1
(* Title:     HOL/MiniML/Instance.thy
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     2
   ID:        $Id$
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     3
   Author:    Wolfgang Naraschewski and Tobias Nipkow
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     4
   Copyright  1996 TU Muenchen
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     5
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     6
Instances of type schemes
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     7
*)
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     8
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
     9
theory Instance = Type:
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    10
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    11
  
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    12
(* generic instances of a type scheme *)
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    13
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    14
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    15
  bound_typ_inst :: "[subst, type_scheme] => typ"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    16
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4502
diff changeset
    17
primrec
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    18
  "bound_typ_inst S (FVar n) = (TVar n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    19
  "bound_typ_inst S (BVar n) = (S n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    20
  "bound_typ_inst S (sch1 =-> sch2) = ((bound_typ_inst S sch1) -> (bound_typ_inst S sch2))"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    21
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    22
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    23
  bound_scheme_inst :: "[nat => type_scheme, type_scheme] => type_scheme"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    24
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4502
diff changeset
    25
primrec
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    26
  "bound_scheme_inst S (FVar n) = (FVar n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    27
  "bound_scheme_inst S (BVar n) = (S n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    28
  "bound_scheme_inst S (sch1 =-> sch2) = ((bound_scheme_inst S sch1) =-> (bound_scheme_inst S sch2))"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    29
  
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    30
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    31
  "<|" :: "[typ, type_scheme] => bool" (infixr 70)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    32
defs
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    33
  is_bound_typ_instance: "t <| sch == ? S. t = (bound_typ_inst S sch)" 
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    34
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    35
instance type_scheme :: ord ..
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    36
defs le_type_scheme_def: "sch' <= (sch::type_scheme) == !t. t <| sch' --> t <| sch"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    37
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    38
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    39
  subst_to_scheme :: "[nat => type_scheme, typ] => type_scheme"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    40
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4502
diff changeset
    41
primrec
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    42
  "subst_to_scheme B (TVar n) = (B n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    43
  "subst_to_scheme B (t1 -> t2) = ((subst_to_scheme B t1) =-> (subst_to_scheme B t2))"
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    44
  
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    45
instance list :: (ord)ord ..
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    46
defs le_env_def:
4502
337c073de95e nth -> !
nipkow
parents: 2525
diff changeset
    47
  "A <= B == length B = length A & (!i. i < length A --> A!i <= B!i)"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    48
14422
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    49
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    50
(* lemmatas for instatiation *)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    51
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    52
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    53
(* lemmatas for bound_typ_inst *)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    54
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    55
lemma bound_typ_inst_mk_scheme: "bound_typ_inst S (mk_scheme t) = t"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    56
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    57
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    58
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    59
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    60
declare bound_typ_inst_mk_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    61
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    62
lemma bound_typ_inst_composed_subst: "bound_typ_inst ($S o R) ($S sch) = $S (bound_typ_inst R sch)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    63
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    64
apply simp_all
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    65
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    66
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    67
declare bound_typ_inst_composed_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    68
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    69
lemma bound_typ_inst_eq: "S = S' ==> sch = sch' ==> bound_typ_inst S sch = bound_typ_inst S' sch'"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    70
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    71
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    72
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    73
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    74
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    75
(* lemmatas for bound_scheme_inst *)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    76
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    77
lemma bound_scheme_inst_mk_scheme: "bound_scheme_inst B (mk_scheme t) = mk_scheme t"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    78
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    79
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    80
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    81
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    82
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    83
declare bound_scheme_inst_mk_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    84
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    85
lemma substitution_lemma: "$S (bound_scheme_inst B sch) = (bound_scheme_inst ($S o B) ($ S sch))"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    86
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    87
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    88
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    89
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    90
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    91
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    92
lemma bound_scheme_inst_type [rule_format (no_asm)]: "!t. mk_scheme t = bound_scheme_inst B sch -->  
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    93
          (? S. !x:bound_tv sch. B x = mk_scheme (S x))"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    94
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    95
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    96
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    97
apply (rule exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    98
apply (rule ballI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
    99
apply (rule sym)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   100
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   101
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   102
apply (drule mk_scheme_Fun)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   103
apply (erule exE)+
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   104
apply (erule conjE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   105
apply (drule sym)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   106
apply (drule sym)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   107
apply (drule mp, fast)+
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   108
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   109
apply (rename_tac S1 S2)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   110
apply (rule_tac x = "%x. if x:bound_tv type_scheme1 then (S1 x) else (S2 x) " in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   111
apply auto
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   112
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   113
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   114
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   115
(* lemmas for subst_to_scheme *)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   116
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   117
lemma subst_to_scheme_inverse [rule_format (no_asm)]: "new_tv n sch --> subst_to_scheme (%k. if n <= k then BVar (k - n) else FVar k)  
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   118
                                                  (bound_typ_inst (%k. TVar (k + n)) sch) = sch"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   119
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   120
apply (simp (no_asm) add: le_def)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   121
apply (simp (no_asm) add: le_add2 diff_add_inverse2)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   122
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   123
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   124
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   125
lemma aux: "t = t' ==>  
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   126
      subst_to_scheme (%k. if n <= k then BVar (k - n) else FVar k) t =  
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   127
      subst_to_scheme (%k. if n <= k then BVar (k - n) else FVar k) t'"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   128
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   129
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   130
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   131
lemma aux2 [rule_format]: "new_tv n sch -->  
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   132
      subst_to_scheme (%k. if n <= k then BVar (k - n) else FVar k) (bound_typ_inst S sch) =  
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   133
       bound_scheme_inst ((subst_to_scheme (%k. if n <= k then BVar (k - n) else FVar k)) o S) sch"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   134
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   135
apply auto
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   136
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   137
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   138
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   139
(* lemmata for <= *)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   140
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   141
lemma le_type_scheme_def2: 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   142
  "!!(sch::type_scheme) sch'.  
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   143
   (sch' <= sch) = (? B. sch' = bound_scheme_inst B sch)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   144
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   145
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   146
apply (rule iffI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   147
apply (cut_tac sch = "sch" in fresh_variable_type_schemes)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   148
apply (cut_tac sch = "sch'" in fresh_variable_type_schemes)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   149
apply (drule make_one_new_out_of_two)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   150
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   151
apply (erule_tac V = "? n. new_tv n sch'" in thin_rl)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   152
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   153
apply (erule allE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   154
apply (drule mp)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   155
apply (rule_tac x = " (%k. TVar (k + n))" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   156
apply (rule refl)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   157
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   158
apply (erule conjE)+
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   159
apply (drule_tac n = "n" in aux)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   160
apply (simp add: subst_to_scheme_inverse)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   161
apply (rule_tac x = " (subst_to_scheme (%k. if n <= k then BVar (k - n) else FVar k)) o S" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   162
apply (simp (no_asm_simp) add: aux2)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   163
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   164
apply (rule_tac x = "%n. bound_typ_inst S (B n) " in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   165
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   166
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   167
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   168
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   169
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   170
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   171
lemma le_type_eq_is_bound_typ_instance [rule_format (no_asm)]: "(mk_scheme t) <= sch = t <| sch"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   172
apply (unfold is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   173
apply (simp (no_asm) add: le_type_scheme_def2)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   174
apply (rule iffI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   175
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   176
apply (frule bound_scheme_inst_type)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   177
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   178
apply (rule exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   179
apply (rule mk_scheme_injective)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   180
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   181
apply (rotate_tac 1)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   182
apply (rule mp)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   183
prefer 2 apply (assumption)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   184
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   185
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   186
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   187
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   188
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   189
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   190
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   191
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   192
apply (rule exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   193
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   194
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   195
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   196
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   197
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   198
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   199
lemma le_env_Cons: 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   200
  "(sch # A <= sch' # B) = (sch <= (sch'::type_scheme) & A <= B)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   201
apply (unfold le_env_def)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   202
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   203
apply (rule iffI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   204
 apply clarify
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   205
 apply (rule conjI) 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   206
  apply (erule_tac x = "0" in allE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   207
  apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   208
 apply (rule conjI, assumption)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   209
 apply clarify
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   210
 apply (erule_tac x = "Suc i" in allE) 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   211
 apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   212
apply (rule conjI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   213
 apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   214
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   215
apply (induct_tac "i")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   216
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   217
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   218
declare le_env_Cons [iff]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   219
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   220
lemma is_bound_typ_instance_closed_subst: "t <| sch ==> $S t <| $S sch"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   221
apply (unfold is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   222
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   223
apply (rename_tac "SA") 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   224
apply (simp)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   225
apply (rule_tac x = "$S o SA" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   226
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   227
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   228
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   229
lemma S_compatible_le_scheme: "!!(sch::type_scheme) sch'. sch' <= sch ==> $S sch' <= $ S sch"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   230
apply (simp add: le_type_scheme_def2)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   231
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   232
apply (simp add: substitution_lemma)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   233
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   234
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   235
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   236
lemma S_compatible_le_scheme_lists: 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   237
 "!!(A::type_scheme list) A'. A' <= A ==> $S A' <= $ S A"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   238
apply (unfold le_env_def app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   239
apply (simp (no_asm) cong add: conj_cong)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   240
apply (fast intro!: S_compatible_le_scheme)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   241
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   242
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   243
lemma bound_typ_instance_trans: "[| t <| sch; sch <= sch' |] ==> t <| sch'"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   244
apply (unfold le_type_scheme_def)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   245
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   246
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   247
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   248
lemma le_type_scheme_refl: "sch <= (sch::type_scheme)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   249
apply (unfold le_type_scheme_def)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   250
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   251
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   252
declare le_type_scheme_refl [iff]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   253
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   254
lemma le_env_refl: "A <= (A::type_scheme list)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   255
apply (unfold le_env_def)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   256
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   257
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   258
declare le_env_refl [iff]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   259
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   260
lemma bound_typ_instance_BVar: "sch <= BVar n"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   261
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   262
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   263
apply (rule_tac x = "%a. t" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   264
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   265
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   266
declare bound_typ_instance_BVar [iff]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   267
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   268
lemma le_FVar: 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   269
 "(sch <= FVar n) = (sch = FVar n)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   270
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   271
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   272
  apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   273
 apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   274
 apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   275
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   276
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   277
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   278
declare le_FVar [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   279
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   280
lemma not_FVar_le_Fun: "~(FVar n <= sch1 =-> sch2)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   281
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   282
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   283
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   284
declare not_FVar_le_Fun [iff]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   285
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   286
lemma not_BVar_le_Fun: "~(BVar n <= sch1 =-> sch2)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   287
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   288
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   289
apply (rule_tac x = "TVar n" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   290
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   291
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   292
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   293
declare not_BVar_le_Fun [iff]
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   294
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   295
lemma Fun_le_FunD: 
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   296
  "(sch1 =-> sch2 <= sch1' =-> sch2') ==> sch1 <= sch1' & sch2 <= sch2'"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   297
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   298
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   299
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   300
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   301
lemma scheme_le_Fun [rule_format (no_asm)]: "(sch' <= sch1 =-> sch2) --> (? sch'1 sch'2. sch' = sch'1 =-> sch'2)"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   302
apply (induct_tac "sch'")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   303
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   304
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   305
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   306
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   307
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   308
lemma le_type_scheme_free_tv [rule_format (no_asm)]: "!sch'::type_scheme. sch <= sch' --> free_tv sch' <= free_tv sch"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   309
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   310
  apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   311
  apply (induct_tac "sch'")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   312
    apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   313
   apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   314
  apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   315
 apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   316
 apply (induct_tac "sch'")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   317
   apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   318
  apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   319
 apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   320
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   321
apply (induct_tac "sch'")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   322
  apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   323
 apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   324
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   325
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   326
apply (drule Fun_le_FunD)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   327
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   328
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   329
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   330
lemma le_env_free_tv [rule_format (no_asm)]: "!A::type_scheme list. A <= B --> free_tv B <= free_tv A"
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   331
apply (induct_tac "B")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   332
 apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   333
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   334
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   335
 apply (simp (no_asm) add: le_env_def)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   336
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   337
apply (fast dest: le_type_scheme_free_tv)
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   338
done
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   339
b8da5f258b04 converted to Isar
kleing
parents: 5184
diff changeset
   340
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
   341
end