© Ευάγγελος Κουράκος Μαυρομιχάλης, 2006 |
Προηγούμενο | Περιεχόμενα | Επόμενο |
Ο μηχανισμός ελέγχου της PrologΓια να εκτελεστεί ένα πρόγραμμα Prolog πρέπει πρώτα να γίνει consult και μετά ο χρήστης να εισάγει τουλάχιστον μία ερώτηση (πρόταση) στο διερμηνέα της Prolog. Για ν' αποφασίσει η Prolog αν η πρόταση που ρωτάμε ισχύει, ο μηχανισμός ελέγχου της Prolog προσπαθεί να ενοποιήσει (στη βιβλιογραφία υπάρχει και ο όρος ταύτιση ή ταυτοποίηση) κάθε γεγονός της πρότασης με τουλάχιστον ένα γεγονός της βάσης δεδομένων ή με τουλάχιστον έναν κανόνα. Η ενοποίηση αυτή πραγματοποιείται με σειριακό τρόπο εξετάζοντας όλα τα γεγονότα και τους κανόνες από πάνω προς τα κάτω. Για το λόγω αυτό η σειρά με την οποία εισάγουμε τα γεγονότα και τους κανόνες στη βάση δεδομένων έχει σημασία διότι καθορίζει τη σειρά με την οποία θα γίνουν οι ενοποιήσεις και άρα και τα αποτελέσματα που θα πάρουμε. Ο μηχανισμός ενοποίησηςΔύο σύνθετοι όροι ή ατομικοί τύποι ταυτίζονται μεταξύ τους όταν:
Σημαντικό: ΠαραδείγματαΈστω ότι έχουμε εισάγει τα παρακάτω γεγονότα στη βάση δεδομένων της Prolog:
/*1*/ on(cube(_), table).
Στις ακόλουθες ερωτήσεις γίνονται οι παρακάτω ενοποιήσεις (δεξιά στήλη):
Η εκτέλεση ενός προγράμματος PrologΌπως τονίσαμε παραπάνω κάθε πρόγραμμα Prolog εκτελείται εισάγοντας μία ερώτηση στο διερμηνέα της Prolog. Η ερώτηση αυτή έχει την ακόλουθη μορφή: ?- q1, q2, ..., qn.
Η Prolog μέσω του μηχανισμού ελέγχου, προσπαθεί να ταυτίσει τα γεγονότα αυτά με αυτά που έχει στη βάση δεδομένων αρχίζοντας πάντα από αριστερά προς τα δεξιά (πρώτα το q1 μετά το q2 κοκ.). Για κάθε γεγονός qκ το οποίο ισχύει (δηλαδή ενοποιείται με κάποιο γεγονός ή κανόνα της βάσης δεδομένων), μεταδίδει τη τιμή κάθε ενοποιημένης μεταβλητής που πιθανών να περιέχει στα υπόλοιπα γεγονότα της ερώτησης και μετά ελέγχει αν αληθεύει το επόμενο γεγονός qκ+1 . Στη περίπτωση που αποτύχει να ταυτίσει το γεγονός qκ με κάποια πρόταση (γεγονός ή κανόνα), τότε ο μηχανισμός ελέγχου οπισθοδρομεί τη σειρά εκτέλεσης (ελέγχου) των γεγονότων της ερώτησης, δηλαδή κάνει backtracking κατά ένα γεγονός. Πιο συγκεκριμένα, για το αμέσως προηγούμενο γεγονός της ερώτησης qκ-1 αναζητά την επόμενη πρόταση που μπορεί να ταυτιστεί. Αυτό μπορεί να έχει ως αποτέλεσμα τη μεταδώσει νέων τιμών στις μεταβλητές των γεγονότων τις ερώτησης και άρα ν' αλλάξει τον τρόπο με τον οποίο αναζητά το αληθές των γεγονότων της ερώτησης. Έστω τώρα ότι το γεγονός qκ ταυτίζεται με τη κεφαλή του ακόλουθου κανόνα r.
Τότε ο μηχανισμός ελέγχου της Prolog αφού πρώτα μεταδώσει στο σώμα του κανόνα οποιαδήποτε ενοποίηση έχει γίνει μεταξύ των όρων των qκ και r, ελέγχει σειριακά αν ικανοποιούνται τα γεγονότα του σώματος του κανόνα εφαρμόζοντας πάλι των μηχανισμό ελέγχου, αλλά αυτή τη φορά για το σώμα του κανόνα. Έτσι, δεδομένου μίας προότασης (όπως η παραπάνω ερώτηση ή το σώμα ενός κανόνα) ο μηχανισμός ελέγχου της Prolog ελέγχει από αριστερά προς τα δεξιά αν ικανοποιούνται όλα τα γεγονότα της πρότασης, ενώ για κάθε έναν από αυτούς τους ελέγχους ψάχνει από πάνω προς τα κάτω τη βάση δεδομένων για γεγονότα και κανόνες που μπορούν να ταυτιστούν με το γεγονός της ερώτησης (βλ. παρακάτω σχήμα). Το ψάξιμο όμως της Prolog δε σταματάει μετά τον επιτυχή έλεγχο και του τελευταίου γεγονότος της πρότασης. Η Prolog δίνει τη δυνατότητα στο χρήστη να ζητήσει τη συνέχιση του ψαξίματος στη βάση δεδομένων και για άλλες λύσεις πατώντας το πλήκτρο ";". Σ' αυτή τη περίπτωση ο μηχανισμός ελέγχου κάνει backtracking προσπαθώντας να βρει εναλλακτικές ενοποιήσεις για κάθε ένα γεγονός της πρότασης αρχίζοντας όμως από το τέλος προς την αρχή. ΠαράδειγμαΈστω το παρακάτω πρόγραμμα Prolog:
a(1).
Στην ερώτηση ?- r(X,Y).
Ο μηχανισμός ελέγχου της Prolog κάνοντας χρήση του κανόνα
X = 1
αν πατήσουμε το πλήκτρο ";" τότε η Prolog θα κάνει backtracking προσπαθώντας να ικανοποιήσει και πάλι το τελευταίο γεγονός
X = 1
Πατώντας και πάλι το πλήκτρο ";" παίρνουμε την τελευταία εναλλακτική επιλογή που ικανοποιεί το a(Y) και κατ'επέκταση την ερώτηση
X = 1
Συνεχίζοντας να ζητάμε εναλλακτικές λύσεις για την ερώτηση ο μηχανισμός ελέγχου θα συνεχίσει να κάνει backtracking ελέγχοντας αυτή τη φορά για εναλλακτικές επιλογές το γεγονός a(X) του κανόνα. Λόγω του ότι όμως η μεταβλητή Χ του γεγονότος αυτού είναι ενοποιημένη με τη μεταβλητή Χ του b(X) που ήδη έχει πάρει μία τιμή, τη θεωρούμε ως σταθερή. Οπότε η μεταβλητή Χ του a(Χ) δεν μπορεί να πάρει άλλη τιμή πέρα από αυτή που ήδη έχει. Έτσι ο μηχανισμός ελέγχου οπισθοδρομεί στο αμέσως επόμενο γεγονός b(X). Η επόμενη τιμή του Χ που ικανοποιεί το b(X) είναι το 5. Η τιμή αυτή μεταδίδεται στο a(X) όπου όμως δεν ταυτίζεται με κάποιο γεγονός της βάσης επομένως ο μηχανισμός ελέγχου οπισθοδρομεί προσπαθώντας να βρει μία άλλη τιμή για το b(X). Εξαντλώντας τις εναλλακτικές επιλογές για το γεγονός b(X) και μετά για το γεγονός a(Y) παίρνουμε τις ακόλουθες απαντήσεις:
X = 3
Τέλος, εξαντλώντας όλες τις δυνατές περιπτώσεις, ο μηχανισμός ελέγχου προσπαθεί να ικανοποιήσει πάλι το γεγονός r(X,Y) επιλέγοντας τον επόμενο κανόνα με κεφαλή
X = 1
|