| 39348 |      1 | (* ========================================================================= *)
 | 
|  |      2 | (* FIRST ORDER LOGIC SUBSTITUTIONS                                           *)
 | 
| 72004 |      3 | (* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
 | 
| 39348 |      4 | (* ========================================================================= *)
 | 
|  |      5 | 
 | 
|  |      6 | signature Subst =
 | 
|  |      7 | sig
 | 
|  |      8 | 
 | 
|  |      9 | (* ------------------------------------------------------------------------- *)
 | 
|  |     10 | (* A type of first order logic substitutions.                                *)
 | 
|  |     11 | (* ------------------------------------------------------------------------- *)
 | 
|  |     12 | 
 | 
|  |     13 | type subst
 | 
|  |     14 | 
 | 
|  |     15 | (* ------------------------------------------------------------------------- *)
 | 
|  |     16 | (* Basic operations.                                                         *)
 | 
|  |     17 | (* ------------------------------------------------------------------------- *)
 | 
|  |     18 | 
 | 
|  |     19 | val empty : subst
 | 
|  |     20 | 
 | 
|  |     21 | val null : subst -> bool
 | 
|  |     22 | 
 | 
|  |     23 | val size : subst -> int
 | 
|  |     24 | 
 | 
|  |     25 | val peek : subst -> Term.var -> Term.term option
 | 
|  |     26 | 
 | 
|  |     27 | val insert : subst -> Term.var * Term.term -> subst
 | 
|  |     28 | 
 | 
|  |     29 | val singleton : Term.var * Term.term -> subst
 | 
|  |     30 | 
 | 
|  |     31 | val toList : subst -> (Term.var * Term.term) list
 | 
|  |     32 | 
 | 
|  |     33 | val fromList : (Term.var * Term.term) list -> subst
 | 
|  |     34 | 
 | 
|  |     35 | val foldl : (Term.var * Term.term * 'a -> 'a) -> 'a -> subst -> 'a
 | 
|  |     36 | 
 | 
|  |     37 | val foldr : (Term.var * Term.term * 'a -> 'a) -> 'a -> subst -> 'a
 | 
|  |     38 | 
 | 
|  |     39 | val pp : subst Print.pp
 | 
|  |     40 | 
 | 
|  |     41 | val toString : subst -> string
 | 
|  |     42 | 
 | 
|  |     43 | (* ------------------------------------------------------------------------- *)
 | 
|  |     44 | (* Normalizing removes identity substitutions.                               *)
 | 
|  |     45 | (* ------------------------------------------------------------------------- *)
 | 
|  |     46 | 
 | 
|  |     47 | val normalize : subst -> subst
 | 
|  |     48 | 
 | 
|  |     49 | (* ------------------------------------------------------------------------- *)
 | 
|  |     50 | (* Applying a substitution to a first order logic term.                      *)
 | 
|  |     51 | (* ------------------------------------------------------------------------- *)
 | 
|  |     52 | 
 | 
|  |     53 | val subst : subst -> Term.term -> Term.term
 | 
|  |     54 | 
 | 
|  |     55 | (* ------------------------------------------------------------------------- *)
 | 
|  |     56 | (* Restricting a substitution to a smaller set of variables.                 *)
 | 
|  |     57 | (* ------------------------------------------------------------------------- *)
 | 
|  |     58 | 
 | 
|  |     59 | val restrict : subst -> NameSet.set -> subst
 | 
|  |     60 | 
 | 
|  |     61 | val remove : subst -> NameSet.set -> subst
 | 
|  |     62 | 
 | 
|  |     63 | (* ------------------------------------------------------------------------- *)
 | 
|  |     64 | (* Composing two substitutions so that the following identity holds:         *)
 | 
|  |     65 | (*                                                                           *)
 | 
|  |     66 | (* subst (compose sub1 sub2) tm = subst sub2 (subst sub1 tm)                 *)
 | 
|  |     67 | (* ------------------------------------------------------------------------- *)
 | 
|  |     68 | 
 | 
|  |     69 | val compose : subst -> subst -> subst
 | 
|  |     70 | 
 | 
|  |     71 | (* ------------------------------------------------------------------------- *)
 | 
|  |     72 | (* Creating the union of two compatible substitutions.                       *)
 | 
|  |     73 | (* ------------------------------------------------------------------------- *)
 | 
|  |     74 | 
 | 
|  |     75 | val union : subst -> subst -> subst  (* raises Error *)
 | 
|  |     76 | 
 | 
|  |     77 | (* ------------------------------------------------------------------------- *)
 | 
|  |     78 | (* Substitutions can be inverted iff they are renaming substitutions.        *)
 | 
|  |     79 | (* ------------------------------------------------------------------------- *)
 | 
|  |     80 | 
 | 
|  |     81 | val invert : subst -> subst  (* raises Error *)
 | 
|  |     82 | 
 | 
|  |     83 | val isRenaming : subst -> bool
 | 
|  |     84 | 
 | 
|  |     85 | (* ------------------------------------------------------------------------- *)
 | 
|  |     86 | (* Creating a substitution to freshen variables.                             *)
 | 
|  |     87 | (* ------------------------------------------------------------------------- *)
 | 
|  |     88 | 
 | 
|  |     89 | val freshVars : NameSet.set -> subst
 | 
|  |     90 | 
 | 
|  |     91 | (* ------------------------------------------------------------------------- *)
 | 
|  |     92 | (* Free variables.                                                           *)
 | 
|  |     93 | (* ------------------------------------------------------------------------- *)
 | 
|  |     94 | 
 | 
|  |     95 | val redexes : subst -> NameSet.set
 | 
|  |     96 | 
 | 
|  |     97 | val residueFreeVars : subst -> NameSet.set
 | 
|  |     98 | 
 | 
|  |     99 | val freeVars : subst -> NameSet.set
 | 
|  |    100 | 
 | 
|  |    101 | (* ------------------------------------------------------------------------- *)
 | 
|  |    102 | (* Functions.                                                                *)
 | 
|  |    103 | (* ------------------------------------------------------------------------- *)
 | 
|  |    104 | 
 | 
|  |    105 | val functions : subst -> NameAritySet.set
 | 
|  |    106 | 
 | 
|  |    107 | (* ------------------------------------------------------------------------- *)
 | 
|  |    108 | (* Matching for first order logic terms.                                     *)
 | 
|  |    109 | (* ------------------------------------------------------------------------- *)
 | 
|  |    110 | 
 | 
|  |    111 | val match : subst -> Term.term -> Term.term -> subst  (* raises Error *)
 | 
|  |    112 | 
 | 
|  |    113 | (* ------------------------------------------------------------------------- *)
 | 
|  |    114 | (* Unification for first order logic terms.                                  *)
 | 
|  |    115 | (* ------------------------------------------------------------------------- *)
 | 
|  |    116 | 
 | 
|  |    117 | val unify : subst -> Term.term -> Term.term -> subst  (* raises Error *)
 | 
|  |    118 | 
 | 
|  |    119 | end
 |