next up previous contents index
Next: Meta Level Up: System Predicates Previous: Rulebase

Control

!

  The dreaded cut. As usual, its use is not recommended. It is often more appropriate to use once/1.
fail

  Always fails.
true

  Always succeeds.
repeat

  Always succeeds, even on backtracking.
+B1 , +B2

  Logical conjunction.
+B1 ; +B2

  Logical disjunction. A cut inside one of these will behave very strangely. That is, it will behave as if the two sides of the ``;'' are separate rules. bsphackfloatpenalty -Mii floatpenalty-Miii parmoderrfloatpenalty@ nextcurrboxfreelist currbox-2floatpenalty@ fltovf currboxtempboxa tempboxa @floatesphackbsphackfloatpenalty -Mii floatpenalty-Miii parmoderrfloatpenalty@ nextcurrboxfreelist currbox-3floatpenalty@ fltovf currboxtempboxa tempboxa @floatesphack (Note that because ;/2 is currently implemented as a meta call it may sometimes not behave as if it was defined using an auxiliary predicate. This can occur if there is an arithmetic term that causes failure. The following short example illustrates the difference between try/3 and try1/3 for the goal ?- try(X, 1, 0),


try(X, Y, Z) :- X=Y/Z ; X=1.

try1(Y/Z,Y,Z). try1(1,Y,Z).


This may possibly change to be the same in some future version.) bsphackfloatpenalty -Mii floatpenalty-Miii parmoderrfloatpenalty@ nextcurrboxfreelist currbox-4floatpenalty@ fltovf currboxtempboxa tempboxa @floatesphack
+C -> +B1 ; +B2

  If C then call B1 otherwise call B2. Uses unsafe negation. Inefficient, since it uses call/1. A cut inside one of these will behave very strangely.



Alan Borning
Fri Oct 8 12:51:18 PDT 1999