Η δομή ενός προγράμματος Prolog
Ένα πρόγραμμα Prolog αποτελείται από:
Γεγονότα
Ένα γεγονός αναπαριστά μία ιδιότητα ενός αντικειμένου ή μία σχέση μεταξύ δύο ή περισσότερων αντικειμένων ή γενικότερα ένα αντικείμενο.
Ένα γεγονός μπορεί να περιγραφεί είτε από ένα άτομο, όπως για παράδειγμα:
room.
cat.
h2o.
keyboard.
είτε από έναν ατομικό τύπο:
on(table, box).
loves(mairy,john).
loves(All,mairy).
odd(3).
keyboard(120).
order(10,monitor,keybord,Name,Place).
είτε από έναν σύνθετο όρο:
on(table, box(1)).
triangle(vertex(10,12),vertex(8,20),vertex(34,23)).
computer(keyboard(120),monitor(color(tft)).
order(id(10),monitor(tft),keybord).
Κάθε γεγονός τελειώνει με μία τελεία.
Η κεφαλή του ατομικού τύπου (για παράδειγμα το on, loves, odd ) ονομάζεται κατηγόρημα.
Ένα όρισμα ενός κατηγορήματος ή ενός σύνθετου όρου μπορεί να είναι είτε ένα άτομο, είτε ένας αριθμός, είτε μία μεταβλητή. Ιδιαίτερα, οι όροι των σύνθετων όρων μπορεί να περιέχουν άλλους σύνθετους όρους.
Ο αριθμός τον ορισμάτων που έχει ένα κατηγόρημα ή ένας σύνθετος όρος ονομάζετε τάξη (για παράδειγμα η τάξη του order(id(10),monitor(tft),keybord) είναι 3).
Παράδειγμα
Αναπαραστήστε με γεγονότα της Prolog το παρακάτω οικογενειακό δένδρο των θεών του Ολύμπου, έτσι ώστε να είναι γνωστές οι σχέσεις "Ο Χ είναι πατέρας της(του) Υ", "Η Χ είναι μητέρα της(του) Υ", και οι ιδιότητες "Ο Χ είναι άντρας" και "Η Χ είναι γυναίκα".
is_father(jupiter, mars).
is_father(jupiter, dionysus).
is_father(mars, armonia).
is_father(kadmos, semeli).
is_mother(hera, mars).
is_mother(armonia, semeli).
is_mother(semeli, dionysus).
is_mother(aphrodite, armonia).
is_woman(armonia).
is_woman(hera).
is_woman(semeli).
is_woman(aphrodite).
is_men(mars).
is_men(jupiter).
is_men(dionysus).
is_men(kadmos).
Δεδομένου της γνώσης αυτής για τους θεούς του Ολύμπου, παρακάτω δίνονται μερικές ερωτήσεις που μπορούμε να κάνουμε στη Prolog.
H Σεμέλη είναι γυναίκα?
?- is_woman(semeli).
Ο Άρης είναι πατέρας της Σεμέλης?
?- is_father(mars,semeli).
O Δίας είναι πατέρας του Άρη ΚΑΙ του Διόνυσου?
?- is_father(jupiter,mars), is_father(jupiter,dionysus).
Ποιά είναι η μητέρα της Σεμέλης?
?- is_mother(Mother,semeli).
Μεταβλητές
Κάθε όρισμα ένας κατηγορήματος ή σύνθετου όρου που αρχίζει με κεφαλαίο γράμμα, η Prolog το θεωρεί μεταβλητή.
Σε αντίθεση με άλλες γλώσσες προγραμματισμού οι μεταβλητές στη Prolog δεν έχουν τύπο. Όπως θα δούμε στο κεφάλαιο ελέγχου της Prolog, μία μεταβλητή μπορεί να ταυτίστεί με οποιοδήποτε άτομο, κατηγόρημα, σύνθετο όρο ή αριθμό.
Δύο μεταβλητές που έχουν το ίδιο όνομα και ανήκουν σε διαφορετικούς κανόνες ή γεγονότα της βάσης δεδομένων δεν σχετίζονται μεταξύ τους.
Από τη στιγμή που μία μεταβλητή πάρει μία τιμή μέσα σε έναν κανόνα τότε αυτή δεν μπορεί ν' αλλάξει, έτσι σε κάθε χρονική στιγμή μία μεταβλητή μπορεί να θεωρηθεί ότι είτε έχει πάρει τιμή (instantiated) είτε ότι είναι ελεύθερη (uninstantiated).
Παραδείγματα:
Ποιες είναι γυναίκες?
?- is_woman(X).
Ποιοι άντρες έχουν κόρη?
?- is_men(X), is_father(X,Y), is_woman(Y).
Σημείωση: Όταν μία μεταβλητή χρησιμοποιείται στη βάση δεδομένων μία φορά μέσα σε ένα γεγονός ή κανόνα (και άρα δεν ενοποιείται με κάποιο άλλο όρο) τότε η Prolog μετά το compile εμφανίζει το μήνυμα "Warning: Singleton Variables" ως ένδειξη πιθανού λάθους. Αν γνωρίζουμε ότι το πρόγραμμά μας είναι σίγουρα σωστό, για να μην εμφανίζει η Prolog το μήνυμα αυτό βάζουμε μπροστά από τις μεταβλητές το σύμβολο "_". Έτσι η Prolog αγνοεί τις μεταβλητές αυτές και δεν μας επιστρέφει Warnings.
Κανόνες
Ένας κανόνας έχει τη μορφή K:- F1, F2, ..., Fn.
Το γεγονός Κ ονομάζεται κεφαλή του κανόνα, ενώ τα γεγονότα F1, F2, ..., Fn. αποτελούν το σώμα του κανόνα. Κάθε κανόνας τελειώνει με μία τελεία.
Για να ισχύσει το γεγονός Κ θα πρέπει η Prolog να ελέγξει διαδοχικά αν ισχύουν τα F1, F2, ..., Fn.
To σύμβολο :- χωρίζει το σώμα από τη κεφαλή και διαβάζεται (δηλωτικά) "το γεγονός K ισχύει αν τα γεγονότα F1 και F2 και ... και Fn ισχύουν".
Δύο ή περισσότεροι κανόνες μπορεί να έχουν την ίδια κεφαλή. Για παράδειγμα:
K:- F11, F12, ..., F1n.
K:- F21, F22, ..., F2n.
Σ' αυτή τη περίπτωση ο κανόνας K διαβάζεται: "το γεγονός K ισχύει αν τα γεγονότα F11 και F12 και ... και F1n ισχύουν ή αν τα γεγονότα F11 και F12 και ... και F1n ισχύουν".
Παραδείγματα:
Υλοποιήστε έναν κανόνα που να δηλώνει το πότε ο A είναι αδελφός του Β.
Ο Α είναι αδελφός του (ή της) Β αν και οι δύο έχουν τον ίδιον πατέρα ή την ίδια μητέρα και ο Α είναι άντρας:
is_brother(A,B):- is_father(F,A), is_father(F,B), is_men(A).
is_brother(A,B):- is_mother(M,A), is_mother(M,B), is_men(A).
Υλοποιήστε έναν κανόνα που να δηλώνει ότι ο A είναι γονέας του Β:
is_parent(A,B):- is_father(A,B).
is_parent(A,B):- is_mother(A,B).
Υλοποιήστε τον προηγούμενο κανόνα is_sister/2 κάνοντας χρήση του is_parent/2 .
is_brother(A,B):- is_parent(F,A), is_parent(F,B), is_men(A).
Υλοποιήστε έναν κανόνα που να δηλώνει το πότε η A είναι πρόγονος του Β.
O A είναι πρόγονος του Β αν είτε
ο Α είναι γονέας του Β είτε
ο Α έιναι γονέας κάποιου Γ που είναι γονέας του Β είτε
ο Α έιναι γονέας κάποιου Γ που είναι γονέας κάποιου Δ που είναι γονέας του Β είτε
... κτλ.
is_ancestor(A,B):-is_parent(A,B).
is_ancestor(A,B):-is_parent(A,C),is_parent(C,B).
is_ancestor(A,B):-is_parent(A,C),is_parent(C,D),is_parent(D,B).
...
Αναδρομικοί Κανόνες
Οι αναδρομικοί κανόνες ορίζονται με τη βοήθεια του εαυτού τους.
Παράδειγμα, ο ορισμός προγόνου:
Ο Α είναι πρόγονος του Β αν
ο Α είναι γονέας του Β ή αν
υπάρχει κάποιος C που ο Α είναι γονέας του και ο C είναι πρόγονος του Β.
is_ancestor(A,B):- is_parent(A,B).
is_ancestor(A,B):- is_parent(A,C), is_ancestor(C,B).
Ο πρώτος από τους δύο παραπάνω κανόνες ονομάζεται τερματική συνθήκη του αναδρομικού κανόνα.
Τελευταία ενημέρωση σελίδας: 20/10/2008 |
|