src/HOL/Subst/Subst.thy
changeset 15635 8408a06590a6
parent 5184 9b8547a9496a
child 15648 f6da795ee27a
equal deleted inserted replaced
15634:bca33c49b083 15635:8408a06590a6
     1 (*  Title:      Subst/Subst.thy
     1 (*  Title:      Subst/Subst.thy
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Martin Coen, Cambridge University Computer Laboratory
     3     Author:     Martin Coen, Cambridge University Computer Laboratory
     4     Copyright   1993  University of Cambridge
     4     Copyright   1993  University of Cambridge
     5 
       
     6 Substitutions on uterms
       
     7 *)
     5 *)
     8 
     6 
     9 Subst = AList + UTerm +
     7 header{*Substitutions on uterms*}
       
     8 
       
     9 theory Subst
       
    10 imports AList UTerm
       
    11 begin
    10 
    12 
    11 consts
    13 consts
    12 
    14 
    13   "=$="  ::  "[('a*('a uterm)) list,('a*('a uterm)) list] => bool" (infixr 52)
    15   "=$="  ::  "[('a*('a uterm)) list,('a*('a uterm)) list] => bool" (infixr 52)
    14   "<|"   ::  "'a uterm => ('a * 'a uterm) list => 'a uterm"        (infixl 55)
    16   "<|"   ::  "'a uterm => ('a * 'a uterm) list => 'a uterm"        (infixl 55)
    17   sdom   ::  "('a*('a uterm)) list => 'a set"
    19   sdom   ::  "('a*('a uterm)) list => 'a set"
    18   srange ::  "('a*('a uterm)) list => 'a set"
    20   srange ::  "('a*('a uterm)) list => 'a set"
    19 
    21 
    20 
    22 
    21 primrec
    23 primrec
    22   subst_Var      "(Var v <| s) = assoc v (Var v) s"
    24   subst_Var:      "(Var v <| s) = assoc v (Var v) s"
    23   subst_Const  "(Const c <| s) = Const c"
    25   subst_Const:  "(Const c <| s) = Const c"
    24   subst_Comb  "(Comb M N <| s) = Comb (M <| s) (N <| s)"
    26   subst_Comb:  "(Comb M N <| s) = Comb (M <| s) (N <| s)"
    25 
    27 
    26 
    28 
    27 defs 
    29 defs 
    28 
    30 
    29   subst_eq_def  "r =$= s == ALL t. t <| r = t <| s"
    31   subst_eq_def:  "r =$= s == ALL t. t <| r = t <| s"
    30 
    32 
    31   comp_def    "al <> bl == alist_rec al bl (%x y xs g. (x,y <| bl)#g)"
    33   comp_def:    "al <> bl == alist_rec al bl (%x y xs g. (x,y <| bl)#g)"
    32 
    34 
    33   sdom_def
    35   sdom_def:
    34   "sdom(al) == alist_rec al {}  
    36   "sdom(al) == alist_rec al {}  
    35                 (%x y xs g. if Var(x)=y then g - {x} else g Un {x})"
    37                 (%x y xs g. if Var(x)=y then g - {x} else g Un {x})"
    36 
    38 
    37   srange_def   
    39   srange_def:
    38    "srange(al) == Union({y. EX x:sdom(al). y=vars_of(Var(x) <| al)})"
    40    "srange(al) == Union({y. EX x:sdom(al). y=vars_of(Var(x) <| al)})"
    39 
    41 
       
    42 
       
    43 
       
    44 subsection{*Basic Laws*}
       
    45 
       
    46 lemma subst_Nil [simp]: "t <| [] = t"
       
    47 by (induct_tac "t", auto)
       
    48 
       
    49 lemma subst_mono [rule_format]: "t <: u --> t <| s <: u <| s"
       
    50 by (induct_tac "u", auto)
       
    51 
       
    52 lemma Var_not_occs [rule_format]:
       
    53      "~ (Var(v) <: t) --> t <| (v,t <| s) # s = t <| s"
       
    54 apply (case_tac "t = Var v")
       
    55 apply (erule_tac [2] rev_mp)
       
    56 apply (rule_tac [2] P = "%x.~x=Var (v) --> ~ (Var (v) <: x) --> x <| (v,t<|s) #s=x<|s" in uterm.induct)
       
    57 apply auto 
       
    58 done
       
    59 
       
    60 lemma agreement: "(t <|r = t <|s) = (\<forall>v. v : vars_of(t) --> Var(v) <|r = Var(v) <|s)"
       
    61 by (induct_tac "t", auto)
       
    62 
       
    63 lemma repl_invariance: "~ v: vars_of(t) ==> t <| (v,u)#s = t <| s"
       
    64 by (simp add: agreement)
       
    65 
       
    66 lemma Var_in_subst [rule_format]:
       
    67      "v : vars_of(t) --> w : vars_of(t <| (v,Var(w))#s)"
       
    68 by (induct_tac "t", auto)
       
    69 
       
    70 
       
    71 subsection{*Equality between Substitutions*}
       
    72 
       
    73 lemma subst_eq_iff: "r =$= s = (\<forall>t. t <| r = t <| s)"
       
    74 by (simp add: subst_eq_def)
       
    75 
       
    76 lemma subst_refl [iff]: "r =$= r"
       
    77 by (simp add: subst_eq_iff)
       
    78 
       
    79 lemma subst_sym: "r =$= s ==> s =$= r"
       
    80 by (simp add: subst_eq_iff)
       
    81 
       
    82 lemma subst_trans: "[| q =$= r; r =$= s |] ==> q =$= s"
       
    83 by (simp add: subst_eq_iff)
       
    84 
       
    85 lemma subst_subst2:
       
    86     "[| r =$= s; P (t <| r) (u <| r) |] ==> P (t <| s) (u <| s)"
       
    87 by (simp add: subst_eq_def)
       
    88 
       
    89 lemmas ssubst_subst2 = subst_sym [THEN subst_subst2]
       
    90 
       
    91 
       
    92 subsection{*Composition of Substitutions*}
       
    93 
       
    94 lemma [simp]: 
       
    95      "[] <> bl = bl"
       
    96      "((a,b)#al) <> bl = (a,b <| bl) # (al <> bl)"
       
    97      "sdom([]) = {}"
       
    98      "sdom((a,b)#al) = (if Var(a)=b then (sdom al) - {a} else sdom al Un {a})"
       
    99 by (simp_all add: comp_def sdom_def) 
       
   100 
       
   101 lemma comp_Nil [simp]: "s <> [] = s"
       
   102 by (induct "s", auto)
       
   103 
       
   104 lemma subst_comp_Nil: "s =$= s <> []"
       
   105 by simp
       
   106 
       
   107 lemma subst_comp [simp]: "(t <| r <> s) = (t <| r <| s)"
       
   108 apply (induct_tac "t")
       
   109 apply (simp_all (no_asm_simp))
       
   110 apply (induct "r", auto)
       
   111 done
       
   112 
       
   113 lemma comp_assoc: "(q <> r) <> s =$= q <> (r <> s)"
       
   114 apply (simp (no_asm) add: subst_eq_iff)
       
   115 done
       
   116 
       
   117 lemma subst_cong:
       
   118      "[| theta =$= theta1; sigma =$= sigma1|] 
       
   119       ==> (theta <> sigma) =$= (theta1 <> sigma1)"
       
   120 by (simp add: subst_eq_def)
       
   121 
       
   122 
       
   123 lemma Cons_trivial: "(w, Var(w) <| s) # s =$= s"
       
   124 apply (simp add: subst_eq_iff)
       
   125 apply (rule allI)
       
   126 apply (induct_tac "t", simp_all)
       
   127 done
       
   128 
       
   129 
       
   130 lemma comp_subst_subst: "q <> r =$= s ==>  t <| q <| r = t <| s"
       
   131 by (simp add: subst_eq_iff)
       
   132 
       
   133 
       
   134 subsection{*Domain and range of Substitutions*}
       
   135 
       
   136 lemma sdom_iff: "(v : sdom(s)) = (Var(v) <| s ~= Var(v))"
       
   137 apply (induct "s")
       
   138 apply (case_tac [2] a, auto)  
       
   139 done
       
   140 
       
   141 
       
   142 lemma srange_iff: 
       
   143    "v : srange(s) = (\<exists>w. w : sdom(s) & v : vars_of(Var(w) <| s))"
       
   144 by (auto simp add: srange_def)
       
   145 
       
   146 lemma empty_iff_all_not: "(A = {}) = (ALL a.~ a:A)"
       
   147 by (unfold empty_def, blast)
       
   148 
       
   149 lemma invariance: "(t <| s = t) = (sdom(s) Int vars_of(t) = {})"
       
   150 apply (induct_tac "t")
       
   151 apply (auto simp add: empty_iff_all_not sdom_iff)
       
   152 done
       
   153 
       
   154 lemma Var_in_srange [rule_format]:
       
   155      "v : sdom(s) -->  v : vars_of(t <| s) --> v : srange(s)"
       
   156 apply (induct_tac "t")
       
   157 apply (case_tac "a : sdom (s) ")
       
   158 apply (auto simp add: sdom_iff srange_iff)
       
   159 done
       
   160 
       
   161 lemma Var_elim: "[| v : sdom(s); v ~: srange(s) |] ==>  v ~: vars_of(t <| s)"
       
   162 by (blast intro: Var_in_srange)
       
   163 
       
   164 lemma Var_intro [rule_format]:
       
   165      "v : vars_of(t <| s) --> v : srange(s) | v : vars_of(t)"
       
   166 apply (induct_tac "t")
       
   167 apply (auto simp add: sdom_iff srange_iff)
       
   168 apply (rule_tac x=a in exI, auto) 
       
   169 done
       
   170 
       
   171 lemma srangeD [rule_format]:
       
   172      "v : srange(s) --> (\<exists>w. w : sdom(s) & v : vars_of(Var(w) <| s))"
       
   173 apply (simp (no_asm) add: srange_iff)
       
   174 done
       
   175 
       
   176 lemma dom_range_disjoint:
       
   177      "sdom(s) Int srange(s) = {} = (\<forall>t. sdom(s) Int vars_of(t <| s) = {})"
       
   178 apply (simp (no_asm) add: empty_iff_all_not)
       
   179 apply (force intro: Var_in_srange dest: srangeD)
       
   180 done
       
   181 
       
   182 lemma subst_not_empty: "~ u <| s = u ==> (\<exists>x. x : sdom(s))"
       
   183 by (auto simp add: empty_iff_all_not invariance)
       
   184 
       
   185 
       
   186 lemma id_subst_lemma [simp]: "(M <| [(x, Var x)]) = M"
       
   187 by (induct_tac "M", auto)
       
   188 
       
   189 
    40 end
   190 end