Subst/unifier.ML
author clasohm
Wed, 02 Mar 1994 12:26:55 +0100
changeset 48 21291189b51e
parent 0 7949f97df77a
permissions -rw-r--r--
changed "." to "$" and Cons to infix "#" to eliminate ambiguity
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	Substitutions/unifier.ML
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     2
    Author: 	Martin Coen, Cambridge University Computer Laboratory
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     3
    Copyright   1993  University of Cambridge
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     4
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
For unifier.thy.
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     6
Properties of unifiers.
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     7
Cases for partial correctness of algorithm and conditions for termination.
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     8
*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     9
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    10
open Unifier;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    11
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    12
val unify_defs =
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    13
    [Idem_def,Unifier_def,MoreGeneral_def,MGUnifier_def,MGIUnifier_def];
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    14
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    15
(**** Unifiers ****)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    16
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    17
goalw Unifier.thy [Unifier_def] "Unifier(s,t,u) = (t <| s = u <| s)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    18
by (rtac refl 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    19
val Unifier_iff = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    20
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    21
goal Unifier.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    22
    "Unifier(s,Comb(t,u),Comb(v,w)) --> Unifier(s,t,v) & Unifier(s,u,w)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    23
by (simp_tac (subst_ss addsimps [Unifier_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    24
val Unifier_Comb = result() RS mp RS conjE;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    25
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    26
goal Unifier.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    27
  "~v : vars_of(t) --> ~v : vars_of(u) -->Unifier(s,t,u) --> \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    28
\  Unifier(<v,r>#s,t,u)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    29
by (simp_tac (subst_ss addsimps [Unifier_iff,repl_invariance]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    30
val Cons_Unifier = result() RS mp RS mp RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    31
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    32
(**** Most General Unifiers ****)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    33
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    34
goalw Unifier.thy [MoreGeneral_def]  "r >> s = (EX q. s =s= r <> q)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    35
by (rtac refl 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    36
val MoreGen_iff = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    37
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    38
goal Unifier.thy  "Nil >> s";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    39
by (simp_tac (subst_ss addsimps [MoreGen_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    40
by (fast_tac (set_cs addIs [refl RS subst_refl]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    41
val MoreGen_Nil = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    42
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    43
goalw Unifier.thy unify_defs
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    44
    "MGUnifier(s,t,u) = (ALL r.Unifier(r,t,u) = s >> r)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    45
by (REPEAT (ares_tac [iffI,allI] 1 ORELSE 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    46
            eresolve_tac [conjE,allE,mp,exE,ssubst_subst2] 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    47
by (asm_simp_tac (subst_ss addsimps [subst_comp]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    48
by (fast_tac (set_cs addIs [comp_Nil RS sym RS subst_refl]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    49
val MGU_iff = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    50
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    51
val [prem] = goal Unifier.thy
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    52
     "~ Var(v) <: t ==> MGUnifier(<v,t>#Nil,Var(v),t)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    53
by (simp_tac (subst_ss addsimps [MGU_iff,MoreGen_iff,Unifier_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    54
by (REPEAT_SOME (step_tac set_cs));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    55
by (etac subst 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    56
by (etac ssubst_subst2 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    57
by (rtac (Cons_trivial RS subst_sym) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    58
by (simp_tac (subst_ss addsimps [prem RS Var_not_occs,Var_subst]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    59
val MGUnifier_Var = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    60
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    61
(**** Most General Idempotent Unifiers ****)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    62
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    63
goal Unifier.thy "r <> r =s= r --> s =s= r <> q --> r <> s =s= s";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    64
by (simp_tac (subst_ss addsimps [subst_eq_iff,subst_comp]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    65
val MGIU_iff_lemma = result() RS mp RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    66
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    67
goalw Unifier.thy unify_defs
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    68
 "MGIUnifier(s,t,u) = \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    69
\  (Idem(s) & Unifier(s,t,u) & (ALL r.Unifier(r,t,u) --> s<>r=s=r))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    70
by (fast_tac (set_cs addEs [subst_sym,MGIU_iff_lemma]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    71
val MGIU_iff = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    72
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    73
(**** Idempotence ****)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    74
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    75
goalw Unifier.thy unify_defs "Idem(s) = (s <> s =s= s)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    76
by (rtac refl 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    77
val raw_Idem_iff = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    78
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    79
goal Unifier.thy "Idem(s) = (sdom(s) Int srange(s) = {})";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    80
by (simp_tac (subst_ss addsimps [raw_Idem_iff,subst_eq_iff,subst_comp,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    81
                                invariance,dom_range_disjoint])1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    82
val Idem_iff = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    83
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    84
goal Unifier.thy "Idem(Nil)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    85
by (simp_tac (subst_ss addsimps [raw_Idem_iff,refl RS subst_refl]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    86
val Idem_Nil = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    87
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    88
goal Unifier.thy "~ (Var(v) <: t) --> Idem(<v,t>#Nil)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    89
by (simp_tac (subst_ss addsimps [Var_subst,vars_iff_occseq,Idem_iff,srange_iff]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    90
                       setloop (split_tac [expand_if])) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    91
by (fast_tac set_cs 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    92
val Var_Idem = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    93
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    94
val [prem] = goalw Unifier.thy [Idem_def]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    95
     "Idem(r) ==>  Unifier(s,t <| r,u <| r) --> Unifier(r <> s,t <| r,u <| r)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    96
by (simp_tac (subst_ss addsimps 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    97
	      [Unifier_iff,subst_comp,prem RS comp_subst_subst]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    98
val Unifier_Idem_subst = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    99
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   100
val [prem] = goal Unifier.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   101
     "r <> s =s= s ==>  Unifier(s,t,u) --> Unifier(s,t <| r,u <| r)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   102
by (simp_tac (subst_ss addsimps 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   103
	      [Unifier_iff,subst_comp,prem RS comp_subst_subst]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   104
val Unifier_comp_subst = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   105
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   106
(*** The domain of a MGIU is a subset of the variables in the terms ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   107
(***      NB this and one for range are only needed for termination ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   108
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   109
val [prem] = goal Unifier.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   110
    "~ vars_of(Var(x) <| r) = vars_of(Var(x) <| s) ==> ~r =s= s";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   111
by (rtac (prem RS contrapos) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   112
by (fast_tac (set_cs addEs [subst_subst2]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   113
val lemma_lemma = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   114
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   115
val prems = goal Unifier.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   116
    "x : sdom(s) -->  ~x : srange(s) --> \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   117
\   ~vars_of(Var(x) <| s<> <x,Var(x)>#s) = \
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   118
\      vars_of(Var(x) <| <x,Var(x)>#s)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   119
by (simp_tac (subst_ss addsimps [not_equal_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   120
by (REPEAT (resolve_tac [impI,disjI2] 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   121
by(res_inst_tac [("x","x")] exI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   122
br conjI 1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   123
by (asm_simp_tac (subst_ss addsimps [Var_elim,subst_comp,repl_invariance]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   124
by (asm_simp_tac (subst_ss addsimps [Var_subst]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   125
val MGIU_sdom_lemma = result() RS mp RS mp RS lemma_lemma RS notE;;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   126
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   127
goal Unifier.thy "MGIUnifier(s,t,u) --> sdom(s) <= vars_of(t) Un vars_of(u)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   128
by (subgoal_tac "! P Q.(P | Q) = (~( ~P & ~Q))" 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   129
by (asm_simp_tac (subst_ss addsimps [MGIU_iff,Idem_iff,subset_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   130
by (safe_tac set_cs);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   131
by (eresolve_tac ([spec] RL [impE]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   132
by (rtac Cons_Unifier 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   133
by (ALLGOALS (fast_tac (set_cs addIs [Cons_Unifier,MGIU_sdom_lemma])));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   134
val MGIU_sdom = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   135
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   136
(*** The range of a MGIU is a subset of the variables in the terms ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   137
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   138
val prems = goal HOL.thy  "P = Q ==> (~P) = (~Q)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   139
by (simp_tac (set_ss addsimps prems) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   140
val not_cong = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   141
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   142
val prems = goal Unifier.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   143
   "~w=x --> x : vars_of(Var(w) <| s) --> w : sdom(s) --> ~w : srange(s) --> \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   144
\   ~vars_of(Var(w) <| s<> <x,Var(w)>#s) = \
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   145
\   vars_of(Var(w) <| <x,Var(w)>#s)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   146
by (simp_tac (subst_ss addsimps [not_equal_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   147
by (REPEAT (resolve_tac [impI,disjI1] 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   148
by(res_inst_tac [("x","w")] exI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   149
by (ALLGOALS (asm_simp_tac (subst_ss addsimps  [Var_elim,subst_comp,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   150
                vars_var_iff RS not_cong RS iffD2 RS repl_invariance]) ));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   151
by (fast_tac (set_cs addIs [Var_in_subst]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   152
val MGIU_srange_lemma =result() RS mp RS mp RS mp RS mp RS lemma_lemma RS notE;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   153
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   154
goal Unifier.thy "MGIUnifier(s,t,u) --> srange(s) <= vars_of(t) Un vars_of(u)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   155
by (subgoal_tac "! P Q.(P | Q) = (~( ~P & ~Q))" 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   156
by (asm_simp_tac (subst_ss addsimps [MGIU_iff,srange_iff,subset_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   157
by (simp_tac (subst_ss addsimps [Idem_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   158
by (safe_tac set_cs);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   159
by (eresolve_tac ([spec] RL [impE]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   160
by (rtac Cons_Unifier 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   161
by (imp_excluded_middle_tac "w=ta" 4);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   162
by (fast_tac (set_cs addEs [MGIU_srange_lemma]) 5);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   163
by (ALLGOALS (fast_tac (set_cs addIs [Var_elim2])));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   164
val MGIU_srange = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   165
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   166
(*************** Correctness of a simple unification algorithm ***************)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   167
(*                                                                           *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   168
(*  fun unify Const(m) Const(n) = if m=n then Nil else Fail                  *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   169
(*    | unify Const(m) _        = Fail                                       *)
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   170
(*    | unify Var(v)   t        = if Var(v)<:t then Fail else <v,t>#Nil      *)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   171
(*    | unify Comb(t,u) Const(n) = Fail                                      *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   172
(*    | unify Comb(t,u) Var(v)  = if Var(v) <: Comb(t,u) then Fail           *)
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   173
(*                                               else <v,Comb(t,u>#Nil       *)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   174
(*    | unify Comb(t,u) Comb(v,w) = let s = unify t v                        *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   175
(*                                  in if s=Fail then Fail                   *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   176
(*                                               else unify (u<|s) (w<|s);   *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   177
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   178
(**** Cases for the partial correctness of the algorithm ****)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   179
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   180
goalw Unifier.thy unify_defs "MGIUnifier(s,t,u) = MGIUnifier(s,u,t)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   181
by (safe_tac (HOL_cs addSEs ([sym]@([spec] RL [mp]))));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   182
val Unify_comm = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   183
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   184
goal Unifier.thy "MGIUnifier(Nil,Const(n),Const(n))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   185
by (simp_tac (subst_ss addsimps
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   186
	      [MGIU_iff,MGU_iff,Unifier_iff,subst_eq_iff,Idem_Nil]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   187
val Unify1 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   188
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   189
goal Unifier.thy "~m=n --> (ALL l.~Unifier(l,Const(m),Const(n)))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   190
by (simp_tac (subst_ss addsimps[Unifier_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   191
val Unify2 = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   192
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   193
val [prem] = goalw Unifier.thy [MGIUnifier_def] 
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   194
 "~Var(v) <: t ==> MGIUnifier(<v,t>#Nil,Var(v),t)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   195
by (fast_tac (HOL_cs addSIs [prem RS MGUnifier_Var,prem RS Var_Idem]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   196
val Unify3 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   197
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   198
val [prem] = goal Unifier.thy "Var(v) <: t ==> (ALL l.~Unifier(l,Var(v),t))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   199
by (simp_tac (subst_ss addsimps
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   200
	      [Unifier_iff,prem RS subst_mono RS occs_irrefl2]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   201
val Unify4 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   202
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   203
goal Unifier.thy "ALL l.~Unifier(l,Const(m),Comb(t,u))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   204
by (simp_tac (subst_ss addsimps [Unifier_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   205
val Unify5 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   206
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   207
goal Unifier.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   208
    "(ALL l.~Unifier(l,t,v)) --> (ALL l.~Unifier(l,Comb(t,u),Comb(v,w)))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   209
by (simp_tac (subst_ss addsimps [Unifier_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   210
val Unify6 = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   211
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   212
goal Unifier.thy "MGIUnifier(s,t,v) --> (ALL l.~Unifier(l,u <| s,w <| s)) --> \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   213
\                                     (ALL l.~Unifier(l,Comb(t,u),Comb(v,w)))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   214
by (simp_tac (subst_ss addsimps [MGIU_iff]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   215
by (fast_tac (set_cs addIs [Unifier_comp_subst] addSEs [Unifier_Comb]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   216
val Unify7 = result() RS mp RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   217
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   218
val [p1,p2,p3] = goal Unifier.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   219
     "[| Idem(r); Unifier(s,t <| r,u <| r); \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   220
\     (! q.Unifier(q,t <| r,u <| r) --> s <> q =s= q) |] ==> \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   221
\     Idem(r <> s)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   222
by (cut_facts_tac [p1,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   223
		   p2 RS (p1 RS Unifier_Idem_subst RS (p3 RS spec RS mp))] 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   224
by (REPEAT_SOME (etac rev_mp));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   225
by (simp_tac (subst_ss addsimps [raw_Idem_iff,subst_eq_iff,subst_comp]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   226
val Unify8_lemma1 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   227
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   228
val [p1,p2,p3,p4] = goal Unifier.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   229
   "[| Unifier(q,t,v); Unifier(q,u,w); (! q.Unifier(q,t,v) --> r <> q =s= q); \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   230
\      (! q.Unifier(q,u <| r,w <| r) --> s <> q =s= q) |] ==> \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   231
\   r <> s <> q =s= q";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   232
val pp = p1 RS (p3 RS spec RS mp);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   233
by (cut_facts_tac [pp,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   234
		   p2 RS (pp RS Unifier_comp_subst) RS (p4 RS spec RS mp)] 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   235
by (REPEAT_SOME (etac rev_mp));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   236
by (simp_tac (subst_ss addsimps [subst_eq_iff,subst_comp]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   237
val Unify8_lemma2 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   238
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   239
goal Unifier.thy  "MGIUnifier(r,t,v) -->  MGIUnifier(s,u <| r,w <| r) --> \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   240
\                MGIUnifier(r <> s,Comb(t,u),Comb(v,w))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   241
by (simp_tac (subst_ss addsimps [MGIU_iff,subst_comp,comp_assoc]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   242
by (safe_tac HOL_cs);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   243
by (REPEAT (etac rev_mp 2));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   244
by (simp_tac (subst_ss addsimps 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   245
	      [Unifier_iff,MGIU_iff,subst_comp,comp_assoc]) 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   246
by (ALLGOALS (fast_tac (set_cs addEs 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   247
			[Unifier_Comb,Unify8_lemma1,Unify8_lemma2])));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   248
val Unify8 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   249
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   250
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   251
(********************** Termination of the algorithm *************************)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   252
(*                                                                           *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   253
(*UWFD is a well-founded relation that orders the 2 recursive calls in unify *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   254
(*                   NB well-foundedness of UWFD isn't proved                *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   255
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   256
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   257
goalw Unifier.thy [UWFD_def]  "UWFD(t,t',Comb(t,u),Comb(t',u'))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   258
by (simp_tac subst_ss 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   259
by (fast_tac set_cs 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   260
val UnifyWFD1 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   261
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   262
val [prem] = goal Unifier.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   263
     "MGIUnifier(s,t,t') ==> vars_of(u <| s) Un vars_of(u' <| s) <= \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   264
\                            vars_of(Comb(t,u)) Un vars_of(Comb(t',u'))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   265
by (subgoal_tac "vars_of(u <| s) Un vars_of(u' <| s) <= \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   266
\                srange(s) Un vars_of(u) Un srange(s) Un vars_of(u')" 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   267
by (etac subset_trans 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   268
by (ALLGOALS (simp_tac (subst_ss addsimps [Var_intro,subset_iff])));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   269
by (ALLGOALS (fast_tac (set_cs addDs 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   270
			[Var_intro,prem RS MGIU_srange RS subsetD])));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   271
val UWFD2_lemma1 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   272
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   273
val [major,minor] = goal Unifier.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   274
     "[| MGIUnifier(s,t,t');  ~ u <| s = u |] ==> \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   275
\     ~ vars_of(u <| s) Un vars_of(u' <| s) =  \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   276
\         (vars_of(t) Un vars_of(u)) Un (vars_of(t') Un vars_of(u'))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   277
by (cut_facts_tac 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   278
    [major RS (MGIU_iff RS iffD1) RS conjunct1 RS (Idem_iff RS iffD1)] 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   279
by (rtac (minor RS subst_not_empty RS exE) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   280
by (rtac (make_elim ((major RS MGIU_sdom) RS subsetD)) 1 THEN assume_tac 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   281
by (rtac (disjI2 RS (not_equal_iff RS iffD2)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   282
by (REPEAT (etac rev_mp 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   283
by (asm_simp_tac subst_ss 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   284
by (fast_tac (set_cs addIs [Var_elim2]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   285
val UWFD2_lemma2 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   286
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   287
val [prem] = goalw Unifier.thy [UWFD_def]  
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   288
  "MGIUnifier(s,t,t') ==> UWFD(u <| s,u' <| s,Comb(t,u),Comb(t',u'))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   289
by (cut_facts_tac 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   290
    [prem RS UWFD2_lemma1 RS (subseteq_iff_subset_eq RS iffD1)] 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   291
by (imp_excluded_middle_tac "u <| s = u" 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   292
by (simp_tac (set_ss addsimps [occs_Comb2] ) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   293
by (rtac impI 1 THEN etac subst 1 THEN assume_tac 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   294
by (rtac impI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   295
by (rtac (conjI RS (ssubset_iff RS iffD2) RS disjI1) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   296
by (asm_simp_tac (set_ss addsimps [subseteq_iff_subset_eq]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   297
by (asm_simp_tac subst_ss 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   298
by (fast_tac (set_cs addDs [prem RS UWFD2_lemma2]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   299
val UnifyWFD2 = result();