For Programmers: Free Programming Magazines  


Home > Archive > Prolog > October 2004 > Re: Unifying with partially ground terms without unifying with









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Re: Unifying with partially ground terms without unifying with
Djame Seddah

2004-10-22, 8:56 am

Robert Oschler wrote:
>
> I have a program where I want to take certain action on various list items,
> if certain elements match a certain predicate name only.
>
> For example, given the list:
>
> [Var1, op(SubVar1), Var2, ...]
>
> I have a predicate that 'walks' the list and only manipulates the term if it
> is a op() predicate element. To do this I wrote the following predicate:
>
> % Determine if an element is an op() predicate without unifying with
> unground variables.
> is_op_term(OpTerm, Innards):-
> OpTerm =.. [X | Args],
> ground(X),
> X = op,
> Innards =.. Args,
> !.
>
> This works fine but it I wonder if there is a more elegant way to do this.
> The problem with attempting to handle the op() predicate elements with a
> clause like:
>
> do_op([op(X) | T]):- % etc.
>
> Is that the head of the list in the clause will unify with completely
> unground variables, which is what I don't want. I only want grounded or
> partially grounded variables that are currently instantiated to an op()
> term.
>
> I tried using 'not', hoping to test the element without unifying with it,
> but ended up with a control error:
>
> do_op([H | T]):-
> not (H = op(X)),
> !,
> ... % etc.
>
> So what's a better way to do this?


if you want to check if two variables unify without unification been
made
try this

\+ \+ X = Y

double negation (seen in nlp in prolog by shieber and perreira)


Have fun


Djamé
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com