src/HOL/MiniML/Type.thy
author kleing
Tue, 02 Mar 2004 01:32:23 +0100
changeset 14422 b8da5f258b04
parent 13537 f506eb568121
permissions -rw-r--r--
converted to Isar
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/Type.thy
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
     2
   ID:        $Id$
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
     3
   Author:    Wolfgang Naraschewski and Tobias Nipkow
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
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
MiniML-types and type substitutions.
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: 13537
diff changeset
     9
theory Type = Maybe:
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
(* new class for structures containing type variables *)
12338
de0f4a63baa5 renamed class "term" to "type" (actually "HOL.type");
wenzelm
parents: 5184
diff changeset
    12
axclass  type_struct < type
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    13
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 expressions *)
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    16
datatype "typ" = TVar nat | "->" "typ" "typ" (infixr 70)
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
    17
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    18
(* type schemata *)
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    19
datatype type_scheme = FVar nat | BVar nat | "=->" type_scheme type_scheme (infixr 70)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    20
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    21
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    22
(* embedding types into type schemata *)    
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    23
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    24
  mk_scheme :: "typ => type_scheme"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    25
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 3842
diff changeset
    26
primrec
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    27
  "mk_scheme (TVar n) = (FVar n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    28
  "mk_scheme (t1 -> t2) = ((mk_scheme t1) =-> (mk_scheme t2))"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    29
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    30
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    31
instance  "typ"::type_struct ..
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    32
instance  type_scheme::type_struct ..  
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    33
instance  list::(type_struct)type_struct ..
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    34
instance  fun::(type,type_struct)type_struct ..
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    35
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    36
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    37
(* free_tv s: the type variables occuring freely in the type structure s *)
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    38
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    39
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    40
  free_tv :: "['a::type_struct] => nat set"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    41
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    42
primrec (free_tv_typ)
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    43
  free_tv_TVar:    "free_tv (TVar m) = {m}"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    44
  free_tv_Fun:     "free_tv (t1 -> t2) = (free_tv t1) Un (free_tv t2)"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    45
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    46
primrec (free_tv_type_scheme)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    47
  "free_tv (FVar m) = {m}"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    48
  "free_tv (BVar m) = {}"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    49
  "free_tv (S1 =-> S2) = (free_tv S1) Un (free_tv S2)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    50
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    51
primrec (free_tv_list)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    52
  "free_tv [] = {}"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    53
  "free_tv (x#l) = (free_tv x) Un (free_tv l)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    54
2625
69c1b8a493de Some lemmas changed to valuesd
narasche
parents: 2525
diff changeset
    55
  
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    56
(* executable version of free_tv: Implementation with lists *)
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    57
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    58
  free_tv_ML :: "['a::type_struct] => nat list"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    59
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    60
primrec (free_tv_ML_type_scheme)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    61
  "free_tv_ML (FVar m) = [m]"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    62
  "free_tv_ML (BVar m) = []"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    63
  "free_tv_ML (S1 =-> S2) = (free_tv_ML S1) @ (free_tv_ML S2)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    64
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    65
primrec (free_tv_ML_list)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    66
  "free_tv_ML [] = []"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    67
  "free_tv_ML (x#l) = (free_tv_ML x) @ (free_tv_ML l)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    68
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    69
  
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    70
(* new_tv s n computes whether n is a new type variable w.r.t. a type 
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    71
   structure s, i.e. whether n is greater than any type variable 
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    72
   occuring in the type structure *)
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    73
constdefs
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    74
        new_tv :: "[nat,'a::type_struct] => bool"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    75
        "new_tv n ts == ! m. m:(free_tv ts) --> m<n"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    76
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    77
  
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    78
(* bound_tv s: the type variables occuring bound in the type structure s *)
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    79
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    80
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    81
  bound_tv :: "['a::type_struct] => nat set"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    82
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    83
primrec (bound_tv_type_scheme)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    84
  "bound_tv (FVar m) = {}"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    85
  "bound_tv (BVar m) = {m}"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    86
  "bound_tv (S1 =-> S2) = (bound_tv S1) Un (bound_tv S2)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    87
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    88
primrec (bound_tv_list)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    89
  "bound_tv [] = {}"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    90
  "bound_tv (x#l) = (bound_tv x) Un (bound_tv l)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    91
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    92
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    93
(* minimal new free / bound variable *)
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    94
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    95
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
    96
  min_new_bound_tv :: "'a::type_struct => nat"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    97
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
    98
primrec (min_new_bound_tv_type_scheme)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
    99
  "min_new_bound_tv (FVar n) = 0"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   100
  "min_new_bound_tv (BVar n) = Suc n"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   101
  "min_new_bound_tv (sch1 =-> sch2) = max (min_new_bound_tv sch1) (min_new_bound_tv sch2)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   102
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   103
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   104
(* substitutions *)
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   105
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   106
(* type variable substitution *) 
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   107
types
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   108
        subst = "nat => typ"
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   109
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   110
(* identity *)
1557
fe30812f5b5e added constdefs section
clasohm
parents: 1476
diff changeset
   111
constdefs
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1400
diff changeset
   112
        id_subst :: subst
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2625
diff changeset
   113
        "id_subst == (%n. TVar n)"
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   114
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   115
(* extension of substitution to type structures *)
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   116
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   117
  app_subst :: "[subst, 'a::type_struct] => 'a::type_struct" ("$")
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   118
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
   119
primrec (app_subst_typ)
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   120
  app_subst_TVar: "$ S (TVar n) = S n" 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   121
  app_subst_Fun:  "$ S (t1 -> t2) = ($ S t1) -> ($ S t2)" 
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   122
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 12338
diff changeset
   123
primrec (app_subst_type_scheme)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   124
  "$ S (FVar n) = mk_scheme (S n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   125
  "$ S (BVar n) = (BVar n)"
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   126
  "$ S (sch1 =-> sch2) = ($ S sch1) =-> ($ S sch2)"
1604
cff41d1094ad replaced "rules" by "primrec"
nipkow
parents: 1575
diff changeset
   127
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   128
defs
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   129
  app_subst_list: "$ S == map ($ S)"
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   130
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   131
(* domain of a substitution *)
1557
fe30812f5b5e added constdefs section
clasohm
parents: 1476
diff changeset
   132
constdefs
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   133
        dom :: "subst => nat set"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   134
        "dom S == {n. S n ~= TVar n}" 
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   135
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   136
(* codomain of a substitution: the introduced variables *)
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   137
1557
fe30812f5b5e added constdefs section
clasohm
parents: 1476
diff changeset
   138
constdefs
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   139
        cod :: "subst => nat set"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   140
        "cod S == (UN m:dom S. (free_tv (S m)))"
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   141
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   142
defs
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   143
        free_tv_subst:   "free_tv S == (dom S) Un (cod S)" 
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   144
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents: 1900
diff changeset
   145
  
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   146
(* unification algorithm mgu *)
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   147
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   148
        mgu :: "[typ,typ] => subst option"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   149
axioms
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   150
        mgu_eq:   "mgu t1 t2 = Some U ==> $U t1 = $U t2"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   151
        mgu_mg:   "[| (mgu t1 t2) = Some U; $S t1 = $S t2 |] ==> ? R. S = $R o U"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   152
        mgu_Some:   "$S t1 = $S t2 ==> ? U. mgu t1 t2 = Some U"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   153
        mgu_free: "mgu t1 t2 = Some U ==> (free_tv U) <= (free_tv t1) Un (free_tv t2)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   154
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   155
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   156
declare mgu_eq [simp] mgu_mg [simp] mgu_free [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   157
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   158
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   159
(* lemmata for make scheme *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   160
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   161
lemma mk_scheme_Fun [rule_format (no_asm)]: "mk_scheme t = sch1 =-> sch2 --> (? t1 t2. sch1 = mk_scheme t1 & sch2 = mk_scheme t2)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   162
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   163
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   164
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   165
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   166
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   167
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   168
lemma mk_scheme_injective [rule_format (no_asm)]: "!t'. mk_scheme t = mk_scheme t' --> t=t'"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   169
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   170
 apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   171
 apply (induct_tac "t'")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   172
  apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   173
 apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   174
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   175
apply (induct_tac "t'")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   176
 apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   177
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   178
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   179
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   180
lemma free_tv_mk_scheme: "free_tv (mk_scheme t) = free_tv t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   181
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   182
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   183
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   184
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   185
declare free_tv_mk_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   186
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   187
lemma subst_mk_scheme: "$ S (mk_scheme t) = mk_scheme ($ S t)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   188
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   189
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   190
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   191
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   192
declare subst_mk_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   193
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   194
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   195
(* constructor laws for app_subst *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   196
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   197
lemma app_subst_Nil: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   198
  "$ S [] = []"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   199
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   200
apply (unfold app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   201
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   202
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   203
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   204
lemma app_subst_Cons: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   205
  "$ S (x#l) = ($ S x)#($ S l)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   206
apply (unfold app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   207
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   208
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   209
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   210
declare app_subst_Nil [simp] app_subst_Cons [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   211
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   212
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   213
(* constructor laws for new_tv *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   214
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   215
lemma new_tv_TVar: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   216
  "new_tv n (TVar m) = (m<n)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   217
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   218
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   219
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   220
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   221
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   222
lemma new_tv_FVar: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   223
  "new_tv n (FVar m) = (m<n)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   224
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   225
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   226
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   227
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   228
lemma new_tv_BVar: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   229
  "new_tv n (BVar m) = True"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   230
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   231
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   232
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   233
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   234
lemma new_tv_Fun: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   235
  "new_tv n (t1 -> t2) = (new_tv n t1 & new_tv n t2)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   236
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   237
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   238
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   239
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   240
lemma new_tv_Fun2: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   241
  "new_tv n (t1 =-> t2) = (new_tv n t1 & new_tv n t2)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   242
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   243
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   244
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   245
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   246
lemma new_tv_Nil: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   247
  "new_tv n []"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   248
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   249
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   250
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   251
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   252
lemma new_tv_Cons: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   253
  "new_tv n (x#l) = (new_tv n x & new_tv n l)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   254
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   255
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   256
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   257
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   258
lemma new_tv_TVar_subst: "new_tv n TVar"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   259
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   260
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   261
apply (simp add: free_tv_subst dom_def cod_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   262
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   263
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   264
declare new_tv_TVar [simp] new_tv_FVar [simp] new_tv_BVar [simp] new_tv_Fun [simp] new_tv_Fun2 [simp] new_tv_Nil [simp] new_tv_Cons [simp] new_tv_TVar_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   265
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   266
lemma new_tv_id_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   267
  "new_tv n id_subst"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   268
apply (unfold id_subst_def new_tv_def free_tv_subst dom_def cod_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   269
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   270
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   271
declare new_tv_id_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   272
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   273
lemma new_if_subst_type_scheme: "new_tv n (sch::type_scheme) -->  
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   274
      $(%k. if k<n then S k else S' k) sch = $S sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   275
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   276
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   277
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   278
declare new_if_subst_type_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   279
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   280
lemma new_if_subst_type_scheme_list: "new_tv n (A::type_scheme list) -->  
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   281
      $(%k. if k<n then S k else S' k) A = $S A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   282
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   283
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   284
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   285
declare new_if_subst_type_scheme_list [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   286
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   287
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   288
(* constructor laws for dom and cod *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   289
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   290
lemma dom_id_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   291
  "dom id_subst = {}"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   292
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   293
apply (unfold dom_def id_subst_def empty_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   294
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   295
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   296
declare dom_id_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   297
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   298
lemma cod_id_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   299
  "cod id_subst = {}"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   300
apply (unfold cod_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   301
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   302
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   303
declare cod_id_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   304
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   305
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   306
(* lemmata for free_tv *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   307
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   308
lemma free_tv_id_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   309
  "free_tv id_subst = {}"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   310
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   311
apply (unfold free_tv_subst)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   312
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   313
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   314
declare free_tv_id_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   315
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   316
lemma free_tv_nth_A_impl_free_tv_A [rule_format (no_asm)]: "!n. n < length A --> x : free_tv (A!n) --> x : free_tv A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   317
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   318
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   319
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   320
apply (induct_tac "n" rule: nat_induct)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   321
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   322
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   323
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   324
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   325
declare free_tv_nth_A_impl_free_tv_A [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   326
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   327
lemma free_tv_nth_nat_A [rule_format (no_asm)]: "!nat. nat < length A --> x : free_tv (A!nat) --> x : free_tv A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   328
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   329
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   330
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   331
apply (induct_tac "nat" rule: nat_induct)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   332
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   333
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   334
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   335
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   336
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   337
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   338
(* if two substitutions yield the same result if applied to a type
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   339
   structure the substitutions coincide on the free type variables
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   340
   occurring in the type structure *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   341
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   342
lemma typ_substitutions_only_on_free_variables [rule_format (no_asm)]: "(!x:free_tv t. (S x) = (S' x)) --> $ S (t::typ) = $ S' t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   343
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   344
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   345
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   346
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   347
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   348
lemma eq_free_eq_subst_te: "(!n. n:(free_tv t) --> S1 n = S2 n) ==> $ S1 (t::typ) = $ S2 t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   349
apply (rule typ_substitutions_only_on_free_variables)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   350
apply (simp (no_asm) add: Ball_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   351
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   352
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   353
lemma scheme_substitutions_only_on_free_variables [rule_format (no_asm)]: "(!x:free_tv sch. (S x) = (S' x)) --> $ S (sch::type_scheme) = $ S' sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   354
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   355
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   356
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   357
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   358
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   359
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   360
lemma eq_free_eq_subst_type_scheme: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   361
  "(!n. n:(free_tv sch) --> S1 n = S2 n) ==> $ S1 (sch::type_scheme) = $ S2 sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   362
apply (rule scheme_substitutions_only_on_free_variables)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   363
apply (simp (no_asm) add: Ball_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   364
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   365
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   366
lemma eq_free_eq_subst_scheme_list [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   367
  "(!n. n:(free_tv A) --> S1 n = S2 n) --> $S1 (A::type_scheme list) = $S2 A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   368
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   369
(* case [] *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   370
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   371
(* case x#xl *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   372
apply (fastsimp intro: eq_free_eq_subst_type_scheme)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   373
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   374
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   375
lemma weaken_asm_Un: "((!x:A. (P x)) --> Q) ==> ((!x:A Un B. (P x)) --> Q)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   376
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   377
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   378
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   379
lemma scheme_list_substitutions_only_on_free_variables [rule_format (no_asm)]: "(!x:free_tv A. (S x) = (S' x)) --> $ S (A::type_scheme list) = $ S' A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   380
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   381
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   382
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   383
apply (rule weaken_asm_Un)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   384
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   385
apply (erule scheme_substitutions_only_on_free_variables)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   386
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   387
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   388
lemma eq_subst_te_eq_free [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   389
  "$ S1 (t::typ) = $ S2 t --> n:(free_tv t) --> S1 n = S2 n"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   390
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   391
(* case TVar n *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   392
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   393
(* case Fun t1 t2 *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   394
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   395
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   396
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   397
lemma eq_subst_type_scheme_eq_free [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   398
  "$ S1 (sch::type_scheme) = $ S2 sch --> n:(free_tv sch) --> S1 n = S2 n"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   399
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   400
(* case TVar n *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   401
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   402
(* case BVar n *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   403
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   404
apply (erule mk_scheme_injective)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   405
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   406
(* case Fun t1 t2 *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   407
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   408
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   409
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   410
lemma eq_subst_scheme_list_eq_free [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   411
  "$S1 (A::type_scheme list) = $S2 A --> n:(free_tv A) --> S1 n = S2 n"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   412
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   413
(* case [] *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   414
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   415
(* case x#xl *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   416
apply (fastsimp intro: eq_subst_type_scheme_eq_free)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   417
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   418
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   419
lemma codD: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   420
      "v : cod S ==> v : free_tv S"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   421
apply (unfold free_tv_subst)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   422
apply (fast)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   423
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   424
 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   425
lemma not_free_impl_id: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   426
      "x ~: free_tv S ==> S x = TVar x"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   427
 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   428
apply (unfold free_tv_subst dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   429
apply (fast)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   430
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   431
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   432
lemma free_tv_le_new_tv: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   433
      "[| new_tv n t; m:free_tv t |] ==> m<n"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   434
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   435
apply (fast)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   436
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   437
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   438
lemma cod_app_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   439
  "[| v : free_tv(S n); v~=n |] ==> v : cod S"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   440
apply (unfold dom_def cod_def UNION_def Bex_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   441
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   442
apply (safe intro!: exI conjI notI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   443
prefer 2 apply (assumption)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   444
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   445
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   446
declare cod_app_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   447
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   448
lemma free_tv_subst_var: "free_tv (S (v::nat)) <= insert v (cod S)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   449
apply (case_tac "v:dom S")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   450
apply (fastsimp simp add: cod_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   451
apply (fastsimp simp add: dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   452
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   453
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   454
lemma free_tv_app_subst_te: "free_tv ($ S (t::typ)) <= cod S Un free_tv t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   455
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   456
(* case TVar n *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   457
apply (simp (no_asm) add: free_tv_subst_var)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   458
(* case Fun t1 t2 *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   459
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   460
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   461
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   462
lemma free_tv_app_subst_type_scheme: "free_tv ($ S (sch::type_scheme)) <= cod S Un free_tv sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   463
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   464
(* case FVar n *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   465
apply (simp (no_asm) add: free_tv_subst_var)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   466
(* case BVar n *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   467
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   468
(* case Fun t1 t2 *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   469
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   470
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   471
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   472
lemma free_tv_app_subst_scheme_list: "free_tv ($ S (A::type_scheme list)) <= cod S Un free_tv A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   473
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   474
(* case [] *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   475
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   476
(* case a#al *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   477
apply (cut_tac free_tv_app_subst_type_scheme)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   478
apply (fastsimp)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   479
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   480
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   481
lemma free_tv_comp_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   482
     "free_tv (%u::nat. $ s1 (s2 u) :: typ) <=    
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   483
      free_tv s1 Un free_tv s2"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   484
apply (unfold free_tv_subst dom_def) 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   485
apply (clarsimp simp add: cod_def dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   486
apply (drule free_tv_app_subst_te [THEN subsetD])
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   487
apply clarsimp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   488
apply (auto simp add: cod_def dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   489
apply (drule free_tv_subst_var [THEN subsetD])
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   490
apply (auto simp add: cod_def dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   491
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   492
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   493
lemma free_tv_o_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   494
     "free_tv ($ S1 o S2) <= free_tv S1 Un free_tv (S2 :: nat => typ)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   495
apply (unfold o_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   496
apply (rule free_tv_comp_subst)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   497
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   498
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   499
lemma free_tv_of_substitutions_extend_to_types [rule_format (no_asm)]: "n : free_tv t --> free_tv (S n) <= free_tv ($ S t::typ)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   500
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   501
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   502
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   503
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   504
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   505
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   506
lemma free_tv_of_substitutions_extend_to_schemes [rule_format (no_asm)]: "n : free_tv sch --> free_tv (S n) <= free_tv ($ S sch::type_scheme)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   507
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   508
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   509
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   510
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   511
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   512
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   513
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   514
lemma free_tv_of_substitutions_extend_to_scheme_lists [rule_format (no_asm)]: "n : free_tv A --> free_tv (S n) <= free_tv ($ S A::type_scheme list)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   515
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   516
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   517
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   518
apply (fast dest: free_tv_of_substitutions_extend_to_schemes)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   519
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   520
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   521
declare free_tv_of_substitutions_extend_to_scheme_lists [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   522
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   523
lemma free_tv_ML_scheme: "!!sch::type_scheme. (n : free_tv sch) = (n: set (free_tv_ML sch))"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   524
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   525
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   526
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   527
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   528
lemma free_tv_ML_scheme_list: "!!A::type_scheme list. (n : free_tv A) = (n: set (free_tv_ML A))"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   529
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   530
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   531
apply (simp (no_asm_simp) add: free_tv_ML_scheme)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   532
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   533
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   534
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   535
(* lemmata for bound_tv *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   536
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   537
lemma bound_tv_mk_scheme: "bound_tv (mk_scheme t) = {}"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   538
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   539
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   540
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   541
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   542
declare bound_tv_mk_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   543
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   544
lemma bound_tv_subst_scheme: "!!sch::type_scheme. bound_tv ($ S sch) = bound_tv sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   545
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   546
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   547
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   548
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   549
declare bound_tv_subst_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   550
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   551
lemma bound_tv_subst_scheme_list: "!!A::type_scheme list. bound_tv ($ S A) = bound_tv A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   552
apply (rule list.induct)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   553
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   554
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   555
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   556
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   557
declare bound_tv_subst_scheme_list [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   558
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   559
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   560
(* lemmata for new_tv *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   561
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   562
lemma new_tv_subst: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   563
  "new_tv n S = ((!m. n <= m --> (S m = TVar m)) &  
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   564
                 (! l. l < n --> new_tv n (S l) ))"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   565
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   566
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   567
apply (safe)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   568
  (* ==> *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   569
  apply (fastsimp dest: leD simp add: free_tv_subst dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   570
 apply (subgoal_tac "m:cod S | S l = TVar l")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   571
  apply safe
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   572
   apply (fastsimp dest: UnI2 simp add: free_tv_subst)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   573
  apply (drule_tac P = "%x. m:free_tv x" in subst , assumption)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   574
  apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   575
 apply (fastsimp simp add: free_tv_subst cod_def dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   576
(* <== *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   577
apply (unfold free_tv_subst cod_def dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   578
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   579
 apply (cut_tac m = "m" and n = "n" in less_linear)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   580
 apply (fast intro!: less_or_eq_imp_le)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   581
apply (cut_tac m = "ma" and n = "n" in less_linear)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   582
apply (fast intro!: less_or_eq_imp_le) 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   583
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   584
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   585
lemma new_tv_list: "new_tv n x = (!y:set x. new_tv n y)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   586
apply (induct_tac "x")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   587
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   588
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   589
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   590
(* substitution affects only variables occurring freely *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   591
lemma subst_te_new_tv: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   592
  "new_tv n (t::typ) --> $(%x. if x=n then t' else S x) t = $S t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   593
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   594
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   595
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   596
declare subst_te_new_tv [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   597
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   598
lemma subst_te_new_type_scheme [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   599
  "new_tv n (sch::type_scheme) --> $(%x. if x=n then sch' else S x) sch = $S sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   600
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   601
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   602
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   603
declare subst_te_new_type_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   604
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   605
lemma subst_tel_new_scheme_list [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   606
  "new_tv n (A::type_scheme list) --> $(%x. if x=n then t else S x) A = $S A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   607
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   608
apply simp_all
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   609
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   610
declare subst_tel_new_scheme_list [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   611
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   612
(* all greater variables are also new *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   613
lemma new_tv_le: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   614
  "n<=m ==> new_tv n t ==> new_tv m t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   615
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   616
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   617
apply (drule spec)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   618
apply (erule (1) notE impE)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   619
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   620
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   621
declare lessI [THEN less_imp_le [THEN new_tv_le], simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   622
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   623
lemma new_tv_typ_le: "n<=m ==> new_tv n (t::typ) ==> new_tv m t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   624
apply (simp (no_asm_simp) add: new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   625
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   626
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   627
lemma new_scheme_list_le: "n<=m ==> new_tv n (A::type_scheme list) ==> new_tv m A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   628
apply (simp (no_asm_simp) add: new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   629
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   630
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   631
lemma new_tv_subst_le: "n<=m ==> new_tv n (S::subst) ==> new_tv m S"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   632
apply (simp (no_asm_simp) add: new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   633
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   634
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   635
(* new_tv property remains if a substitution is applied *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   636
lemma new_tv_subst_var: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   637
  "[| n<m; new_tv m (S::subst) |] ==> new_tv m (S n)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   638
apply (simp add: new_tv_subst)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   639
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   640
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   641
lemma new_tv_subst_te [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   642
  "new_tv n S --> new_tv n (t::typ) --> new_tv n ($ S t)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   643
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   644
apply (fastsimp simp add: new_tv_subst)+
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   645
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   646
declare new_tv_subst_te [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   647
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   648
lemma new_tv_subst_type_scheme [rule_format (no_asm)]: "new_tv n S --> new_tv n (sch::type_scheme) --> new_tv n ($ S sch)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   649
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   650
apply (simp_all)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   651
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   652
apply (simp (no_asm) add: free_tv_subst dom_def cod_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   653
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   654
apply (case_tac "S nat = TVar nat")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   655
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   656
apply (drule_tac x = "m" in spec)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   657
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   658
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   659
declare new_tv_subst_type_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   660
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   661
lemma new_tv_subst_scheme_list [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   662
  "new_tv n S --> new_tv n (A::type_scheme list) --> new_tv n ($ S A)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   663
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   664
apply (fastsimp)+
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   665
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   666
declare new_tv_subst_scheme_list [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   667
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   668
lemma new_tv_Suc_list: "new_tv n A --> new_tv (Suc n) ((TVar n)#A)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   669
apply (simp (no_asm) add: new_tv_list)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   670
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   671
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   672
lemma new_tv_only_depends_on_free_tv_type_scheme [rule_format (no_asm)]: "!!sch::type_scheme. (free_tv sch) = (free_tv sch') --> (new_tv n sch --> new_tv n sch')"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   673
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   674
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   675
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   676
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   677
lemma new_tv_only_depends_on_free_tv_scheme_list [rule_format (no_asm)]: "!!A::type_scheme list. (free_tv A) = (free_tv A') --> (new_tv n A --> new_tv n A')"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   678
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   679
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   680
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   681
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   682
lemma new_tv_nth_nat_A [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   683
  "!nat. nat < length A --> new_tv n A --> (new_tv n (A!nat))"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   684
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   685
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   686
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   687
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   688
apply (induct_tac "nat" rule: nat_induct)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   689
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   690
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   691
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   692
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   693
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   694
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   695
(* composition of substitutions preserves new_tv proposition *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   696
lemma new_tv_subst_comp_1: "[| new_tv n (S::subst); new_tv n R |] ==> new_tv n (($ R) o S)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   697
apply (simp add: new_tv_subst)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   698
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   699
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   700
lemma new_tv_subst_comp_2: "[| new_tv n (S::subst); new_tv n R |] ==> new_tv n (%v.$ R (S v))"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   701
apply (simp add: new_tv_subst)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   702
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   703
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   704
declare new_tv_subst_comp_1 [simp] new_tv_subst_comp_2 [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   705
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   706
(* new type variables do not occur freely in a type structure *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   707
lemma new_tv_not_free_tv: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   708
      "new_tv n A ==> n~:(free_tv A)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   709
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   710
apply (fast elim: less_irrefl)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   711
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   712
declare new_tv_not_free_tv [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   713
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   714
lemma fresh_variable_types: "!!t::typ. ? n. (new_tv n t)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   715
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   716
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   717
apply (rule_tac x = "Suc nat" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   718
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   719
apply (erule exE)+
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   720
apply (rename_tac "n'")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   721
apply (rule_tac x = "max n n'" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   722
apply (simp (no_asm) add: less_max_iff_disj)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   723
apply blast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   724
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   725
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   726
declare fresh_variable_types [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   727
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   728
lemma fresh_variable_type_schemes: "!!sch::type_scheme. ? n. (new_tv n sch)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   729
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   730
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   731
apply (rule_tac x = "Suc nat" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   732
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   733
apply (rule_tac x = "Suc nat" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   734
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   735
apply (erule exE)+
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   736
apply (rename_tac "n'")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   737
apply (rule_tac x = "max n n'" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   738
apply (simp (no_asm) add: less_max_iff_disj)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   739
apply blast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   740
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   741
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   742
declare fresh_variable_type_schemes [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   743
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   744
lemma fresh_variable_type_scheme_lists: "!!A::type_scheme list. ? n. (new_tv n A)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   745
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   746
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   747
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   748
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   749
apply (cut_tac sch = "a" in fresh_variable_type_schemes)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   750
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   751
apply (rename_tac "n'")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   752
apply (rule_tac x = " (max n n') " in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   753
apply (subgoal_tac "n <= (max n n') ")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   754
apply (subgoal_tac "n' <= (max n n') ")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   755
apply (fast dest: new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   756
apply (simp_all (no_asm) add: le_max_iff_disj)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   757
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   758
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   759
declare fresh_variable_type_scheme_lists [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   760
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   761
lemma make_one_new_out_of_two: "[| ? n1. (new_tv n1 x); ? n2. (new_tv n2 y)|] ==> ? n. (new_tv n x) & (new_tv n y)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   762
apply (erule exE)+
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   763
apply (rename_tac "n1" "n2")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   764
apply (rule_tac x = " (max n1 n2) " in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   765
apply (subgoal_tac "n1 <= max n1 n2")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   766
apply (subgoal_tac "n2 <= max n1 n2")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   767
apply (fast dest: new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   768
apply (simp_all (no_asm) add: le_max_iff_disj)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   769
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   770
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   771
lemma ex_fresh_variable: "!!(A::type_scheme list) (A'::type_scheme list) (t::typ) (t'::typ).  
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   772
          ? n. (new_tv n A) & (new_tv n A') & (new_tv n t) & (new_tv n t')"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   773
apply (cut_tac t = "t" in fresh_variable_types)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   774
apply (cut_tac t = "t'" in fresh_variable_types)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   775
apply (drule make_one_new_out_of_two)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   776
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   777
apply (erule_tac V = "? n. new_tv n t'" in thin_rl)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   778
apply (cut_tac A = "A" in fresh_variable_type_scheme_lists)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   779
apply (cut_tac A = "A'" in fresh_variable_type_scheme_lists)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   780
apply (rotate_tac 1)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   781
apply (drule make_one_new_out_of_two)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   782
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   783
apply (erule_tac V = "? n. new_tv n A'" in thin_rl)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   784
apply (erule exE)+
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   785
apply (rename_tac n2 n1)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   786
apply (rule_tac x = " (max n1 n2) " in exI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   787
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   788
apply (simp (no_asm) add: less_max_iff_disj)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   789
apply blast
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   790
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   791
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   792
(* mgu does not introduce new type variables *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   793
lemma mgu_new: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   794
      "[|mgu t1 t2 = Some u; new_tv n t1; new_tv n t2|] ==> new_tv n u"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   795
apply (unfold new_tv_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   796
apply (fast dest: mgu_free)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   797
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   798
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   799
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   800
(* lemmata for substitutions *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   801
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   802
lemma length_app_subst_list: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   803
   "!!A:: ('a::type_struct) list. length ($ S A) = length A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   804
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   805
apply (unfold app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   806
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   807
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   808
declare length_app_subst_list [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   809
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   810
lemma subst_TVar_scheme: "!!sch::type_scheme. $ TVar sch = sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   811
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   812
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   813
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   814
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   815
declare subst_TVar_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   816
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   817
lemma subst_TVar_scheme_list: "!!A::type_scheme list. $ TVar A = A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   818
apply (rule list.induct)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   819
apply (simp_all add: app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   820
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   821
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   822
declare subst_TVar_scheme_list [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   823
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   824
(* application of id_subst does not change type expression *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   825
lemma app_subst_id_te: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   826
  "$ id_subst = (%t::typ. t)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   827
apply (unfold id_subst_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   828
apply (rule ext)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   829
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   830
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   831
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   832
declare app_subst_id_te [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   833
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   834
lemma app_subst_id_type_scheme: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   835
  "$ id_subst = (%sch::type_scheme. sch)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   836
apply (unfold id_subst_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   837
apply (rule ext)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   838
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   839
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   840
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   841
declare app_subst_id_type_scheme [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   842
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   843
(* application of id_subst does not change list of type expressions *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   844
lemma app_subst_id_tel: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   845
  "$ id_subst = (%A::type_scheme list. A)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   846
apply (unfold app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   847
apply (rule ext)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   848
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   849
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   850
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   851
declare app_subst_id_tel [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   852
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   853
lemma id_subst_sch: "!!sch::type_scheme. $ id_subst sch = sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   854
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   855
apply (simp_all add: id_subst_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   856
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   857
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   858
declare id_subst_sch [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   859
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   860
lemma id_subst_A: "!!A::type_scheme list. $ id_subst A = A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   861
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   862
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   863
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   864
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   865
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   866
declare id_subst_A [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   867
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   868
(* composition of substitutions *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   869
lemma o_id_subst: "$S o id_subst = S"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   870
apply (unfold id_subst_def o_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   871
apply (rule ext)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   872
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   873
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   874
declare o_id_subst [simp]
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   875
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   876
lemma subst_comp_te: "$ R ($ S t::typ) = $ (%x. $ R (S x) ) t"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   877
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   878
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   879
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   880
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   881
lemma subst_comp_type_scheme: "$ R ($ S sch::type_scheme) = $ (%x. $ R (S x) ) sch"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   882
apply (induct_tac "sch")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   883
apply simp_all
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   884
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   885
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   886
lemma subst_comp_scheme_list: 
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   887
  "$ R ($ S A::type_scheme list) = $ (%x. $ R (S x)) A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   888
apply (unfold app_subst_list)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   889
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   890
(* case [] *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   891
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   892
(* case x#xl *)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   893
apply (simp add: subst_comp_type_scheme)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   894
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   895
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   896
lemma subst_id_on_type_scheme_list': "!!A::type_scheme list. !x : free_tv A. S x = (TVar x) ==> $ S A = $ id_subst A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   897
apply (rule scheme_list_substitutions_only_on_free_variables)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   898
apply (simp add: id_subst_def)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   899
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   900
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   901
lemma subst_id_on_type_scheme_list: "!!A::type_scheme list. !x : free_tv A. S x = (TVar x) ==> $ S A = A"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   902
apply (subst subst_id_on_type_scheme_list')
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   903
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   904
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   905
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   906
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   907
lemma nth_subst [rule_format (no_asm)]: "!n. n < length A --> ($ S A)!n = $S (A!n)"
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   908
apply (induct_tac "A")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   909
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   910
apply (rule allI)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   911
apply (rename_tac "n1")
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   912
apply (induct_tac "n1" rule: nat_induct)
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   913
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   914
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   915
done
b8da5f258b04 converted to Isar
kleing
parents: 13537
diff changeset
   916
1300
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   917
c7a8f374339b New theory: type inference for let-free MiniML
nipkow
parents:
diff changeset
   918
end