src/HOL/MiniML/Generalize.thy
author kleing
Tue, 02 Mar 2004 01:32:23 +0100
changeset 14422 b8da5f258b04
parent 5518 654ead0ba4f7
permissions -rw-r--r--
converted to Isar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     1
(* Title:     HOL/MiniML/Generalize.thy
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     2
   ID:        $Id$
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     3
   Author:    Wolfgang Naraschewski and Tobias Nipkow
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     4
   Copyright  1996 TU Muenchen
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     5
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     6
Generalizing type schemes with respect to a context
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     7
*)
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
     8
14422
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
     9
theory Generalize = Instance:
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    10
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    11
2625
69c1b8a493de Some lemmas changed to valuesd
narasche
parents: 2525
diff changeset
    12
(* gen: binding (generalising) the variables which are not free in the context *)
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    13
14422
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    14
types ctxt = "type_scheme list"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    15
    
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    16
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    17
  gen :: "[ctxt, typ] => type_scheme"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    18
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 2625
diff changeset
    19
primrec
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    20
  "gen A (TVar n) = (if (n:(free_tv A)) then (FVar n) else (BVar n))"
2625
69c1b8a493de Some lemmas changed to valuesd
narasche
parents: 2525
diff changeset
    21
  "gen A (t1 -> t2) = (gen A t1) =-> (gen A t2)"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    22
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    23
(* executable version of gen: Implementation with free_tv_ML *)
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    24
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    25
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    26
  gen_ML_aux :: "[nat list, typ] => type_scheme"
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 2625
diff changeset
    27
primrec
5518
654ead0ba4f7 re-added mem and list_all
oheimb
parents: 5184
diff changeset
    28
  "gen_ML_aux A (TVar n) = (if (n: set A) then (FVar n) else (BVar n))"
2625
69c1b8a493de Some lemmas changed to valuesd
narasche
parents: 2525
diff changeset
    29
  "gen_ML_aux A (t1 -> t2) = (gen_ML_aux A t1) =-> (gen_ML_aux A t2)"
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    30
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    31
consts
14422
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    32
  gen_ML :: "[ctxt, typ] => type_scheme"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    33
defs
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    34
  gen_ML_def: "gen_ML A t == gen_ML_aux (free_tv_ML A) t"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    35
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    36
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    37
declare equalityE [elim!]
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    38
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    39
lemma gen_eq_on_free_tv: "free_tv A = free_tv B ==> gen A t = gen B t"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    40
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    41
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    42
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    43
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    44
lemma gen_without_effect [rule_format (no_asm)]: "(free_tv t) <= (free_tv sch) --> gen sch t = (mk_scheme t)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    45
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    46
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    47
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    48
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    49
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    50
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    51
declare gen_without_effect [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    52
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    53
lemma free_tv_gen: "free_tv (gen ($ S A) t) = free_tv t Int free_tv ($ S A)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    54
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    55
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    56
apply (case_tac "nat : free_tv ($ S A) ")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    57
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    58
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    59
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    60
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    61
apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    62
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    63
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    64
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    65
declare free_tv_gen [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    66
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    67
lemma free_tv_gen_cons: "free_tv (gen ($ S A) t # $ S A) = free_tv ($ S A)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    68
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    69
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    70
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    71
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    72
declare free_tv_gen_cons [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    73
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    74
lemma bound_tv_gen: "bound_tv (gen A t1) = (free_tv t1) - (free_tv A)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    75
apply (induct_tac "t1")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    76
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    77
apply (case_tac "nat : free_tv A")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    78
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    79
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    80
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    81
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    82
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    83
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    84
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    85
declare bound_tv_gen [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    86
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    87
lemma new_tv_compatible_gen [rule_format (no_asm)]: "new_tv n t --> new_tv n (gen A t)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    88
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    89
apply auto
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    90
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    91
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    92
lemma gen_eq_gen_ML: "gen A t = gen_ML A t"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    93
apply (unfold gen_ML_def)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    94
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    95
 apply (simp (no_asm) add: free_tv_ML_scheme_list)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    96
apply (simp (no_asm_simp) add: free_tv_ML_scheme_list)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    97
done
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
    98
14422
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
    99
lemma gen_subst_commutes [rule_format (no_asm)]: "(free_tv S) Int ((free_tv t) - (free_tv A)) = {}  
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   100
      --> gen ($ S A) ($ S t) = $ S (gen A t)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   101
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   102
 apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   103
 apply (case_tac "nat: (free_tv A) ")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   104
  apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   105
 apply simp
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   106
 apply (subgoal_tac "nat ~: free_tv S")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   107
  prefer 2 apply (fast)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   108
 apply (simp add: free_tv_subst dom_def)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   109
 apply (cut_tac free_tv_app_subst_scheme_list)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   110
 apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   111
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   112
apply blast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   113
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   114
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   115
lemma bound_typ_inst_gen [rule_format (no_asm)]: "free_tv(t::typ) <= free_tv(A) --> bound_typ_inst S (gen A t) = t"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   116
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   117
apply (simp_all (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   118
apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   119
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   120
declare bound_typ_inst_gen [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   121
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   122
lemma gen_bound_typ_instance: 
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   123
  "gen ($ S A) ($ S t) <= $ S (gen A t)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   124
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   125
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   126
apply (rename_tac "R")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   127
apply (rule_tac x = " (%a. bound_typ_inst R (gen ($S A) (S a))) " in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   128
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   129
 apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   130
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   131
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   132
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   133
lemma free_tv_subset_gen_le: 
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   134
  "free_tv B <= free_tv A ==> gen A t <= gen B t"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   135
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   136
apply safe
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   137
apply (rename_tac "S")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   138
apply (rule_tac x = "%b. if b:free_tv A then TVar b else S b" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   139
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   140
 apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   141
 apply fast
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   142
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   143
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   144
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   145
lemma gen_t_le_gen_alpha_t [rule_format (no_asm)]: 
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   146
  "new_tv n A -->  
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   147
   gen A t <= gen A ($ (%x. TVar (if x : free_tv A then x else n + x)) t)"
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   148
apply (unfold le_type_scheme_def is_bound_typ_instance)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   149
apply (intro strip)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   150
apply (erule exE)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   151
apply (hypsubst)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   152
apply (rule_tac x = " (%x. S (if n <= x then x - n else x))" in exI)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   153
apply (induct_tac "t")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   154
apply (simp (no_asm))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   155
apply (case_tac "nat : free_tv A")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   156
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   157
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   158
apply (subgoal_tac "n <= n + nat")
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   159
apply (frule_tac t = "A" in new_tv_le)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   160
apply assumption
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   161
apply (drule new_tv_not_free_tv)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   162
apply (drule new_tv_not_free_tv)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   163
apply (simp (no_asm_simp) add: diff_add_inverse)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   164
apply (simp (no_asm) add: le_add1)
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   165
apply (simp (no_asm_simp))
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   166
done
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   167
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   168
declare gen_t_le_gen_alpha_t [simp]
b8da5f258b04 converted to Isar
kleing
parents: 5518
diff changeset
   169
2525
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
   170
477c05586286 The new version of MiniML including "let".
nipkow
parents:
diff changeset
   171
end