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 |