Τεχνικές Λογικού Προγραμματισμού

Η γλώσσα Prolog

Σύγγραμμα

Περιγραφή του βιβλίου

Ο Λογικός Προγραμματισμός (ΛΠ) ανήκει στις πλέον ενδιαφέρουσες σχολές προγραμματισμού, σημαντικά διαφορετικές από τις "κλασικές" σχολές του προστακτικού - αντικειμενοστραφούς προγραμματισμού. Η χρήση της Μαθηματικής Λογικής σαν εργαλείο αφαίρεσης της περιγραφής υπολογισμών και η εκμετάλλευση των αποδεικτικών διαδικασιών της πρώτης οδηγεί σε συμπαγή προγράμματα τα οποία βρίσκουν εφαρμογές σε πολύπλοκα και ενδιαφέροντα πεδία, όπως είναι η Τεχνητή Νοημοσύνη και το Σημασιολογίκο Διαδίκτυο. Όμως, αυτή η υψηλού επιπέδου προσέγγιση στον προγραμματισμού δημιουργεί προβλήματα σε εκείνους που πρώτη φορά έρχονται σε επαφή με τον ΛΠ , αφενός γιατί απαιτεί να υιοθετήσουν μια δηλωτική προσέγγιση στην ανάπτυξη προγραμμάτων "ξένη" προς αυτή των κυρίαρχων γλωσσών, και αφετέρου, γιατί απαιτείται η εκμάθηση τεχνικών αναπαράστασης και επίλυσης προβλημάτων που αν και είναι γενικά εφαρμόσιμες στον προγραμματισμός, δεν χρησιμοποιούνται συχνά στις υπόλοιπες σχολές, με κλασικό παράδειγμα την αναδρομή.

Το παρόν βιβλίο φιλοδοξεί να καλύψει τις παραπάνω δύο απαιτήσεις και να αποτελέσει το βασικό σύγγραμμα για οποιονδήποτε επιθυμεί να εντρυφήσει στην τέχνη και τεχνικές του ΛΠ. Έχοντας σαν όχημα τον κυριότερο εκπρόσωπο της σχολής ΛΠ, την γλώσσα Prolog, το βιβλίο έχει σαν στόχο να (α) να αναφέρει σύντομα τα θεωρητικά θεμέλια του ΛΠ, δηλαδή της Κατηγορηματικής Λογικής Πρώτης Τάξης και της αρχής της ανάλυσης, (β) να παρουσιάσει σε βάθος την γλώσσα προγραμματισμού Prolog, τα διαθέσιμα κατηγορήματα και πως αυτά εντασσόμενα σε τεχνικές ΛΠ προγραμματισμού αποτελούν ισχυρά εργαλεία για την επίλυση προβλημάτων (γ) να παρουσιάσει εφαρμογές στις οποίες ο Λογικός Προγραμματισμός προσφέρει σημαντικά πλεονεκτήματα, και τέλος, (δ) να αναπτύξει προγραμματιστικές δεξιότητες του αναγνώστη, όπως είναι η αναδρομή, εφαρμόσιμες σε όλες τις σχολές προγραμματισμού.

Περιεχόμενα

Παρακάτω βρίσκονται σύντομες περιγραφές των περιεχομένων των κεφαλαίων και παρατίθεται για κάθε κεφάλαιο ο κώδικας των παραδειγμάτων που παρουσιάστηκαν σε αυτό.

Τεχνητή Νοημοσύνη, Συμβολικός Υπολογισμός, Λογικός Προγραμματισμός, Prolog

Στο κεφάλαιο αυτό πραγματευόμαστε την εξέλιξη του Λογικού Προγραμματισμού (ΛΠ) και της γλώσσας Prolog ως μίας ξεχωριστής μεθοδολογίας προγραμματισμού. Κάνουμε μία σύντομη αναφορά στην ιστορική εξέλιξη τους, τη σχέση τους με την έννοια του Συμβολικού Προγραμματισμού και με τον τομέα της Τεχνητής Νοημοσύνης (ΤΝ) και των εφαρμογών της.

Διαδικαστικός προγραμματισμός, Δηλωτικός προγραμματισμός, Διαδικαστική γλώσσα προγραμματισμού, Προστακτική γλώσσα προγραμματισμού, Δηλωτική γλώσσα προγραμματισμού.

Tο κεφάλαιο ξεκινά με την παρουσίαση της διάσημης πλέον "εξίσωσης" του R. Kowalski που περιγράφει την έννοια του δηλωτικού προγραμματισμού. Εξηγεί πως οι γλώσσες που ανήκουν στην κατηγορία αυτή επιτρέπουν στον προγραμματιστή απλά να περιγράφει το προς επίλυση πρόβλημα ενώ οι μηχανισμοί εκτέλεσης να αναλαμβάνουν την επίλυσή του. Η αναπαράσταση του προβλήματος απαιτείται να μην εμφανίζει αμφισημίες και να μπορεί να έχει μια εκφραστική ικανότητα η οποία επιτρέπει την αποδοτική αποτύπωση όλων των πτυχών του προς επίλυση προβλήματος: ένας τέτοιος φορμαλισμός παρέχεται από την κατηγορηματική λογική και τις γλώσσες λογικού προγραμματισμού. Το κεφάλαιο παραθέτει απλά παραδείγματα που τονίζουν την παραπάνω προσέγγιση και αποτελούν έναυσμα για την εισαγωγή στην κατηγορηματική λογική, στο λογικό προγραμματισμό και στη γλώσσα Prolog που ακολουθεί.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Μαθηματική Λογική, Προτασιακή Λογική, Κατηγορηματική Λογική, Προτάσεις Horn, Λογικά Προγράμματα

Το κεφάλαιο αποτελεί μια σύντομη εισαγωγή στην Μαθηματική Λογική και ειδικότερα στην κατηγορηματική λογική πρώτης τάξης, η οποία αποτελεί την μαθηματική βάση του Λογικού Προγραμματισμού. Συγκεκριμένα στο κεφάλαιο αυτό παρουσιάζονται τα βασικά στοιχεία της Λογικής, όπως είναι η σύνταξη των όρων της κατηγορηματικής λογικής, οι τελεστές και οι αποδεικτικές διαδικασίες. Δίνεται έμφαση στην αρχή της ανάλυσης (resolution principle) και αναδεικνύεται η σημαντικότητά της για την αυτοματοποιημένη επίλυση προβλημάτων, προκειμένου η μαθηματική λογική να μπορεί να χρησιμοποιηθεί ως γλώσσα προγραμματισμού. Τέλος, το κεφάλαιο κλείνει με την παρουσίαση των κανονικών μορφών της Λογικής, κατά Kowalski και Horn, που χρησιμοποιούνται στην γλώσσα Prolog.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Φράσεις (Γεγονότα – Κανόνες – Ερωτήσεις) Λογικές μεταβλητές, Δομές Δεδομένων

Το κεφάλαιο παρουσιάζει τη σύνταξη της γλώσσας Prolog. Δίνεται αρχικά η σχέση μεταξύ της σύνταξης της Κατηγορηματικής Λογικής Πρώτης Τάξης και της σύνταξης της γλώσσας, ενώ μέσω απλών παραδειγμάτων, παρουσιάζονται τα δομικά στοιχεία ενός Prolog προγράμματος, δηλαδή τα γεγονότα και οι κανόνες. Δεδομένων αυτών παρουσιάζεται ο τρόπος αλληλεπίδρασης του χρήστη με το πρόγραμμα, δηλαδή τα ερωτήματα Prolog. Εισάγεται η έννοια της Λογικής μεταβλητής και τονίζεται η ιδιαιτερότητα της ανάθεσης τιμής σε αυτή καθώς και η διαφορά μεταξύ των γλωσσών μοναδικής και καταστροφικής ανάθεσης. Τέλος παρουσιάζονται οι συναρτησιακοί ή σύνθετοι όροι, και τονίζεται ότι αυτοί αποτελούν τη βασική αλλά εξαιρετικά ευέλικτη δομή δεδομένων στην Prolog.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Ερμηνεία λογικών προγραμμάτων, ενοποίηση, αποδεικτική διαδικασία Prolog, κλήσεις, οπισθοδρόμηση, παρακολούθηση προγραμμάτων Prolog

Το κεφάλαιο ξεκινά με την παρουσίαση της διαδικασίας ενοποίησης, δηλαδή του κύριου μηχανισμού ανάθεσης τιμών σε μεταβλητή και περάσματος παραμέτρων, η οποία αποτελεί ένα από τα ισχυρότερα στοιχεία της γλώσσας. Μέσω παραδειγμάτων κλιμακούμενης δυσκολίας δίνεται η έννοια του πλέον γενικού ενοποιητή. Στη συνέχεια και έχοντας ορίσει τη διαδικασία ενοποίησης, περιγράφεται το πώς η αποδεικτική διαδικασία που βασίζεται στον κανόνα της αρχής της ανάλυσης υλοποιείται από τον μηχανισμό εκτέλεσης της Prolog, για την απάντηση ερωτημάτων, μέσω διαφόρων παραδειγμάτων εκτέλεσης που στοχεύουν στην κατανόηση των διαφόρων χαρακτηριστικών του μηχανισμού. Ο μηχανισμός εκτέλεσης της Prolog μπορεί να αναπαρασταθεί εποπτικά χρησιμοποιώντας το λεγόμενο δένδρο εκτέλεσης ή αναζήτησης, το οποίο παρουσιάζεται και αναλύεται εκτενώς, μέσω των αντίστοιχων παραδειγμάτων εκτέλεσης. Τέλος, μέσω των ίδιων παραδειγμάτων παρουσιάζεται ο μηχανισμός αποσφαλμάτωσης ή καλύτερα παρακολούθησης της εκτέλεσης της Prolog, το λεγόμενο “box model”, και αναλύεται πώς μπορεί μέσω αυτού να εντοπιστούν σφάλματα σε λογικά προγράμματα.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Αναδρομικές συναρτήσεις, Αναδρομή ως εργαλείο επίλυσης προβλημάτων, Αριθμητικές πράξεις και βασικά αριθμητικά κατηγορήματα, Εκφραστικότητα αναδρομικών ορισμών, Η Αναδρομή ως μεθοδολογία Προγραμματισμού

Η αναδρομή αποτελεί την κύρια τεχνική ανάπτυξης προγραμμάτων Prolog, καθώς η γλώσσα δεν περιλαμβάνει στην βασική της σύνταξη εντολές επανάληψης ή διακλάδωσης υπό συνθήκη, όπως repeat, for, while κλπ. που υπάρχουν σε άλλες γλώσσες. Το κεφάλαιο ξεκινά με την παρουσίαση των στοιχείων ενός αναδρομικού ορισμού, δίνοντας έμφαση μέσω παραδειγμάτων στην εκφραστική δύναμη των αναδρομικών ορισμών και την λακωνικότητα διατύπωσής τους. Τονίζεται ότι η αναδρομή αποτελεί γενική μεθοδολογία προγραμματισμού, εφαρμόσιμη σε όλες τις γλώσσες. Τέλος, παρουσιάζονται τα κατηγορήματα υπολογισμού αριθμητικών πράξεων σε Prolog, με στόχο να παρατεθούν παραδείγματα υλοποίησης για ενδιαφέροντες αλλά και σχετικά απλούς αναδρομικούς ορισμούς.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Δομή και Ενοποίηση λιστών, Αναδρομή και Διαχείριση Λιστών, Βασικά (κλασσικά) κατηγορήματα Λιστών

Το κεφάλαιο αυτό πραγματεύεται την πλέον χρησιμοποιούμενη δομή δεδομένων της Prolog, την λίστα όρων (ή απλά λίστα). Οι λίστες έχουν μεγάλη εφαρμογή στον λογικό προγραμματισμό καθώς είναι ίσως η μια και μοναδική “δομή δεδομένων” συλλογών που υποστηρίζεται στην Prolog. Όπως θα δούμε στην συνέχεια, οι λίστες αποτελούν απλώς μια κατηγορία αναδρομικών όρων με ειδική σύνταξη. Ενδιαφέρον παρουσιάζει το πως ο μηχανισμός ενοποίησης εφαρμόζεται στις λίστες, εκμεταλλευόμενος την ειδική σύνταξη που εισήχθηκε για αυτές. Δίνονται παραδείγματα αναδρομικών ορισμών κατηγορημάτων με χρήση λιστών, και τέλος, παρουσιάζονται τα κλασσικά κατηγορήματα διαχείρισης λιστών (member/2, append/3, delete/4, κλπ), και οι υλοποιήσεις τους σαν αναδρομικοί ορισμοί.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Αντίστροφη χρήση κατηγορημάτων, Ιντετερμινιστικός Προγραμματισμός, Συμβολικός Προγραμματισμός, Επαυξητικός Προγραμματισμός, “Από άνω προς τα κάτω” ανάπτυξη προγραμμάτων

Στο κεφάλαιο αυτό θα ασχοληθούμε με ένα σύνολο τεχνικών που διαφοροποιούν το λογικό προγραμματισμό, από τον προγραμματισμό με τη βοήθεια των κλασσικών διατακτικών γλωσσών προγραμματισμού. Οι τεχνικές αυτές αναφέρονται (α) στη δυνατότητα χρήσης κατηγορημάτων με αντίστροφη λογική που προκύπτει ως συνέπεια της δηλωτικότητας του Λογικού Προγραμματισμού (ΛΠ) και της απουσίας προκαθορισμένων ορισμάτων εισόδου-εξόδου, (β) στον μη-αιτιοκρατικό ή ιντετερμινιστικό προγραμματισμό (nondeterministic programming) και πώς μια τέτοια προσέγγιση υποστηρίζεται εγγενώς από το μοντέλο του Λογικού Προγραμματισμού και της Prolog, και (γ) στο συμβολικό προγραμματισμό κυρίως μέσω της δυνατότητας αναπαράστασης και επίλυσης προβλημάτων με ελλιπή δεδομένα. Οι τεχνικές αυτές είναι ιδιαίτερα χρήσιμες για την αντιμετώπιση προβλημάτων της Τεχνητής Νοημοσύνης και υπό αυτήν την έννοια χαρακτηρίζονται ως ευφυείς. Επίσης γίνεται αναφορά στην τεχνική του Αυξητικού (Incremental) Προγραμματισμού, ιδιαίτερα δημοφιλή στο Λογικό Προγραμματισμό καθώς οι περισσότερες υλοποιήσεις είναι διερμηνευόμενες (interpreted) και στην "από άνω προς τα κάτω" (Top Down) προσέγγιση στην ανάπτυξη προγραμμάτων.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Η υπόθεση του κλειστού Κόσμου, Άρνηση ως Αποτυχία - Το κατηγόρημα not/1, Έλεγχος Εκτέλεσης: Αποκοπή, Αποκοπή και Άρνηση, Ρεύματα Εισόδου Εξόδου στην Prolog.

Το κεφάλαιο παρουσιάζει τα χαρακτηριστικά της γλώσσας Prolοg τα οποία αναφέρονται ως εξωλογικά, δηλαδή χαρακτηριστικά τα οποία αν και ξεφεύγουν της κατηγορηματικής λογικής πρώτης τάξης (εξω-λογικά) είναι απαραίτητα για την ανάπτυξη πρακτικών εφαρμογών. Η παρουσίαση ξεκινά με την υπόθεση του κλειστού κόσμου, η οποία επιτρέπει την υλοποίηση της άρνησης ως αποτυχία. Παρατίθενται παραδείγματα κατηγορημάτων με την χρήση του not/1, που αποτελεί το κατηγόρημα της άρνησης στην Prolog. Το κεφάλαιο συνεχίζει με το κατηγόρημα της αποκοπής, που μεταβάλλει την συμπεριφορά του μηχανισμού εκτέλεσης. Παρουσιάζονται παραδείγματα προγραμμάτων όπου η χρήση του τελεστή της αποκοπής αλλάζει την σημασιολογία τους ("κόκκινη" αποκοπή), όπως επίσης και παραδείγματα όπου η αποκοπή χωρίς να αλλάζει την σημασιολογία, βελτιώνει την ταχύτητα εκτέλεσης των προγραμμάτων ("πράσινη" αποκοπή), όπως και ο συνδυασμός αποκοπής και άρνησης. Τέλος, το κεφάλαιο κλείνει με την παρουσίαση των ρευμάτων εισόδου-εξόδου (οθόνη/αρχεία).

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Διαχείριση όρων, Μεταβλητή κλήση, Διαχείριση προτάσεων, Διαχείριση Συνόλου Λύσεων, Δυναμικός Μετα-προγραμματισμός

Τα μετα-λογικά χαρακτηριστικά της γλώσσας Prolog αυξάνουν σημαντικά τη δυνατότητα ανάπτυξης πρακτικών προγραμμάτων. Στην κατηγορία αυτή ανήκουν τα κατηγορήματα της διαχείρισης των όρων της Prolog κατά την διάρκεια της εκτέλεσης, όπως είναι αυτά της εξέτασης του τύπου των όρων, της σύγκρισης των όρων για ισότητα ή ανισότητα, και της σύνθεσης και διάσπασης όρων, τα οποία και παρουσιάζονται στο παρόν κεφάλαιο με την χρήση απλών παραδειγμάτων αλλά και περισσότερο πολύπλοκων λογικών προγραμμάτων. Το κεφάλαιο, παρουσιάζει επίσης μια επέκταση της Prolog που επιτρέπει την κωδικοποίηση λογικών πέραν της κατηγορηματικής λογικής πρώτης τάξης, την μεταβλητή κλήση, η οποία εκμεταλλευόμενη την συντακτική ισομορφία των κατηγορημάτων και των σύνθετων όρων, επιτρέπει την δημιουργία κατά την εκτέλεση ερωτημάτων προς απόδειξη καθώς και την κλήση τους. Η μετατροπή του προγράμματος κατά τη διάρκεια της εκτέλεσης είναι το επόμενο αντικείμενο το οποίο πραγματεύεται το κεφάλαιο, η οποία προσφέρει ένα απλό τρόπο μεταβολής του ίδιου του εκτελέσιμου κώδικα. Τέλος, στο κεφάλαιο παρουσιάζονται τα κατηγορήματα συλλογής όλων των εναλλακτικών λύσεων μιας κλήσης σε μία λίστα. Το κεφάλαιο κλείνει με ένα ολοκληρωμένο παράδειγμα χρήσης όλων των μετα-λογικών χαρακτηριστικών σε ένα πρόγραμμα διαχείρισης βάσης δεδομένων. Επίσης παρουσιάζεται ένα σύντομο πλην όμως ενδεικτικό παράδειγμα της προχωρημένης δυνατότητας της γλώσσας Prolog για την ανάπτυξη διερμηνέων άλλων γλωσσών προγραμματισμού, ακόμα και του εαυτού της!

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Λογική και Αλγοριθμική, Προβλήματα Παραγωγής και Δοκιμής, Προβλήματα Γράφων. Αναπαράσταση και αναζήτηση σε γράφους.

Το κεφάλαιο αποτελεί επιστέγασμα όλων των προηγουμένων, καθώς παραθέτει παραδείγματα τεχνικών αναπαράστασης και επίλυσης σύνθετων προβλημάτων σε Prolog. Αντιπαρατίθεται η λογική προσέγγιση σε ένα πρόβλημα με την αντίστοιχη αλγοριθμική. Κλασσικές τεχνικές όπως εκείνη της “Παραγωγής και Δοκιμής” (Generate and Test) παρουσιάζονται μέσω κλασικών παραδειγμάτων, όπως η εύρεση λύσης σε ακέραιες εξισώσεις και άλλα παρόμοια μη-αριθμητικά προβλήματα ικανοποίησης περιορισμών. Παρουσιάζεται επίσης η πλέον δημοφιλής αναπαράσταση προβλημάτων της Τεχνητής Νοημοσύνης, η αναπαράσταση μέσω γράφων, καθώς και η υλοποίηση τυφλών και ευριστικών αλγορίθμων αναζήτησης, οι οποίοι οδηγούν στην επίλυση σύνθετων προβλημάτων.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Προβλήματα ικανοποίησης περιορισμών. Η έννοια του περιορισμού σε μεταβλητές. Πεδία μεταβλητών. Επίλυση προβλημάτων περιορισμών. Αλγόριθμοι διήθησης δυαδικών περιορισμών και περιορισμών ανώτερης τάξης. Υποστήριξη περιορισμών στο Λογικό Προγραμματισμό. Η γλώσσα ECLiPSe ως όχημα Προγραμματισμού με περιορισμούς. Παραδείγματα κατηγοριών προβλημάτων (χρονοπρογραμματισμός, ανάθεση πόρων).

Ο λογικός προγραμματισμός με περιορισμούς, αποτελεί μια από τις πιο πετυχημένες επεκτάσεις του λογικού προγραμματισμού, με εφαρμογή σε πλήθος βιομηχανικών προβλημάτων, όπως για παράδειγμα προβλήματα χρονοπρογραμματισμού. Το κεφάλαιο παρουσιάζει σύντομα τον ορισμό των προβλημάτων ικανοποίησης περιορισμών, καθώς και έννοιες όπως εκείνη της εφαρμογής περιορισμών σε πεδία μεταβλητών. Αναφέρονται σύντομα το πώς επιλύονται τέτοιου είδους προβλήματα με εφαρμογή αλγορίθμων διήθησης περιορισμών και αναζήτηση. Χρησιμοποιώντας μια καθιερωμένη πλατφόρμα προγραμματισμού περιορισμών (ECLiPSe Prolog) και των βιβλιοθηκών που προσφέρει, παρουσιάζονται πλήθος παραδειγμάτων συνδυαστικών εφαρμογών, όπως είναι ο χρονοπρογραμματισμός και η ανάθεση πόρων, δείχνοντας έτσι στον αναγνώστη πως ο λογικός προγραμματισμός αποτελεί κατάλληλη πλατφόρμα για την ανάπτυξη τέτοιων προγραμμάτων.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Φυσική Γλώσσα, Τεχνητές Γλώσσες, Γραμματικές, Ιεραρχία Chomsky, Γραμματικές Οριστικών Προτάσεων (DCG), Μεταγλωττιστές, Ορισμός και χρήση Τελεστών

Η επεξεργασία φυσικής γλώσσας αποτέλεσε μια από τις πρώτες εφαρμογές του λογικού προγραμματισμού. Το κεφάλαιο παρουσιάζει το πως η Prolog, υποστηρίζει την ανάπτυξη εφαρμογών της κατηγορίας, μέσω γραμματικών οριστικών προτάσεων, και παραθέτει ένα παράδειγμα ανάπτυξης ενός απλού μεταγλωττιστή στην Prolog. Το κεφάλαιο επίσης παρουσιάζει τους τελεστές στην Prolog, και τον τρόπο τον ορισμού νέων τελεστών.

Κώδικας (σε zip) των προγραμμάτων του κεφαλαίου.

Επικοινωνία

Για οποιεσδήποτε ερωτήσεις, παρτηρήσεις και διορθώσεις, παρακαλείστε να επικοινωνήσετε αποστέλλοντας email στη διεύθυνση iliass (at) uom (dot) edu (dot) gr.