-?->
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:
Matching clauses are not supported in dynamic clauses. A runtime error (calling an undefined procedure −?−>/1) will be raised when executing dynamic code that has a matching clause head.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.