Αριθμητική με αναδρομή
Με βάση τον αναδρομικό ορισμό των φυσικών αριθμών μπορούμε να τους ορίσουμε
αξιωματικά και στην Prolog.
Ορίζουμε τον όρο s(X) να παριστάνει τον επόμενο φυσικό αριθμό από το X.
Έτσι, ορίζοντας το 0 το 1 είναι s(0), το 2 είναι s(s(0)), κ.λπ.
Ο κανόνας nat ορίζει τους φυσικούς αριθμούς.
Μπορούμε με επαγωγή να αποδείξουμε πως
όλοι οι φυσικοί παράγονται και αναγνωρίζονται από τον nat.
nat(0).
nat(s(X)) :-
nat(X).
?- nat(0).
yes
?- nat(s(0)).
yes
?- nat(s(s(s(s(0))))).
yes
?- nat(X).
X = 0 ->;
X = s(0) ->;
X = s(s(0)) ->;
X = s(s(s(0))) ->;
X = s(s(s(s(0)))) ->
X = s(s(s(s(s(0))))) ->;
X = s(s(s(s(s(s(0)))))) ->;
X = s(s(s(s(s(s(s(0))))))) ->;
X = s(s(s(s(s(s(s(s(0)))))))) ->;
X = s(s(s(s(s(s(s(s(s(0))))))))) ->;
X = s(s(s(s(s(s(s(s(s(s(0)))))))))) ->
...
Με βάση τον ορισμό αυτό μπορούμε να ορίσουμε μια σχέση διάταξης:
less(0, X) :-
nat(X).
less(s(X), s(Y)) :-
less(X, Y).
?- less(s(0), 0).
no
?- less(s(0), s(s(0))).
yes
?- less(X, s(s(s(s(0))))).
X = 0 ->;
X = s(0) ->;
X = s(s(0)) ->;
X = s(s(s(0))) ->;
X = s(s(s(s(0)))) ->;
no
Με παρόμοιο τρόπο μπορούμε να ορίσουμε και την πρόσθεση:
plus(0, X, X) :-
nat(X).
plus(s(X), Y, s(Z)) :-
plus(X, Y, Z).
Είναι αξιοσημείωτο πως το κατηγόρημα της πρόσθεσης με τη μορφή που
έχει οριστεί μπορεί να υπολογίσει άθροισμα, διαφορά, όρους που
δημιουργούν ένα άθροισμα, ή να ελέγξει αν ένα άθροισμα είναι αληθές:
?- plus(s(0), s(0), X).
X = s(s(0))
yes
?- plus(s(0), X, s(s(s(0)))).
X = s(s(0))
yes
?- plus(X, Y, s(s(0))).
X = 0
Y = s(s(0)) ->;
X = s(0)
Y = s(0) ->;
X = s(s(0))
Y = 0 ->;
no
?- plus(s(0), 0, 0).
no
Με τη χρήση του αθροίσματος μπορούμε να ορίσουμε και το γινόμενο:
times(0, X, 0)
times(s(X), Y, Z) :-
times(X, Y, W),
plus(W, Y, Z).
Το κατηγόρημα για το γινόμενο που έχει οριστεί με τον τρόπο αυτό έχει
και αυτό παρόμοια ευελιξία:
?- times(s(s(0)), s(s(s(0))), X).
X = s(s(s(s(s(s(0))))))
yes
?- times(X, s(s(0)), s(s(s(s(0))))).
X = s(s(0)) ->.
yes
?- times(X, Y, s(s(s(s(0))))).
X = s(0)
Y = s(s(s(s(0)))) ->;
X = s(s(0))
Y = s(s(0)) ->;
?- times(s(0), s(0), s(0)).
yes
Υπολογισμοί στην Prolog
Αν και ο παραπάνω ορισμός των ακεραίων είναι αξιοθαύμαστος για τη λιτότητα και
την πληρότητά του, οι υλοποιήσεις της Prolog για υπολογισμούς αριθμών
χρησιμοποιούν το κατηγόρημα is(X, Y) και την υλοποίηση των αριθμών από
τον επεξεργαστή του υπολογιστή.
Αυτό υπολογίζει το αποτέλεσμα της αριθμητικής έκφρασης στο Y και την
ταυτοποιεί με το X.
Το κατηγόρημα αυτό είναι μεν αποδοτικό, δε συμπεριφέρεται όμως με την
ευελιξία που δείξαμε στα παραπάνω παραδείγματα.
Παράδειγμα:
?- is(X, 1 + 2).
X = 3
?- is(2, 1 + 1).
yes
?- is(Y, 3 * 8 + 4 / 5).
Y = 24.8
yes
?- is(2, X + X).
no