# HG changeset patch # User desharna # Date 1656528089 -7200 # Node ID aaa22adef0399943944278419b66e7cf6dcdb56a # Parent 66a9aa769d632b06a98f917ae983206ae5707636 added lemmas domain_comp and unify_gives_minimal_domain diff -r 66a9aa769d63 -r aaa22adef039 src/HOL/ex/Unification.thy --- a/src/HOL/ex/Unification.thy Wed Jun 29 15:36:19 2022 +0200 +++ b/src/HOL/ex/Unification.thy Wed Jun 29 20:41:29 2022 +0200 @@ -145,6 +145,9 @@ lemma vars_of_subst_conv_Union: "vars_of (t \ \) = \(vars_of ` (\x. Var x \ \) ` vars_of t)" by (induction t) simp_all +lemma domain_comp: "fst ` set (\ \ \) = fst ` (set \ \ set \)" + by (induction \ \ rule: comp.induct) auto + subsection \Unifiers and Most General Unifiers\ definition Unifier :: "'a subst \ 'a trm \ 'a trm \ bool" @@ -639,6 +642,67 @@ by auto qed +theorem unify_gives_minimal_domain: + "unify M N = Some \ \ fst ` set \ \ vars_of M \ vars_of N" +proof (induct M N arbitrary: \ rule: unify.induct) + case (1 c M N) + thus ?case + by simp +next + case (2 M N c) + thus ?case + by simp +next + case (3 c v) + hence "\ = [(v, Const c)]" + by simp + thus ?case + by (simp add: dom_def) +next + case (4 M N v) + hence "\ = [(v, M \ N)]" + by (metis option.distinct(1) option.inject unify.simps(4)) + thus ?case + by (simp add: dom_def) +next + case (5 v M) + hence "\ = [(v, M)]" + by (metis option.distinct(1) option.inject unify.simps(5)) + thus ?case + by (simp add: dom_def) +next + case (6 c d) + then show ?case + by (cases "c = d") simp_all +next + case (7 M N M' N') + from "7.prems" obtain \\<^sub>1 \\<^sub>2 where + "unify M M' = Some \\<^sub>1" and "unify (N \ \\<^sub>1) (N' \ \\<^sub>1) = Some \\<^sub>2" and "\ = \\<^sub>1 \ \\<^sub>2" + apply simp + by (metis (no_types, lifting) option.case_eq_if option.collapse option.discI option.sel) + + from "7.hyps"(1) have dom_\\<^sub>1: "fst ` set \\<^sub>1 \ vars_of M \ vars_of M'" + using \unify M M' = Some \\<^sub>1\ by simp + + from "7.hyps"(2) have "fst ` set \\<^sub>2 \ vars_of (N \ \\<^sub>1) \ vars_of (N' \ \\<^sub>1)" + using \unify M M' = Some \\<^sub>1\ \unify (N \ \\<^sub>1) (N' \ \\<^sub>1) = Some \\<^sub>2\ by simp + hence dom_\\<^sub>2': "fst ` set \\<^sub>2 \ vars_of N \ vars_of N' \ range_vars \\<^sub>1" + using vars_of_subst_subset[of _ \\<^sub>1] by auto + + have "fst ` set \ = fst ` set (\\<^sub>1 \ \\<^sub>2)" + unfolding \\ = \\<^sub>1 \ \\<^sub>2\ by simp + also have "... = fst ` set \\<^sub>1 \ fst ` set \\<^sub>2" + by (auto simp: domain_comp) + also have "... \ vars_of M \ vars_of M' \ fst ` set \\<^sub>2" + using dom_\\<^sub>1 by (auto simp: dom_map_of_conv_image_fst) + also have "... \ vars_of M \ vars_of M' \ vars_of N \ vars_of N' \ range_vars \\<^sub>1" + using dom_\\<^sub>2' by (auto simp: dom_map_of_conv_image_fst) + also have "... \ vars_of M \ vars_of M' \ vars_of N \ vars_of N'" + using unify_gives_minimal_range[OF \unify M M' = Some \\<^sub>1\] by auto + finally show ?case + by auto +qed + subsection \Idempotent Most General Unifier\