The predicates of this section implement control structures. Normally the constructs in this section, except for repeat/0, are translated by the compiler. Please note that complex goals passed as arguments to meta-predicates such as findall/3 below cause the goal to be compiled to a temporary location before execution. It is faster to define a sub-predicate (i.e. one_character_atom/1 in the example below) and make a call to this simple predicate.
one_character_atoms(As) :- findall(A, (current_atom(A), atom_length(A, 1)), As).
t1 :- (a, !, fail ; b). | % cuts a/0 and t1/0 |
t2 :- (a -> b, ! ; c). | % cuts b/0 and t2/0 |
t3 :- call((a, !, fail ; b)). | % cuts a/0 |
t4 :- | % cuts a/0 |
Goal1, Goal2 :- Goal1, Goal2.
Goal1 ; _Goal2 :- Goal1. _Goal1 ; Goal2 :- Goal2.
If -> Then; _Else :- If, !, Then. If -> _Then; Else :- !, Else. If -> Then :- If, !, Then.
Please note that (If ->
Then) acts as (If ->
Then ;
fail), making the construct fail if the condition fails.
This unusual semantics is part of the ISO and all de-facto Prolog
standards.
\+
Condition, Else).
In other words, If
Condition succeeds at least once, simply behave as the
conjunction of Condition and Action, otherwise
execute Else.
The construct A *->
B, i.e. without
an
Else branch, is translated as the normal conjunction A,
B.bugThe decompiler
implemented by clause/2
returns this construct as a normal conjunction too.
+
refers to provable and the backslash (\
)
is normally used to indicate negation in Prolog).