% Auswertung eines arithmetischen Ausdrucks
% mit Fehlschlagen bei Division durch 0:

arith(E, E) :-
    number(E).
arith(X, E1 + E2) :-
    arith(X1, E1),
    arith(X2, E2),
    X is X1 + X2.
arith(X, E1 - E2) :-
    arith(X1, E1),
    arith(X2, E2),
    X is X1 - X2.
arith(X, E1 * E2) :-
    arith(X1, E1),
    arith(X2, E2),
    X is X1 * X2.
arith(X, E1 / E2) :-
    arith(X1, E1),
    arith(X2, E2),
    E2 \= 0,
    X is X1 / X2.

% Version mit Test auf ungebundene Variablen:

arith2(E, E) :-
    number(E).
arith2(X, E) :-
    nonvar(E),
    E = E1 + E2,
    arith2(X1, E1),
    arith2(X2, E2),
    X is X1 + X2.
arith2(X, E) :-
    nonvar(E),
    E = E1 - E2,
    arith2(X1, E1),
    arith2(X2, E2),
    X is X1 - X2.
arith2(X, E) :-
    nonvar(E),
    E = E1 * E2,
    arith2(X1, E1),
    arith2(X2, E2),
    X is X1 * X2.
arith2(X, E) :-
    nonvar(E),
    E = E1 / E2,
    arith2(X1, E1),
    arith2(X2, E2),
    E2 \= 0,
    X is X1 / X2.

