[Haskell-cafe] embedding prolog in haskell.

Fergus Henderson fjh-mailbox-24 at galois.com
Wed Aug 31 20:09:27 EDT 2005

On 18-Aug-2005, Keean Schupke <k.schupke at imperial.ac.uk> wrote:
> I was wondering if anyone has any comments on my 
> implementation of unify? For example can the algorithm be simplified 
> from my nieve attempt? Most importantly is it correct?
>    type Subst = [(Vname,Term)]
>    data Term = Func Fname [Term] | Var Vname deriving (Eq,Show)
>    type Fname = String
>    data Vname = Name String | Auto Integer deriving (Eq,Show)
>    unify :: Subst -> (Term,Term) -> [Subst]
>    unify s (t,u) | t == u = [s]

You should delete the line above.  It's not needed and could cause serious
efficiency problems.  With that line present, unifying two lists
of length N which differ only in the last element would take time
proportional to N squared, but without it, the time should be linear in N.

>    unify s (Var x,t) = [(x,t):s] -- no occurs check
>    unify s (t,Var x) = [(x,t):s] -- no occurs check

These are not right; you need to look up the variable x
in the substitution s, and if it is already bound, then
you need to unify what it is bound to with the term t.

Fergus J. Henderson                 |  "I have always known that the pursuit
Galois Connections, Inc.            |  of excellence is a lethal habit"
Phone: +1 503 626 6616              |     -- the last words of T. S. Garp.

More information about the Haskell-Cafe mailing list