| 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é
|