DEC-10 Prolog, C-Prolog, and Quintus Prolog all provide an "is-not-provable"
operator \+. The meaning of
\+ Goal
is that the Prolog system is unable to find any solution for Goal as it currently stands.
In operational terms, we have
\+ Goal :-
( call(Goal) -> fail
; true
).
In DEC-10 Prolog and C-Prolog, this is exactly how \+ is implemented.
In Quintus Prolog there is a slight difference: the Quintus Prolog
compiler supports (if -> then ; else) directly, so a clause of the form
p :-
q,
\+ r,
s.
is compiled as if you had written
p :-
q,
( r -> fail ; true ),
s.
If \+ were not known to the compiler, the form r would be built as a
data structure and passed to \+ to interpret, which would be slower
and would require more memory. The extra efficiency of having \+
handled directly by the compiler is well worth having.