-?->
at the beginning of the clause
body specifies that one-way matching should be used
instead of full unification in the clause head:
Using thep(f(X)) :- -?-> q(X).
?-
operator in the neck of the clause (instead of
:-
) is an alternative way of expressing the same, so the following
is equivalent to the above:
Pattern matching can be used for several purposes:p(f(X)) ?- q(X).
This predicate can be used to return the attribute of a given attributed variable and fail if it is not one.get_attr(X{A}, Attr) :- -?-> A = Attr.
but in this case it must not be called with its second argument already instantiated.:- mode get_attr(?, -). get_attr(X{A}, A) :- -?-> true.