Subst/unifier.ML
changeset 48 21291189b51e
parent 0 7949f97df77a
equal deleted inserted replaced
47:69d815b0e1eb 48:21291189b51e
    23 by (simp_tac (subst_ss addsimps [Unifier_iff]) 1);
    23 by (simp_tac (subst_ss addsimps [Unifier_iff]) 1);
    24 val Unifier_Comb = result() RS mp RS conjE;
    24 val Unifier_Comb = result() RS mp RS conjE;
    25 
    25 
    26 goal Unifier.thy
    26 goal Unifier.thy
    27   "~v : vars_of(t) --> ~v : vars_of(u) -->Unifier(s,t,u) --> \
    27   "~v : vars_of(t) --> ~v : vars_of(u) -->Unifier(s,t,u) --> \
    28 \  Unifier(Cons(<v,r>,s),t,u)";
    28 \  Unifier(<v,r>#s,t,u)";
    29 by (simp_tac (subst_ss addsimps [Unifier_iff,repl_invariance]) 1);
    29 by (simp_tac (subst_ss addsimps [Unifier_iff,repl_invariance]) 1);
    30 val Cons_Unifier = result() RS mp RS mp RS mp;
    30 val Cons_Unifier = result() RS mp RS mp RS mp;
    31 
    31 
    32 (**** Most General Unifiers ****)
    32 (**** Most General Unifiers ****)
    33 
    33 
    47 by (asm_simp_tac (subst_ss addsimps [subst_comp]) 1);
    47 by (asm_simp_tac (subst_ss addsimps [subst_comp]) 1);
    48 by (fast_tac (set_cs addIs [comp_Nil RS sym RS subst_refl]) 1);
    48 by (fast_tac (set_cs addIs [comp_Nil RS sym RS subst_refl]) 1);
    49 val MGU_iff = result();
    49 val MGU_iff = result();
    50 
    50 
    51 val [prem] = goal Unifier.thy
    51 val [prem] = goal Unifier.thy
    52      "~ Var(v) <: t ==> MGUnifier(Cons(<v,t>,Nil),Var(v),t)";
    52      "~ Var(v) <: t ==> MGUnifier(<v,t>#Nil,Var(v),t)";
    53 by (simp_tac (subst_ss addsimps [MGU_iff,MoreGen_iff,Unifier_iff]) 1);
    53 by (simp_tac (subst_ss addsimps [MGU_iff,MoreGen_iff,Unifier_iff]) 1);
    54 by (REPEAT_SOME (step_tac set_cs));
    54 by (REPEAT_SOME (step_tac set_cs));
    55 by (etac subst 1);
    55 by (etac subst 1);
    56 by (etac ssubst_subst2 2);
    56 by (etac ssubst_subst2 2);
    57 by (rtac (Cons_trivial RS subst_sym) 1);
    57 by (rtac (Cons_trivial RS subst_sym) 1);
    83 
    83 
    84 goal Unifier.thy "Idem(Nil)";
    84 goal Unifier.thy "Idem(Nil)";
    85 by (simp_tac (subst_ss addsimps [raw_Idem_iff,refl RS subst_refl]) 1);
    85 by (simp_tac (subst_ss addsimps [raw_Idem_iff,refl RS subst_refl]) 1);
    86 val Idem_Nil = result();
    86 val Idem_Nil = result();
    87 
    87 
    88 goal Unifier.thy "~ (Var(v) <: t) --> Idem(Cons(<v,t>,Nil))";
    88 goal Unifier.thy "~ (Var(v) <: t) --> Idem(<v,t>#Nil)";
    89 by (simp_tac (subst_ss addsimps [Var_subst,vars_iff_occseq,Idem_iff,srange_iff]
    89 by (simp_tac (subst_ss addsimps [Var_subst,vars_iff_occseq,Idem_iff,srange_iff]
    90                        setloop (split_tac [expand_if])) 1);
    90                        setloop (split_tac [expand_if])) 1);
    91 by (fast_tac set_cs 1);
    91 by (fast_tac set_cs 1);
    92 val Var_Idem = result() RS mp;
    92 val Var_Idem = result() RS mp;
    93 
    93 
   112 by (fast_tac (set_cs addEs [subst_subst2]) 1);
   112 by (fast_tac (set_cs addEs [subst_subst2]) 1);
   113 val lemma_lemma = result();
   113 val lemma_lemma = result();
   114 
   114 
   115 val prems = goal Unifier.thy 
   115 val prems = goal Unifier.thy 
   116     "x : sdom(s) -->  ~x : srange(s) --> \
   116     "x : sdom(s) -->  ~x : srange(s) --> \
   117 \   ~vars_of(Var(x) <| s<>Cons(<x,Var(x)>,s)) = \
   117 \   ~vars_of(Var(x) <| s<> <x,Var(x)>#s) = \
   118 \      vars_of(Var(x) <| Cons(<x,Var(x)>,s))";
   118 \      vars_of(Var(x) <| <x,Var(x)>#s)";
   119 by (simp_tac (subst_ss addsimps [not_equal_iff]) 1);
   119 by (simp_tac (subst_ss addsimps [not_equal_iff]) 1);
   120 by (REPEAT (resolve_tac [impI,disjI2] 1));
   120 by (REPEAT (resolve_tac [impI,disjI2] 1));
   121 by(res_inst_tac [("x","x")] exI 1);
   121 by(res_inst_tac [("x","x")] exI 1);
   122 br conjI 1;
   122 br conjI 1;
   123 by (asm_simp_tac (subst_ss addsimps [Var_elim,subst_comp,repl_invariance]) 1);
   123 by (asm_simp_tac (subst_ss addsimps [Var_elim,subst_comp,repl_invariance]) 1);
   139 by (simp_tac (set_ss addsimps prems) 1);
   139 by (simp_tac (set_ss addsimps prems) 1);
   140 val not_cong = result();
   140 val not_cong = result();
   141 
   141 
   142 val prems = goal Unifier.thy 
   142 val prems = goal Unifier.thy 
   143    "~w=x --> x : vars_of(Var(w) <| s) --> w : sdom(s) --> ~w : srange(s) --> \
   143    "~w=x --> x : vars_of(Var(w) <| s) --> w : sdom(s) --> ~w : srange(s) --> \
   144 \   ~vars_of(Var(w) <| s<>Cons(<x,Var(w)>,s)) = \
   144 \   ~vars_of(Var(w) <| s<> <x,Var(w)>#s) = \
   145 \   vars_of(Var(w) <| Cons(<x,Var(w)>,s))";
   145 \   vars_of(Var(w) <| <x,Var(w)>#s)";
   146 by (simp_tac (subst_ss addsimps [not_equal_iff]) 1);
   146 by (simp_tac (subst_ss addsimps [not_equal_iff]) 1);
   147 by (REPEAT (resolve_tac [impI,disjI1] 1));
   147 by (REPEAT (resolve_tac [impI,disjI1] 1));
   148 by(res_inst_tac [("x","w")] exI 1);
   148 by(res_inst_tac [("x","w")] exI 1);
   149 by (ALLGOALS (asm_simp_tac (subst_ss addsimps  [Var_elim,subst_comp,
   149 by (ALLGOALS (asm_simp_tac (subst_ss addsimps  [Var_elim,subst_comp,
   150                 vars_var_iff RS not_cong RS iffD2 RS repl_invariance]) ));
   150                 vars_var_iff RS not_cong RS iffD2 RS repl_invariance]) ));
   165 
   165 
   166 (*************** Correctness of a simple unification algorithm ***************)
   166 (*************** Correctness of a simple unification algorithm ***************)
   167 (*                                                                           *)
   167 (*                                                                           *)
   168 (*  fun unify Const(m) Const(n) = if m=n then Nil else Fail                  *)
   168 (*  fun unify Const(m) Const(n) = if m=n then Nil else Fail                  *)
   169 (*    | unify Const(m) _        = Fail                                       *)
   169 (*    | unify Const(m) _        = Fail                                       *)
   170 (*    | unify Var(v)   t        = if Var(v)<:t then Fail else Cons(<v,t>,Nil)*)
   170 (*    | unify Var(v)   t        = if Var(v)<:t then Fail else <v,t>#Nil      *)
   171 (*    | unify Comb(t,u) Const(n) = Fail                                      *)
   171 (*    | unify Comb(t,u) Const(n) = Fail                                      *)
   172 (*    | unify Comb(t,u) Var(v)  = if Var(v) <: Comb(t,u) then Fail           *)
   172 (*    | unify Comb(t,u) Var(v)  = if Var(v) <: Comb(t,u) then Fail           *)
   173 (*                                               else Cons(<v,Comb(t,u>,Nil) *)
   173 (*                                               else <v,Comb(t,u>#Nil       *)
   174 (*    | unify Comb(t,u) Comb(v,w) = let s = unify t v                        *)
   174 (*    | unify Comb(t,u) Comb(v,w) = let s = unify t v                        *)
   175 (*                                  in if s=Fail then Fail                   *)
   175 (*                                  in if s=Fail then Fail                   *)
   176 (*                                               else unify (u<|s) (w<|s);   *)
   176 (*                                               else unify (u<|s) (w<|s);   *)
   177 
   177 
   178 (**** Cases for the partial correctness of the algorithm ****)
   178 (**** Cases for the partial correctness of the algorithm ****)
   189 goal Unifier.thy "~m=n --> (ALL l.~Unifier(l,Const(m),Const(n)))";
   189 goal Unifier.thy "~m=n --> (ALL l.~Unifier(l,Const(m),Const(n)))";
   190 by (simp_tac (subst_ss addsimps[Unifier_iff]) 1);
   190 by (simp_tac (subst_ss addsimps[Unifier_iff]) 1);
   191 val Unify2 = result() RS mp;
   191 val Unify2 = result() RS mp;
   192 
   192 
   193 val [prem] = goalw Unifier.thy [MGIUnifier_def] 
   193 val [prem] = goalw Unifier.thy [MGIUnifier_def] 
   194  "~Var(v) <: t ==> MGIUnifier(Cons(<v,t>,Nil),Var(v),t)";
   194  "~Var(v) <: t ==> MGIUnifier(<v,t>#Nil,Var(v),t)";
   195 by (fast_tac (HOL_cs addSIs [prem RS MGUnifier_Var,prem RS Var_Idem]) 1);
   195 by (fast_tac (HOL_cs addSIs [prem RS MGUnifier_Var,prem RS Var_Idem]) 1);
   196 val Unify3 = result();
   196 val Unify3 = result();
   197 
   197 
   198 val [prem] = goal Unifier.thy "Var(v) <: t ==> (ALL l.~Unifier(l,Var(v),t))";
   198 val [prem] = goal Unifier.thy "Var(v) <: t ==> (ALL l.~Unifier(l,Var(v),t))";
   199 by (simp_tac (subst_ss addsimps
   199 by (simp_tac (subst_ss addsimps