Effect of ordering of subgoals in the definition of a predicate.
Consider the following TWO definitions of the predicate mult(X Y, Z), which evaluates
to true if and only if X * Y = Z.
Definition 1 :-
mult(0, X, 0).
mult(s(X), Y, Z) :- mult(X, Y, Z1), add(Y, Z1, Z).
add(0,X,X).
add(s(X),Y,s(Z)) :- add(X,Y,Z).
----
| ?- mult(X, Y, s(s(0))).
X = s(0)
Y = s(s(0)) ? ;
X = s(s(0))
Y = s(0) ? ;
Fatal Error: global stack overflow (size: 8193 Kb, environment variable used: GLOBALSZ)
///////
Definition 2 :-
mult(0, X, 0).
mult(s(X), Y, Z) :- add(Y, Z1, Z), mult(X, Y, Z1).
add(0,X,X).
add(s(X),Y,s(Z)) :- add(X,Y,Z).
----
| ?- mult(X, Y, s(s(0))).
Fatal Error: global stack overflow (size: 8193 Kb, environment variable used: GLOBALSZ)