 
 
 
-?-> at the beginning of the clause
body specifies that one-way matching should be used
instead of full unification in the clause head:
p(f(X)) :-
    -?->
    q(X).
Using the ?- 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:
p(f(X)) ?-
    q(X).
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.
get_attr(X{A}, Attr) :-
    -?->
    A = Attr.
This predicate can be used to return the attribute of a given
attributed variable and fail if it is not one.
:- mode get_attr(?, -).
get_attr(X{A}, A) :-
    -?->
    true.
but in this case it must not be called with its second argument
already instantiated. 
 
