ΠΑΝΑΓΙΩΤΗΣ ΚΑΤΣΑΡΟΣ Επ. Καθηγητής Α.Π.Θ. Θεωρία Υπολογισμού Και Εφαρμογές
Θεωρία Υπολογισμού και Εφαρμογές Συγγραφή Παναγιώτης Κατσαρός Κριτικός αναγνώστης Ιωάννης Σταμέλος Συντελεστές έκδοσης Γλωσσική Επιμέλεια: Βασίλειος Παππάς Γραφιστική Επιμέλεια: Παναγιώτης Κατσαρός Τεχνική Επεξεργασία: Εμμανουέλα Στάχτιαρη ISBN: 978-960-603-406-0 Copyright ΣΕΑΒ, 2015 Το παρόν έργο αδειοδοτείται υπό τους όρους της άδειας Creative Commons Αναφορά Δημιουργού - Μη Εμπορική Χρήση - Όχι Παράγωγα Έργα 3.0. Για να δείτε ένα αντίγραφο της άδειας αυτής επισκεφτείτε τον ιστότοπο https://creativecommons.org/licenses/by-nc-nd/3.0/gr/ ΣΥΝΔΕΣΜΟΣ ΕΛΛΗΝΙΚΩΝ ΑΚΑΔΗΜΑΪΚΩΝ ΒΙΒΛΙΟΘΗΚΩΝ Εθνικό Μετσόβιο Πολυτεχνείο Ηρώων Πολυτεχνείου 9, 15780 Ζωγράφου www.kallipos.gr
Περιεχόμενα Πρόλογος ix 1 Γλώσσες και Υπολογισμοί 1 1.1 Συμβολοσειρές........................... 2 1.2 Γλώσσες και πράξεις γλωσσών.................. 7 1.2.1 Ορισμός γλωσσών.................... 8 1.2.2 Πράξεις μεταξύ γλωσσών................. 9 1.2.3 Παραγωγή και αναγνώριση γλωσσών στη Θεωρία Υπολογισμού.......................... 11 1.3 Κλάσεις γλωσσών......................... 13 1.3.1 Κλάσεις γλωσσών ως προς τις μηχανές για την αναγνώρισή τους....................... 13 1.3.2 Κλάσεις γλωσσών ως προς το βαθμό αποδοτικότητας της διαδικασίας απόφασης................. 25 1.4 Κατάταξη γλωσσών........................ 26 1.5 Θέση των Church και Turing.................. 28 1.6 Ντεντερμινισμός και μη ντεντερμινισμός............. 31 1.7 Επεκτάσεις των κλασικών μοντέλων υπολογισμού και εφαρμογές 33 1.7.1 Συστήματα μεταβάσεων για επαλήθευση με έλεγχο μοντέλων (model checking)................. 33 1.7.2 Χρονισμένα και υβριδικά αυτόματα............ 39 1.8 Κριτήρια αξιολόγησης....................... 48 Βιβλιογραφία - Αναφορές........................ 48 2 Κανονικές Γλώσσες & Πεπερασμένα Αυτόματα 51 2.1 Ντεντερμινιστικά Πεπερασμένα Αυτόματα (ΝΠΑ)........ 52 2.2 Μη ντεντερμινιστικά Πεπερασμένα Αυτόματα (ΜΝΠΑ)..... 58 2.3 Ισοδυναμία ΜΝΠΑ και ΝΠΑ................... 62 2.4 Ιδιότητες Κλειστότητας Κανονικών Γλωσσών.......... 68 iii
iv ΠΕΡΙΕΧ ΟΜΕΝΑ 2.5 Κανονικές εκφράσεις....................... 75 2.6 Επεκτάσεις Πεπερασμένων Αυτομάτων.............. 87 2.6.1 Μετατροπείς Πεπερασμένων Καταστάσεων....... 87 2.6.2 Αυτόματα Büchi για συμβολοσειρές άπειρου μήκους.. 91 2.7 Εφαρμογές............................. 94 2.7.1 ΠΑ για τη σχεδίαση κυκλωμάτων με λογικές πύλες... 94 2.7.2 Πρωτόκολλα επικοινωνίας: το TCP ως ΝΠΑ...... 101 2.8 Κριτήρια αξιολόγησης....................... 105 2.9 Βιντεοδιαλέξεις.......................... 107 2.10 Διαδραστικό τεστ......................... 108 Βιβλιογραφία - Αναφορές........................ 108 3 Ελαχιστοποίηση και Μη Κανονικές Γλώσσες 109 3.1 Ελάχιστα ΠΑ........................... 110 3.1.1 Ελάχιστο ΝΠΑ για μια γλώσσα............. 110 3.1.2 Ελαχιστοποίηση ενός ΝΠΑ................ 117 3.1.3 Εφαρμογές......................... 120 3.2 Λήμμα της Άντλησης και Μη Κανονικές Γλώσσες....... 122 3.3 Αποφασισιμότητα προβλημάτων & αλγόριθμοι ΠΑ....... 127 3.4 Βιντεοδιαλέξεις.......................... 132 3.5 Διαδραστικό τεστ......................... 133 Βιβλιογραφία - Αναφορές........................ 133 4 Γλώσσες & Γραμματικές Χωρίς Συμφραζόμενα 135 4.1 Γραμματικές Χωρίς Συμφραζόμενα................ 136 4.2 Παραγωγές και Συντακτικά Δέντρα............... 144 4.3 Διφορούμενες Γραμματικές.................... 146 4.4 Κανονική Μορφή Chomsky.................... 154 4.5 Εφαρμογές............................. 162 4.5.1 Σύνταξη Γλωσσών Προγραμματισμού.......... 162 4.5.2 Στοχαστικές Γραμματικές Χωρίς Συμφραζόμενα.... 163 4.6 Βιντεοδιαλέξεις.......................... 164 4.7 Διαδραστικό τεστ......................... 164 Βιβλιογραφία - Αναφορές........................ 164 5 Αυτόματα Στοίβας και Γλώσσες που δεν είναι Χωρίς Συμφραζόμενα 167 5.1 Αυτόματα Στοίβας (ΑΣ)..................... 168 5.2 Ισοδυναμία ΓΧΣ και ΑΣ..................... 168 5.3 Ιδιότητες Κλειστότητας Γλωσσών Χωρίς Συμφραζόμενα.... 168
ΠΕΡΙΕΧ ΟΜΕΝΑ v 5.4 Λήμμα Άντλησης για Γλώσσες Χωρίς Συμφραζόμενα...... 168 5.5 Ντετερμινιστικά και Μη Ντετερμινιστικά ΑΣ.......... 168 5.6 Συντακτική Ανάλυση Γλωσσών Χωρίς Συμφραζόμενα..... 168 5.7 Αλγόριθμοι για Γλώσσες Χωρίς Συμφραζόμενα......... 168 5.8 Εφαρμογές............................. 168 5.9 Κριτήρια αξιολόγησης....................... 168 5.10 Βιντεοδιαλέξεις.......................... 168 5.11 Διαδραστικό τεστ......................... 168 Βιβλιογραφία - Αναφορές........................ 169 6 Μηχανές Turing 171 6.1 Ορισμός Μηχανών Turing (ΜΤ)................. 172 6.1.1 Ενας συνθετικός συμβολισμός για ΜΤ......... 179 6.2 Υπολογισμοί με ΜΤ........................ 184 6.2.1 ΜΤ ως μηχανές αναγνώρισης γλωσσών......... 184 6.2.2 Υπολογισμός συναρτήσεων με ΜΤ............ 186 6.3 Πολλές Ταινίες & Μη Ντετερμινισμός.............. 189 6.3.1 Πολλές ταινίες....................... 189 6.3.2 Μη ντετερμινισμός.................... 192 6.4 Προσομοίωση Υπολογιστή με ΜΤ................ 198 6.5 Εναλλακτικοί ορισμοί ΜΤ.................... 200 6.5.1 ΜΤ με ταινία άπειρου μήκους προς μία κατεύθυνση... 201 6.5.2 Ο ρόλος της στοίβας και της ταινίας........... 203 6.6 Γενική ΜΤ............................. 206 6.6.1 Κωδικοποίηση ΜΤ ως συμβολοσειρά........... 206 6.6.2 Η Γενική ΜΤ....................... 208 6.7 Διαδραστικό τεστ......................... 211 Βιβλιογραφία - Αναφορές........................ 211 7 Επιλυσιμότητα - Μη επιλυσιμότητα 213 7.1 Το Πρόβλημα του Τερματισμού.................. 214 7.2 Αποφασίσιμα και Μη αποφασίσιμα Προβλήματα......... 216 7.2.1 Απαρίθμηση μιας γλώσσας................ 220 7.3 Αναγωγές............................. 223 7.4 (Μη) Αποφασίσιμα Προβλήματα για ΜΤ και Γλώσσες..... 226 7.4.1 (Μη) Αποφασίσιμα Προβλήματα για ΜΤ......... 226 7.4.2 Μη Αποφασισιμότητα γλωσσών που δεν αναφέρονται ρητά σε ΜΤ......................... 228 7.5 Το Θεώρημα του Rice...................... 233
vi ΠΕΡΙΕΧ ΟΜΕΝΑ 7.6 Εφαρμογές............................. 235 7.6.1 Μη Αποφασίσιμα Προβλήματα για Προγράμματα.... 235 7.6.2 Λογικές θεωρίες...................... 236 Βιβλιογραφία - Αναφορές........................ 240 8 Υπολογίσιμες Συναρτήσεις 243 8.1 Ορισμός Υπολογίσιμων Συναρτήσεων.............. 243 8.2 Θεωρία Αναδρομικών Συναρτήσεων............... 249 8.2.1 Στοιχειώδεις αναδρομικές συναρτήσεις.......... 250 8.2.2 µ-αναδρομικές συναρτήσεις................ 252 8.3 Θεώρημα Αναδρομής/Σταθερού Σημείου............. 254 8.4 Εφαρμογές............................. 259 Βιβλιογραφία - Αναφορές........................ 259 9 Υπολογιστική Πολυπλοκότητα 261 9.1 Υπολογιστική πολυπλοκότητα προβλημάτων........... 262 9.2 Η κλάση πολυπλοκότητας P................... 265 9.3 Η κλάση πολυπλοκότητας NP.................. 268 9.4 Κλάσεις Χωρικής Πολυπλοκότητας................ 278 Βιβλιογραφία - Αναφορές........................ 278 10 N P -πληρότητα 279 10.1 Αναγωγές πολυωνυμικού χρόνου................. 280 10.2 NP -πληρότητα.......................... 283 Βιβλιογραφία - Αναφορές........................ 285 ΠΑΡΑΡΤΗΜΑ 287 I Μαθηματικό υπόβαθρο 289 I.1 Σύνολα............................... 289 I.2 Σχέσεις.............................. 289 I.3 Συναρτήσεις............................ 289 I.4 Κλειστότητα............................ 289 I.5 Τεχνικές απόδειξης........................ 289 II Προσομοίωση με το JFLAP 291 II.1 Εγκατάσταση........................... 291 II.2 Διεπαφή χρήσης.......................... 291 II.3 Ορισμός γλωσσών και μηχανών................. 291
Πρόλογος Η Θεωρία Υπολογισμού αναπτύχθηκε για να μελετηθούν θεμελιώδη ζητήματα σχετικά με την έννοια του υπολογισμού και τις δυνατότητες των υπολογιστικών μας μηχανών. Ο υπολογισμός είναι μία διεργασία, που εκτελείται σε ένα κλειστό σύστημα που το ονομάζουμε υπολογιστή. Παραδείγματα τέτοιων συστημάτων είναι οι ψηφιακοί μας υπολογιστές, καθώς επίσης και μηχανικοί υπολογιστές όπως ο μηχανισμός των Αντικυθήρων και η μηχανή Babbage, οι κβαντικοί υπολογιστές, οι μοριακοί υπολογιστές κ.ά. Ποιοι υπολογισμοί είναι πραγματοποιήσιμοι και ποιοι υπολογισμοί είναι αδύνατοι; Σήμερα γνωρίζουμε ότι κανένας ηλεκτρονικός υπολογιστής δεν μπορεί να αποφασίσει το αν ένα πρόγραμμα τερματίζει σε πεπερασμένο χρόνο για μία είσοδο. Γιατί συμβαίνει αυτό και γιατί πολλά προβλήματα, όπως το συγκεκριμένο, δεν επιλύονται με τους ηλεκτρονικούς υπολογιστές; Πώς μπορούμε να ξέρουμε αν ένα δοθέν πρόβλημα μπορεί να επιλυθεί και αν αυτό μπορεί να γίνει επαρκώς γρήγορα; Σ ένα άλλο επίπεδο, μελετώντας τις «πρακτικές πτυχές» της υπολογισιμότητας, ενδιαφερόμαστε να απαντήσουμε στο ερώτημα: «Πόσος χρόνος και χώρος χρειάζεται για τον υ- πολογισμό μιας υπολογίσιμης συνάρτησης»; Οι υπολογίσιμες συναρτήσεις συμπεριλαμβάνουν όλες τις συναρτήσεις στο σύνολο των φυσικών αριθμών, που μπορούν να υπολογιστούν σ έναν ιδεατό κόσμο, όπου ο διαθέσιμος υπολογιστικός χρόνος και χώρος είναι απεριόριστος (στην πραγματικότητα δεν ισχύει κάτι τέτοιο). Για να απαντηθούν τα παραπάνω ερωτήματα, οι επιστήμονες εμπνεύστηκαν αφαιρετικά μοντέλα υπολογισμού, όπως οι αναδρομικές συναρτήσεις, ο λογισμός-λ, οι μηχανές Turing και οι μηχανές πεπερασμένων καταστάσεων. Αυτά τα μοντέλα υπολογισμού ορίζονται με μία μαθηματική αυστηρότητα, που είναι αναγκαία για την απόδειξη αποτελεσμάτων πάνω σε ερωτήματα όπως αυτά που αναφέραμε. Η εξέλιξη των παλαιών και των πιο πρόσφατων μοντέλων υπολογισμού πάντα λαμβάνει υπόψη τις ανάγκες των χρηστών των υπολογιστικών συστημάτων και τις νέες δυνατότητες των υπολογιστικών μηχανών. Ενα νέο μοντέλο υπολογισμού, ή μία επέκταση σε κάποιο ήδη υπάρχον, αντικατοπτρίζεται συνήθως σε μία νέα οικογένεια γλωσσών προγραμματισμού και σε νέα ix
x ΠΡΟΛΟΓΟΣ υποδείγματα ανάπτυξης λογισμικού. Γι αυτό το λόγο, η κατανόηση των παραδοσιακών και των αναδυόμενων μοντέλων υπολογισμού διευκολύνει τη χρήση των γλωσσών προγραμματισμού και των εργαλείων ανάπτυξης λογισμικού, μας δίνει πληροφορία για τη χρήση της κατάλληλης γλώσσας για μία συγκεκριμένη εφαρμογή και είναι απαραίτητη για τη σχεδίαση νέων γλωσσών προγραμματισμού. Τα διάφορα μοντέλα υπολογισμού είναι επίσης γνωστά και ως τυπικές γλώσσες. Μία γλώσσα είναι ένα σύνολο συμβολοσειρών. Θα επικεντρωθούμε στα μοντέλα υπολογισμού, που επεξεργάζονται συμβολοσειρές και είναι σε θέση να αναγνωρίσουν αν αυτές ανήκουν στη γλώσσα που αναπαριστούν. Τα μοντέλα αυτά είναι γνωστά στη διεθνή βιβλιογραφία με την ελληνική λέξη «αυτόματα». Ο Ηρωνας από την Αλεξάνδρεια (10-70 μ.χ.) ήταν ο πρώτος που χρησιμοποίησε στα έργα του Αυτοματοποιητική και Πνευματικά τον όρο αυτόματα, για να περιγράψει μηχανές που εκτελούσαν προκαθορισμένες κινήσεις ως συνέπεια μεταβολών στο περιβάλλον (είσοδος). Υπάρχουν πολλά στοιχεία που μαρτυρούν ότι οι έννοιες της υπολογισιμότητας και των υπολογίσιμων συναρτήσεων ήταν γνωστές από τα αρχαία χρόνια. Οχι μόνο οι Ελληνες, αλλά και οι αρχαίοι Αιγύπτιοι είχαν μία καλή κατανόηση των διαφόρων «μεθόδων» υπολογισμού. Ο Πέρσης μαθηματικός Αλ Χουαρίζμι κατά το 825 μ.χ. συνέγραψε βιβλίο υπό τον τίτλο Υπολογισμός με Ινδικούς Αριθμούς, που περιλάμβανε την περιγραφή διαφόρων διαδικασιών, που σήμερα θα αποκαλούσαμε αλγορίθμους. Στο όνομα του συγκεκριμένου μαθηματικού φαίνεται ότι αποδίδεται η προέλευση της λέξης «αλγόριθμος». Οταν το βιβλίο του μεταφράστηκε στα Λατινικά, ο τίτλος του μεταγράφηκε σε Algoritmi de Numero Indorum. Η λέξη «αλγόριθμος» αργότερα χρησιμοποιήθηκε για να περιγράψει την οικογένεια των υπολογιστικών διαδικασιών, που περιγράφονται στο βιβλίο. Συνοπτικά, ένας αλγόριθμος είναι: μία πεπερασμένη περιγραφή ενός υπολογισμού με όρους καλώς ορισμένων στοιχειωδών λειτουργιών (ή εντολών) μία ντεντερμινιστική διαδικασία, τέτοια δηλαδή ώστε το επόμενο βήμα αυτής - αν υπάρχει - έχει οριστεί μοναδικά μία μέθοδος υπολογισμού που πάντα παράγει ένα αποτέλεσμα, ανεξάρτητα από το ποια είναι η είσοδος (δηλαδή ο υπολογισμός που περιγράφεται από έναν αλγόριθμο τερματίζει σε όλες τις περιπτώσεις) Η σύγχρονη Θεωρία Υπολογισμού θεμελιώθηκε πάνω σε ερευνητικές εργασίες από τις αρχές του εικοστού αιώνα, που είχαν στόχο την «τυπική περιγραφή» της έννοιας του αλγορίθμου χωρίς να γίνεται αναφορά σε συγκεκριμένη γλώσσα προγραμματισμού ή υπολογιστική συσκευή με φυσική υπόσταση. Ενα μοντέλο υπολογισμού περιγράφεται αφαιρετικά σε ότι αφορά τις λεπτομέρειες
xi των υλικών της συσκευής, που χρησιμοποιείται στους υπολογισμούς, είτε αυτή είναι ένας άβακας, είτε μολύβι και χαρτί, ή ακόμη η γλώσσα προγραμματισμού και ο επεξεργαστής της προτίμησής μας. Είναι ίσως παράδοξο ότι το πρώτο σύγχρονο μοντέλο υπολογισμού που προτάθηκε είναι εκφραστικά πιο ισχυρό από όλα τα άλλα. Ηταν το 1936, όταν ο Alan Turing ευρισκόμενος στο Πανεπιστήμιο Princeton εισήγαγε ένα θεωρητικό μοντέλο μηχανής, που η πραγματική του σημασία εκτιμήθηκε πολλά χρόνια αργότερα. Πρόκειται για τα αυτόματα που είναι γνωστά ως Μηχανές του Turing και έχουν αποδειχθεί ως το μέχρι σήμερα πιο εκφραστικό μοντέλο, που μπορεί να αναπαραστήσει τον οποιοδήποτε υπολογισμό μιας υπολογιστικής μηχανής. Για τα προβλήματα που αποδεικνύεται ότι δεν επιλύονται από υπολογισμό Μηχανής Turing δεν υπάρχει υπολογιστική μηχανή (αλγόριθμος), που να μπορεί να τα επιλύσει. Η κλάση των συναρτήσεων που υπολογίζονται από τις Μηχανές Turing ταυτίζεται με την κλάση των συναρτήσεων, που υπολογίζεται από δύο άλλα εκφραστικά ισοδύναμα μοντέλα υπολογισμού: το λογισμό-λ, που προτάθηκε από τον Alonzo Church με στόχο να παρέχει μία μαθηματική θεμελίωση, που θα στηρίζεται στην έννοια της συνάρτησης τη θεωρία των αναδρομικών συναρτήσεων, που αρχικά θεμελιώθηκε από τον Kurt Gödel και στη συνέχεια αναπτύχθηκε από τον Stephen Kleene Καθένα από τα προαναφερόμενα μοντέλα υπολογισμού οδήγησε στην ανάπτυξη ενός νέου προγραμματιστικού υποδείγματος, αρχικά του αλγοριθμικού προγραμματισμού (imperative programming) και στη συνέχεια του συναρτησιακού (functional programming) και του αλγεβρικού προγραμματισμού (algebraic programming). Η αρχή που είναι ευρέως γνωστή ως «Θέση του Church» μας λέει ότι η κλάση των υπολογίσιμων συναρτήσεων στο σύνολο των ακεραίων, τελικά δεν διαφέρει και είναι η ίδια, για όλα τα ακολουθιακά μοντέλα υπολογισμού, που ικανοποιούν τα βασικά αξιώματα του ντεντερμινισμού και της εκτέλεσης των στοιχειωδών υπολογιστικών βημάτων σε πεπερασμένο χρόνο. Αυτή η κλάση είναι το σύνολο των μερικών αναδρομικών συναρτήσεων. Σήμερα λέμε ότι μία γλώσσα προγραμματισμού είναι Turing-πλήρης, αν σ αυτή μπορεί να γραφεί η οποιαδήποτε υπολογίσιμη συνάρτηση. Μ αυτή την έννοια, όλες οι γλώσσες προγραμματισμού γενικού σκοπού σήμερα είναι πλήρεις. Η Turing-πληρότητα συνήθως αποδεικνύεται μέσω μιας κωδικοποίησης στη γλώσσα προγραμματισμού ενός τυπικά ορισμένου καθολικού υπολογιστικού μοντέλου.
xii ΠΡΟΛΟΓΟΣ Δύο άλλα πολύ σημαντικά μοντέλα υπολογισμού δημιουργήθηκαν σχεδόν δύο δεκαετίες μετά από την εμφάνιση των Μηχανών Turing, για να καλύψουν υπαρκτές πρακτικές ανάγκες: τα Πεπεραμένα Αυτόματα ή αλλιώς Μηχανές Πεπερασμένων Καταστάσεων και αργότερα, τα Αυτόματα Στοίβας. Οι Μηχανές Πεπερασμένων Καταστάσεων εισήχθησαν από τους νευροφυσιολόγους McCulloch και Walter Pitts το 1943, για να αναπαραστήσουν τη διαδικασία της νευρικής δραστηριότητας. Οι μηχανές αυτές έχουν καθορισμένη δυνατότητα αποθήκευσης πληροφορίας (σε αντίθεση με τις Μηχανές Turing, που δεν έχουν περιορισμούς αποθήκευσης) και οι υπολογισμοί τους τερματίζουν πάντα (σε αντίθεση επίσης με τις Μηχανές Turing) με την αποδοχή ή την απόρριψη μιας εισόδου ως στοιχείο της γλώσσας, που αναπαριστούν. Οι εφαρμογές τους είναι πολλές και περιλαμβάνουν μεταξύ άλλων τη σχεδίαση και την ανάλυση της συμπεριφοράς συστημάτων όπως οι φωτεινοί σηματοδότες, τις αυτόματες μηχανές πώλησης, τα ηλεκτρονικά παιχνίδια, τις μονάδες ελέγχου των CPUs, καθώς επίσης την ανάλυση κειμένου, την ανάλυση πρωτοκόλλων δικτύων και την επεξεργασία φυσικής γλώσσας. Η Θεωρία Υπολογισμού όμως εξελίσσεται συνεχώς, ως αποτέλεσμα της α- νάγκης να κατανοήσουμε νέες μορφές υπολογισμού, που είναι πλέον διάχυτες στην καθημερινότητά μας. Αναφέρουμε ενδεικτικά τα μοντέλα υπολογισμού αντικειμένων, που είναι αντίστοιχα με το λογισμού-λ, όμως με αντικείμενα αντί για συναρτήσεις, τα μοντέλα υπολογισμού με ταυτοχρονισμό, όπως τα Συστήματα Μεταβάσεων με Επιγραφές (Labeled Transition Systems), τα μοντέλα υπολογισμού για συστήματα, που συνδυάζουν συνεχή και διακριτή συμπεριφορά (υβριδικά συστήματα), καθώς επίσης και τα μοντέλα κβαντικού υπολογισμού, όπως και τα μοντέλα για φυσικούς υπολογισμούς (natural computing), που α- ναφέρονται σε φυσικά συστήματα, συμπεριλαμβανομένων των μηχανισμών που χαρακτηρίζουν ζώντες οργανισμούς. Το ηλεκτρονικό βιβλίο Θεωρία Υπολογισμού και Εφαρμογές είναι μία πρωτότυπη παρουσίαση των βασικών αποτελεσμάτων της Θεωρίας Υπολογισμού εμπλουτισμένη με πλήθος εφαρμογών από διάφορα πεδία, προσομοιώσεις, κριτήρια αξιολόγησης, καθώς και εκτεταμένο πολυμεσικό και διαδραστικό περιεχόμενο. Το αναγνωστικό κοινό στο οποίο απευθύνεται είναι κατά βάση οι φοιτητές προπτυχιακών προγραμμάτων σπουδών Πληροφορικής και Ηλεκτρολόγων Μηχανικών. Σχεδόν στο σύνολό τους αυτά τα προγράμματα σπουδών, καθώς επίσης και τα προγράμματα κάποιων άλλων τμημάτων, περιλαμβάνουν τη διδασκαλία της διεθνώς καθιερωμένης ύλης της Θεωρίας Υπολογισμού σε ομώνυμο μάθημα ή σε μάθημα με τον πιο γενικό τίτλο «Θεωρητική Πληροφορική» ή τίτλο που συνδυάζει τους όρους «Αυτόματα» και «Γλώσσες». Το ηλεκτρονικό βιβλίο Θεωρία Υπολογισμού και Εφαρμογές είναι πλήρες ως προς την καθιερωμένη ύλη του αντικειμένου, ενώ ταυτόχρονα παρουσιάζει ε-
xiii φαρμογές, που δεν περιορίζονται στην περιοχή της επιστήμης των υπολογιστών. Οι προσομοιώσεις, η ποικιλία των κριτηρίων αξιολόγησης, το πολυμεσικό υλικό και το διαδραστικό περιεχόμενο αποσκοπούν στην ανάπτυξη της κριτικής σκέψης, στην κινητροποίηση και στην αυτενέργεια των φοιτητών, για την εμβάθυνση στην ύλη και την κατανόησή της. Οι διδακτικοί στόχοι είναι: 1. Η εξοικείωση των φοιτητών με τις θεμελιώσεις και τις αρχές της επιστήμης των υπολογιστών. 2. Η αφομοίωση ύλης πάνω στην οποία στηρίζονται άλλα αντικείμενα, όπως η Θεωρία Γλωσσών Προγραμματισμού και η Αλγοριθμική, που επίσης εντάσσονται στα αναφερόμενα προγράμματα σπουδών. 3. Η καλλιέργεια της ικανότητας των φοιτητών να αναπτύσσουν τυπικά ο- ρισμένους και μαθηματικώς τεκμηριωμένους συλλογισμούς. Το απαραίτητο μαθηματικό υπόβαθρο για την ανάπτυξη της ύλης δίνεται στο Παράρτημα I. Αν ο αναγνώστης είναι ήδη εξοικειωμένος με τη βασική θεωρία συνόλων, τις σχέσεις, τις συναρτήσεις και τις τεχνικές απόδειξης, τότε μπορεί να προχωρήσει αμέσως στην κυρίως ύλη της Θεωρίας Υπολογισμού. Θα πρέπει όμως πριν απ αυτό να κατανοήσει τη σχέση της κλειστότητας, που απαντάται σε πολλά αποτελέσματα της θεωρίας. Σημαντικό ρόλο στην αφομοίωση της ύλης και των λυμένων κριτηρίων α- ξιολόγησης, καθώς και στην επίλυση όσων κριτηρίων προτείνονται για αυτοαξιολόγηση, θα παίξει το ανοικτό λογισμικό προσομοίωσης JFLAP. Το JFLAP υλοποιεί όλα τα μοντέλα υπολογισμού του βιβλίου και τους περισσότερους αλγορίθμους ανάπτυξης και μετασχηματισμού τους. Δεν είναι απλά και μόνο ένα εργαλείο οπτικοποίησης αφαιρετικών εννοιών, αλλά βοηθάει στη γρήγορη δημιουργία σύνθετων μηχανών, όπως αυτές που αναφέρονται σε κάποια κριτήρια αξιολόγησης. Κάθε τέτοια μηχανή πρέπει να δοκιμαστεί διεξοδικά ως προς την ορθότητά της. Με το JFLAP, ο χρόνος που απαιτείται για να γίνει αυτό περιορίζεται δραστικά. Στο Παράρτημα II κάνουμε μία εισαγωγή στη χρήση του JFLAP, αν και αυτή δεν κρύβει δυσκολίες για όποιον είναι εξοικειωμένος με τη διεθνή ορολογία της Θεωρίας Υπολογισμού. Το βιβλίο διαρθρώνεται ως εξής. Στο Κεφάλαιο 1 εισάγεται ο τυπικός ορισμός των γλωσσών, που χρησιμοποιούνται στην Επιστήμη των Υπολογιστών και των ιδιοτήτων τους. Οι γλώσσες είναι σύνολα συμβολοσειρών και κάθε συμβολοσειρά εκφράζει έναν υπολογισμό, δηλαδή την εκτέλεση μιας μηχανής, όπως η Μηχανή του Turing. Εξετάζουμε μοντέλα υπολογισμού, που σχετίζονται με τη διαδικασία αναγνώρισης συγκεκριμένων γλωσσών και παρουσιάζουμε επίσης τη Θέση των Church και Turing για τον τυπικό ορισμό αυτού που σήμερα αντιλαμβανόμαστε ως «μηχανιστικό υπολογισμό» ή αλγόριθμο.
xiv ΠΡΟΛΟΓΟΣ Στο Κεφάλαιο 2 εισάγουμε τα Πεπερασμένα Αυτόματα, που είναι το απλούστερο μοντέλο υπολογισμού από αυτά που θα εξετάσουμε. Αναφερόμαστε επίσης τις Κανονικές Εκφράσεις, μία εναλλακτική αναπαράσταση κανονικών γλωσσών, η οποία περιγράφει τον τρόπο που παράγονται οι συμβολοσειρές μιας γλώσσας. Στο Κεφάλαιο 3 αναπτύσσουμε αποτελέσματα για την εύρεση της πιο σύντομης και οικονομικής περιγραφής των γλωσσών, που αναπαριστούν τα Πεπερασμένα Αυτόματα. Περιγράφουμε επίσης ένα αποτέλεσμα, που χρησιμοποιείται για να δίνουμε απάντηση στο ερώτημα αν μία γλώσσα μπορεί να αναπαρασταθεί από Πεπερασμένο Αυτόματο ή όχι. Στο Κεφάλαιο 4 εισάγουμε μία άλλη οικογένεια γλωσσών, που λέγονται Γλώσσες Χωρίς Συμφραζόμενα. Για τις γλώσσες αυτές ορίζουμε τυπικά μία α- ναπαράσταση, που λέγεται Γραμματική Χωρίς Συμφραζόμενα και όπως οι κανονικές εκφράσεις περιγράφει το πώς παράγονται οι συμβολοσειρές της γλώσσας. Στο Κεφάλαιο 5 ορίζουμε και μελετάμε τις ιδιότητες μηχανών αναγνώρισης γλωσσών χωρίς συμφραζόμενα, που είναι γνωστές ως Αυτόματα Στοίβας. Τα Αυτόματα Στοίβας παρέχουν το θεωρητικό πλαίσιο για την κατασκευή αλγορίθμων επεξεργασίας γλωσσών χωρίς συμφραζόμενα. Στο Κεφάλαιο 6 εισάγουμε τους βασικούς ορισμούς για τις διάφορες χρήσεις των Μηχανών Turing, όπως για παράδειγμα αποδοχή μιας γλώσσας και τον υ- πολογισμό μιας συνάρτησης. Επίσης αναφερόμαστε σε διάφορες παραλλαγές των Μηχανών Turing, που όμως έχουν αποδειχθεί ότι δεν αυξάνουν τις δυνατότητες περιγραφής υπολογισμών, που διαθέτουν οι βασικές Μηχανές Turing. Στο Κεφάλαιο 7 αποδεικνύουμε ότι υπάρχουν προβλήματα, που δεν επιλύονται από κανένα υπολογιστικό μοντέλο από αυτά που εξετάσαμε. Δείχνουμε επίσης το πώς μπορούμε να αναλύουμε τα διάφορα προβλήματα, για να δείξουμε το αν αυτά είναι επιλύσιμα ή όχι. Στο Κεφάλαιο 8 αναφερόμαστε στον υπολογισμό συναρτήσεων με οποιοδήποτε πεδίο τιμών και αναπτύσσουμε μία θεωρία, που μελετά το τι ακριβώς υπολογίζεται και τι όχι, καθώς και τις ιδιότητες συναρτήσεων διαφορετικών κλάσεων, ως προς την υπολογισιμότητά τους. Στο Κεφάλαιο 9 εστιάζουμε στο γεγονός ότι τα προγράμματα, που σχεδιάζουμε, έχουν συγκεκριμένες απαιτήσεις σε πόρους χρόνου και χώρου. Ε- πομένως μπορεί ένα πρόβλημα να είναι θεωρητικά επιλύσιμο, αλλά «πρακτικά» μη επιλύσιμο, καθώς για μεγάλες εισόδους οι απαιτήσεις του σε πόρους μπορεί να αυξάνονται τόσο γρήγορα, που τελικά να γίνονται μη ρεαλιστικές. Για το λόγο αυτό ορίζουμε ιεραρχίες κλάσεων γλωσσών με βάση το χρόνο ή τον χώρο, που απαιτεί ο καλύτερος γνωστός αλγόριθμος για το κάθε πρόβλημα (κλάσεις πολυπλοκότητας). Στο Κεφάλαιο 10 δείχνουμε ότι όλα τα προβλήματα σε μία θεωρητικά ση-
xv μαντική κλάση πολυπλοκότητας μετασχηματίζονται μέσω αναγωγών σε κάποια θεμελιώδη προβλήματα πολυπλοκότητας. Κλείνοντας τον Πρόλογο θα ήθελα να εκφράσω τις ευχαριστίες μου στην ομάδα υποστήριξης αυτής της συγγραφικής προσπάθειας, χωρίς τη συμβολή της οποίας δε θα ήταν δυνατή η ολοκλήρωση του έργου. Την τεχνική επεξεργασία του ηλεκτρονικού βιβλίου έκανε η Εμμανουέλα Στάχτιαρη και τη γλωσσική επιμέλεια ο Βασίλειος Παππάς. Ως κριτικός αναγνώστης ο συνάδελφος Ιωάννης Σταμέλος συνεισέφερε στη βελτίωση της παρουσίασης της ύλης με πολλές εύστοχες παρατηρήσεις στο αρχικό κείμενο. Θεσσαλονίκη, Δεκέμβριος 2015 Παναγιώτης Κατσαρός Επ. Καθηγητής Α.Π.Θ.
xvi ΠΡΟΛΟΓΟΣ
Κεφάλαιο 1 Γλώσσες και Υπολογισμοί Σύνοψη Θεμελιώδη σημασία σε κάθε υπολογισμό έχει η αναπαράσταση της πληροφορίας που επεξεργαζόμαστε. Στην καθημερινή μας ζωή, η πληροφορία που επικοινωνούμε και επεξεργαζόμαστε διατυπώνεται σε μία φυσική γλώσσα, όπως είναι τα Ελληνικά. Κάθε τέτοια φυσική γλώσσα στηρίζεται σ ένα πεπερασμένο σύνολο βασικών φωνολογικών ενοτήτων για το σχηματισμό λέξεων και προτάσεων. Οι λέξεις ορίζονται ως πεπερασμένες ακολουθίες τέτοιων φωνολογικών ενοτήτων (συλλαβές) και οι προτάσεις σχηματίζονται ως πεπερασμένες ακολουθίες λέξεων. Στο γραπτό λόγο, κάθε φυσική γλώσσα χρησιμοποιεί ένα πεπερασμένο σύνολο συμβόλων και οι λέξεις γράφονται ως πεπερασμένες ακολουθίες αυτών. Αντίστοιχες προσεγγίσεις έχουν αναπτυχθεί για την αναπαράσταση στοιχείων άλλων συνόλων. Για παράδειγμα, ένας φυσικός αριθμός αναπαριστάται ως πεπερασμένη ακολουθία ψηφίων του δεκαδικού συστήματος αρίθμησης. Οι υπολογισμοί, όπως και οι φυσικές γλώσσες, επεξεργάζονται πληροφορίες, που μπορεί να περιλαμβάνουν ακέραιους, γραφήματα, προγράμματα ή άλλες οντότητες, που σε όλες τις περιπτώσεις θα πρέπει να αναπαριστώνται σε μία γενική μορφή. Στην πραγματικότητα οι υπολογισμοί τελικά επεξεργάζονται συμβολοσειρές, που αναπαριστούν τα αντικείμενα που περιλαμβάνει η πληροφορία. Στη Θεωρία Υπολογισμού, κάθε συμβολοσειρά εκφράζει έναν υπολογισμό, δηλαδή την εκτέλεση μιας μηχανής, όπως η Μηχανή του Turing. Αυτό ι- σχύει, επειδή κάθε τυπικά ορισμένη μηχανή ή μοντέλο υπολογισμού εκτελεί υπολογισμούς, που εξαρτώνται από το πρόγραμμα, που φορτώνεται και από την είσοδο που δέχεται μέσω μιας «ταινίας εισόδου». Στα περισσότερα συστήματα αρκεί να εξετάσουμε υπολογισμούς με πεπερασμένες συμβολοσειρές. Άπειρες σε μήκος συμβολοσειρές χρησιμοποιούνται στη μελέτη των υπολογισμών αλ- 1
2 ΚΕΦ ΑΛΑΙΟ 1. ΓΛΩΣΣΕΣ ΚΑΙ ΥΠΟΛΟΓΙΣΜΟΙ ληλεπιδραστικών συστημάτων (reactive systems), όπως είναι τα λειτουργικά συστήματα, που υποτίθεται ότι εκτελούνται - τουλάχιστο σε αντιληπτικό και μαθηματικό επίπεδο - για πάντα. Τέτοιου είδους συμπεριφορές τελικά δε μπορούν να μοντελοποιηθούν σ ένα υψηλό επίπεδο χρησιμοποιώντας αποκλειστικά συμβολοσειρές πεπερασμένου μήκους. Η μελέτη των συμβολοσειρών και των γλωσσών είναι σημαντική για τη θεωρία της Επιστήμης των Υπολογιστών. Μετρώντας του χρόνους εκτέλεσης ή τις απαιτήσεις αποθήκευσης των προγραμμάτων ως προς τα μήκη των συμβολοσειρών εισόδου τους, μπορούμε να χαρακτηρίσουμε την πολυπλοκότητά τους σε υπολογιστικό χρόνο και χώρο. Μελετώντας πρότυπα που ακολουθούνται από σύνολα συμβολοσειρών, μπορούμε να ταξινομήσουμε το βαθμό στον οποίο επιλύονται τα διάφορα προβλήματα. Στο κεφάλαιο αυτό επικεντρωνόμαστε στον τυπικό ορισμό των γλωσσών που χρησιμοποιούμε στην Επιστήμη των Υπολογιστών και των ιδιοτήτων τους. Εξετάζουμε μοντέλα υπολογισμού, που σχετίζονται με τη διαδικασία αναγνώρισης συγκεκριμένων γλωσσών και τελικά παρουσιάζουμε μία κατάταξη των τυπικά ορισμένων γλωσσών σε κλάσεις, ανάλογα με το μοντέλο υπολογισμού που τις αναγνωρίζει. Παρουσιάζουμε επίσης τη Θέση των Church και Turing για τον τυπικό ορισμό αυτού που σήμερα αντιλαμβανόμαστε ως «μηχανιστικό υπολογισμό» ή αλγόριθμο και εισάγουμε την έννοια του μη ντεντερμινισμού. Το κεφάλαιο κλείνει με μία αναφορά σε επεκτάσεις των κλασικών μοντέλων υπολογισμού και στις εφαρμογές τους. 1.1 Συμβολοσειρές Οι χαρακτήρες ή αλλιώς τα σύμβολα των συμβολοσειρών είναι πάντα στοιχεία ενός πεπερασμένου, μη κενού διατεταγμένου συνόλου συμβόλων, που το λέμε αλφάβητο. Παράδειγμα 1.1 (Αλφάβητα γλωσσών) Παρακάτω δίνουμε παραδείγματα γνωστών συνόλων, που χρησιμοποιούνται ως αλφάβητα: το Ελληνικό αλφάβητο {α, β,..., ω} το Λατινικό αλφάβητο {a, b,... z} το «δυαδικό» αλφάβητο {0, 1}
1.1. ΣΥΜΒΟΛΟΣΕΙΡΕΣ 3 Συμβολοσειρά είναι μία πεπερασμένη ακολουθία συμβόλων ενός αλφαβήτου. Μία συμβολοσειρά που αποτελείται από τα σύμβολα a 1, a 2,..., a n θα τη γράφουμε με απλή παράθεσή τους ως a 1 a 2... a n. Η συμβολοσειρά που έχει μηδέν σύμβολα λέγεται κενή συμβολοσειρά και συμβολίζεται με ɛ. Το σύνολο όλων των συμβολοσειρών ενός αλφαβήτου Σ το αναπαριστούμε κατά σύμβαση με Σ. Το μήκος της συμβολοσειράς w = a 1 a 2... a n συμβολίζεται με w και είναι n, δηλαδή ίσο με τον αριθμό των συμβόλων της συμβολοσειράς. Για οποιοδήποτε σύμβολο c και συμβολοσειρά w, η συνάρτηση # c (w) επιστρέφει το πόσες φορές εμφανίζεται το σύμβολο c στη w. Παράδειγμα 1.2 (Συμβολοσειρές και μήκος συμβολοσειρών) Παραδείγματα συμβολοσειρών από διαφορετικά αλφάβητα: Αλφάβητο Σύμβολα αλφαβήτου Συμβολοσειρές Το Ελληνικό αλφάβητο {α, β,..., ω} ɛ, ενα, τρια Το Λατινικό αλφάβητο {a, b,... z} ɛ, one, three Το «δυαδικό» αλφάβητο {0, 1} ɛ, 0, 01011 Για κάποιες από τις παραπάνω συμβλοσειρές έχουμε: ɛ = 0 τρια = 4 01011 = 5 # 0 (01011) = 2 Παράθεση δύο συμβολοσειρών u και w είναι η συμβολοσειρά που γράφεται ως uw και σχηματίζεται με απλή παράθεση της ακολουθίας συμβόλων της w αμέσως μετά από τα σύμβολα της u. Σ αυτή την περίπτωση θα έχουμε uw = u + w. Η κενή συμβολοσειρά είναι το ουδέτερο στοιχείο για την παράθεση συμβολοσειρών ενός αλφαβήτου Σ, δηλαδή ισχύει w Σ, wɛ = ɛw = w Επίσης, η παράθεση ως συνάρτηση που ορίζεται στο σύνολο των συμβολοσειρών έχει την προσεταριστική ιδιότητα, δηλαδή u, v, w Σ, ((uv)w) = (u(vw))
4 ΚΕΦ ΑΛΑΙΟ 1. ΓΛΩΣΣΕΣ ΚΑΙ ΥΠΟΛΟΓΙΣΜΟΙ Επανάληψη w i μιας συμβολοσειράς w για έναν οποιοδήποτε φυσικό αριθμό i είναι η συμβολοσειρά, που ορίζεται επαγωγικά ως εξής: Εχουμε για παράδειγμα: w 0 = ɛ w i+1 = w i w (01) 2 = 0101 Τέλος, ορίζουμε την αντίστροφη w R μιας συμβολοσειράς w πάλι επαγωγικά, ως εξής: Αν w = 0 τότε w R = w = ɛ Αν w 1 τότε α Σ, u Σ ώστε w = uα και w R = αu R Θεώρημα 1.1 (Παράθεση και αντιστροφή συμβολοσειρών) Για δύο οποιεσδήποτε συμβολοσειρές u και w ισχύει (uw) R = w R u R Απόδειξη: Η απόδειξη γίνεται με επαγωγή ως προς w. Μία συμβολοσειρά u είναι υποσυμβολοσειρά της w αν και μόνο αν η u εμφανίζεται σε συνεχόμενες θέσεις ως ένα μέρος της w. Μία συμβολοσειρά u είναι κανονική υποσυμβολοσειρά της w αν και μόνο αν η u είναι υποσυμβολοσειρά της w και συγχρόνως u w. Κάθε συμβολοσειρά είναι υποσυμβολοσειρά (όχι όμως κανονική υποσυμβολοσειρά) του εαυτού της. Η κενή συμβολοσειρά ɛ είναι υποσυμβολοσειρά κάθε άλλης συμβολοσειράς. Μία συμβολοσειρά u είναι κατάληξη της w αν και μόνο αν v Σ, w = vu. Μία συμβολοσειρά u είναι κανονική κατάληξη της w, αν και μόνο αν η u είναι κατάληξη της w και συγχρόνως u w. Η κενή συμβολοσειρά ɛ είναι κατάληξη κάθε άλλης συμβολοσειράς. Από την άλλη, μία συμβολοσειρά u είναι πρόθεμα της w αν και μόνο αν v Σ, w = uv. Η συμβολοσειρά u είναι κανονικό πρόθεμα της w, αν και μόνο αν η u είναι πρόθεμα της w και συγχρόνως u w. Η κενή συμβολοσειρά ɛ είναι πρόθεμα κάθε άλλης συμβολοσειράς. Η αναζήτηση πληροφορίας είναι μία από τις πιο σημαντικές επεξεργασίες και στις περισσότερες περιπτώσεις στηρίζεται στην ύπαρξη κάποιας σχέσης, που ορίζει μία διάταξη μεταξύ των οντοτήτων του συνόλου αναζήτησης. Μία
1.1. ΣΥΜΒΟΛΟΣΕΙΡΕΣ 5 ευρέως χρησιμοποιούμενη σχέση μεταξύ συμβολοσειρών είναι η σύγκρισή τους αλφαβητικά με το ίδιο κριτήριο, που αυτές διατάσσονται σε κάθε ταξινομημένη λίστα όπως ο τηλεφωνικός κατάλογος. Η συγκεκριμένη σχέση και διάταξη των συμβολοσειρών ορίζεται ως εξής: Ορισμός 1.1 (Αλφαβητική διάταξη συμβολοσειρών) Για δύο συμβολοσειρές u και w στο αλφάβητο Σ λέμε ότι η u είναι αλφαβητικά μικρότερη από τη συμβολοσειρά w στο Σ ή ισοδύναμα ότι η w είναι αλφαβητικά μεγαλύτερη από την u, αν ισχύει κάποια από τις παρακάτω δύο περιπτώσεις: η u είναι κανονικό πρόθεμα της w, ή για κάποια v Σ και κάποια σύμβολα α, β Σ τέτοια ώστε το α να προηγείται του β στο Σ, η συμβολοσειρά vα είναι πρόθεμα της u και η vβ να είναι πρόθεμα της w. Ενα διατεταγμένο υποσύνολο του Σ λέμε ότι είναι σε αλφαβητική διάταξη, αν για κάθε δύο συμβολοσειρές u, w, με την u να προηγείται της w μέσα στο υποσύνολο, δε συμβαίνει η w να είναι αλφαβητικά μικρότερη από την u στο Σ. Παράδειγμα 1.3 (Αλφαβητική διάταξη) Ας θεωρήσουμε το αλφάβητο Σ = {0, 1}. Η συμβολοσειρά 01 είναι αλφαβητικά μικρότερη στο Σ από τη συμβολοσειρά 01100, επειδή η 01 είναι κανονικό πρόθεμα της 01100. Από την άλλη μεριά, η 01100 είναι αλφαβητικά μικρότερη από την 0111, επειδή οι δύο συμβολοσειρές συμφωνούν στα τρία πρώτα σύμβολά τους και το τέταρτο σύμβολο της 01100 είναι μικρότερο από το τέταρτο σύμβολο της 0111. Στο σύνολο Σ = {ɛ, 0, 00, 000, 001, 01, 010, 011, 1, 10, 100, 101, 11, 110, 111} των συμβολοσειρών με μήκος όχι μεγαλύτερο του 3 τα στοιχεία του απαριθμούνται σε αλφαβητική διάταξη. Η αλφαβητική διάταξη είναι ένα επαρκές κριτήριο για πεπερασμένα σύνολα, επειδή σ ένα τέτοιο σύνολο μπορεί τελικά να προσεγγιστεί η κάθε συμβολοσειρά που περιέχεται σ αυτό. Ομως στην περίπτωση άπειρων συνόλων συμβολοσειρών η αλφαβητική ταξινόμηση δεν είναι ικανοποιητική, επειδή μπορεί για κάποιες συμβολοσειρές ο αριθμός όσων προηγούνται να μην είναι φραγμένος. Μία τέτοια περίπτωση είναι για παράδειγμα αυτή της συμβολοσειράς 1 στο αλφαβητικά ταξινομημένο σύνολο {0, 1}, εκεί δηλαδή που οι συμβολοσειρές
6 ΚΕΦ ΑΛΑΙΟ 1. ΓΛΩΣΣΕΣ ΚΑΙ ΥΠΟΛΟΓΙΣΜΟΙ 0, 00, 000,... προηγούνται της συμβολοσειράς 1. Το συγκεκριμένο πρόβλημα καταδεικνύει την αναγκαιότητα του παρακάτω ορισμού της λεξικογραφικής διάταξης των συμβολοσειρών. Με τη συγκεκριμένη διάταξη, ο αριθμός των συμβολοσειρών που προηγούνται μιας δοθείσης συμβολοσειράς είναι πάντα πεπερασμένος. Ορισμός 1.2 (Κανονική ή λεξικογραφική διάταξη) Για δύο συμβολοσειρές u και w στο αλφάβητο Σ λέμε ότι η u είναι κανονικά ή λεξικογραφικά μικρότερη από τη συμβολοσειρά w στο Σ ή ισοδύναμα ότι η w είναι λεξικογραφικά μεγαλύτερη από την u, αν ισχύει κάποια από τις παρακάτω δύο περιπτώσεις: η u έχει μικρότερο μήκος από την w, ή οι u και w έχουν το ίδιο μήκος, αλλά η u είναι αλαφαβητικά μικρότερη από την w. Ενα διατεταγμένο υποσύνολο του Σ λέμε ότι είναι διατεταγμένο κανονικά ή λεξικογραφικά, αν για κάθε δύο συμβολοσειρές u, w, με την u να προηγείται της w μέσα στο υποσύνολο, δε συμβαίνει η w να είναι κανονικά μικρότερη από την u στο Σ. Παράδειγμα 1.4 (Κανονική ή λεξικογραφική διάταξη) Ας θεωρήσουμε το αλφάβητο Σ = {0, 1}. Η συμβολοσειρά 11 είναι λεξικογραφικά μικρότερη στο Σ από τη συμβολοσειρά 000, επειδή η 11 έχει μικρότερο μήκος από την 000. Από την άλλη μεριά, η 00 είναι λεξικογραφικά μικρότερη από την 11, επειδή οι δύο συμβολοσειρές έχουν ίσο μήκος και η 00 είναι αλφαβητικά μικρότερη από την 11. Το σύνολο Σ = {ɛ, 0, 1, 00, 01, 10, 11, 000, 001,...} είναι σε λεξικογραφική διάταξη. Επιστρέφουμε τώρα στο ζήτημα της αναπαραστάσης της πληροφορίας με βάση της έννοιες των συμβολοσειρών ως προς ένα αλφάβητο, που ορίσαμε παραπάνω. Κάθε τέτοια αναπαράσταση μπορούμε να την ορίσουμε ως μία αντιστοίχιση αντικειμένων σε συμβολοσειρές με βάση κάποιους κανόνες. Τυπικά, μία αναπαράσταση ή κωδικοποίηση ενός συνόλου D σ ένα αλφάβητο Σ είναι μία συνάρτηση f από το D στο 2 Σ, που ικανοποιεί την παρακάτω συνθήκη: για δύο οποιαδήποτε στοιχεία e 1 και e 2 του D, τα f(e 1 ) και f(e 2 ) είναι διακριτά μη κενά σύνολα. Σ αυτή την περίπτωση, κάθε στοιχείο του f(e) θα λέμε ότι είναι μία αναπαράσταση ή κωδικοποίηση του e.
1.2. ΓΛ ΩΣΣΕΣ ΚΑΙ ΠΡΆΞΕΙΣ ΓΛΩΣΣ ΩΝ 7 Παράδειγμα 1.5 (Κωδικοποίηση με συμβολοσειρές) Μία αναπαράσταση των φυσικών αριθμών με βάση το αλφάβητο Σ = {0, 1} μπορεί να είναι η συνάρτηση f 1 με f 1 (0) = {0, 00, 0000,...}, f 1 (1) = {1, 01, 001, 0001,...}, f 1 (2) = {10, 010, 0010, 00010,...}, f 1 (3) = {11, 011, 0011, 00011,...} κλπ. Εναλλακτικά, μία άλλη αναπαράσταση f 2 των φυσικών αριθμών με το ίδιο αλφάβητο θα μπορούσε να αντιστοιχεί στον i- οστό φυσικό αριθμό το σύνολο, που αποτελείται από την i-οστή λεξικογραφικά μικρότερη συμβολοσειρά στο Σ. Σ αυτή την περίπτωση θα είχαμε f 2 (0) = {ɛ}, f 2 (1) = {0}, f 2 (2) = {1}, f 2 (3) = {00}, f 2 (4) = {01}, f 2 (5) = {10} κλπ. 1.2 Γλώσσες και πράξεις γλωσσών Οι συμβολοσειρές είναι ένα μέσο αναπαράστασης της πληροφορίας στο βαθμό όμως που υπάρχει μία συνάρτηση, που παρέχει την ερμηνεία των συμβολοσειρών ως προς την πληροφορία, που αυτές αναπαριστούν. Μία ερμηνεία είναι το αντίστροφο της αντιστοίχισης, που προκύπτει από μία αναπαράσταση, δηλαδή μία ερμηνεία είναι κάποια συνάρτηση g από το Σ στο σύνολο D των αντικειμένων της πληροφορίας, για κάποιο αλφάβητο Σ. Για παράδειγμα, η συμβολοσειρά 111, ερμηνεύεται ως ο αριθμός εκατόν έντεκα σε αναπαράσταση αριθμού στο δεκαδικό σύστημα ή ως ο αριθμός επτά σε αναπαράσταση αριθμού του δυαδικού συστήματος. Κατά την επικοινωνία δύο μερών η πληροφορία που μεταβιβάζεται είναι άρρηκτα δεμένη με την αναπαράσταση και την ερμηνεία της. Η αναπαράστασή της παρέχεται από τον αποστολέα και η ερμηνεία της από τον παραλήπτη. Κατά συνέπεια, από τη σκοπιά των δύο μερών της επικοινωνίας, μία γλώσσα μπορεί απλά να είναι μία συλλογή συμβολοσειρών, καθώς οι συναρτήσεις αναπαράστασης και ερμηνείας είναι γνωστές στα μέρη. Παράδειγμα 1.6 (Γλώσσες που χρησιμοποιούμε) Αναφέρουμε παραδείγματα γλωσσών, που χρησιμοποιούμε στην καθημερινή μας ζωή: Το σύνολο των επιτρεπτών ονομάτων στη γλώσσα προγραμματισμού C. Η γλώσσα των επιτρεπτών αλγεβρικών εκφράσεων, που σχηματίζονται με το όνομα (μεταβλητής) a, τους δυαδικούς τελεστές + και και τη χρήση παρενθέσεων. Δύο από τις συμβολοσειρές αυτής της γλώσσας είναι οι a + a a και (a + a (a + a)).
8 ΚΕΦ ΑΛΑΙΟ 1. ΓΛΩΣΣΕΣ ΚΑΙ ΥΠΟΛΟΓΙΣΜΟΙ Η γλώσσα των συμβολοσειρών με αριστερές και δεξιές παρενθέσεις σε ισορροπημένα ζεύγη. Μερικές συμβολοσειρές αυτής της γλώσσας είναι οι ɛ, ()(()) και (((()))). Το σύνολο των επιτρεπτών προγραμμάτων στη C++. 1.2.1 Ορισμός γλωσσών Μία γλώσσα είναι ένα πεπερασμένο ή άπειρο σύνολο συμβολοσειρών ενός πεπερασμένου αλφάβητου Σ, δηλαδή κάθε γλώσσα είναι υποσύνολο του Σ. Για τον ορισμό γλωσσών χρησιμοποιούμε διάφορες τεχνικές. Καθώς οι γλώσσες είναι σύνολα ένας τρόπος ορισμού τους είναι η χρήση τεχνικών ορισμού συνόλων. Παράδειγμα 1.7 (Ορισμός γλώσσας) Εστω η γλώσσα L = {w {0, 1} : τα 0 προηγούνται όλων των 1}. Οι συμβολοσειρές ɛ, 0, 00, 00111 και 11 ανήκουν στην L. Προσέξτε ότι κάποιες συμβολοσειρές ικανοποιούν με τετριμμένο τρόπο την απαίτηση για να ανήκουν στην L. Πιο συγκεκριμένα, αν σε μία συμβολοσειρά δεν υπάρχουν καθόλου 0 ή καθόλου 1, τότε δεν υπάρχει τρόπος να παραβιαστεί η απαίτηση και γι αυτό το λόγο οι ɛ, 0, 00 και 11 ικανοποιούν την απαίτηση με τετριμμένο τρόπο και ανήκουν στην L. Παράδειγμα 1.8 (Ορισμός γλώσσας) Παρακάτω δίνουμε κάποια παραδείγματα γλωσσών με αλφάβητο το {α, b}. Η κενή γλώσσα. Η πεπερασμένη γλώσσα {ɛ, α, αbb}. Η γλώσσα με τις καρκινικές ή παλίνδρομες συμβολοσειρές του {α, b}, δηλαδή τις συμβολοσειρές όπως η αbbα, που διαβάζονται με τον ίδιο τρόπο από τα αριστερά προς τα δεξιά και αντίστροφα. {w {α, b}, # α (w) > # b (w)} {w {α, b}, w 2 και η w αρχίζει και τελειώνει με b}
1.2. ΓΛΩΣΣΕΣ ΚΑΙ ΠΡΑΞΕΙΣ ΓΛΩΣΣΩΝ 9 Η μικρότερη γλώσσα για οποιοδήποτε αλφάβητο είναι η, που έχει πληθικό αριθμό 0. Η μεγαλύτερη γλώσσα για ένα αλφάβητο Σ είναι η Σ. Ποιος είναι όμως ο πληθικός αριθμός της Σ ; Αν Σ =, τότε Σ = {ɛ} και Σ = 1. Για την περίπτωση που το Σ είναι μη κενό έχουμε: Θεώρημα 1.2 (Πληθικός αριθμός του Σ ) Αν Σ τότε η Σ είναι αριθμήσιμα άπειρη. Απόδειξη: Τα στοιχεία της Σ μπορούν να απαριθμηθούν λεξικογραφικά. Από το παραπάνω θεώρημα και επειδή κάθε γλώσσα μ ένα αλφάβητο Σ είναι υποσύνολο του Σ συμπεραίνουμε ότι όλες οι γλώσσες είτε είναι πεπερασμένες, είτε είναι αριθμήσιμα άπειρες. Το σύνολο των γλωσσών, που μπορούν να οριστούν για ένα αλφάβητο Σ είναι το δυναμοσύνολο 2 Σ, δηλαδή το σύνολο με στοιχεία όλα τα υποσύνολα του Σ. Αν Σ =, τότε Σ = {ɛ} και το δυναμοσύνολο 2 Σ είναι το {, {ɛ}}. Για την περίπτωση που το Σ είναι μη κενό έχουμε: Θεώρημα 1.3 (Αριθμός των γλωσσών ενός αλφαβήτου) Αν Σ τότε το σύνολο των γλωσσών με αλφάβητο Σ είναι μη αριθμήσιμα άπειρο. Απόδειξη: 2 Σ.... Το σύνολο των γλωσσών με αλφάβητο Σ είναι το δυναμοσύνολο 1.2.2 Πράξεις μεταξύ γλωσσών Καθώς οι γλώσσες είναι σύνολα, οι γνωστές πράξεις μεταξύ συνόλων είναι καλά ορισμένες πράξεις μεταξύ γλωσσών. Οι πιο χρήσιμες απ αυτές είναι η ένωση, η τομή, η διαφορά και το συμπλήρωμα. Ειδικά για το συμπλήρωμα μιας γλώσσας, αυτό ορίζεται ως προς το σύνολο Σ όλων των πιθανών συμβολοσειρών με το αλφάβητο της γλώσσας, εκτός και αν ρητά αναφέρεται κάτι διαφορετικό. Η ένωση δύο γλωσσών L 1 και L 2 συμβολίζεται με L 1 L 2 και είναι η γλώσσα με τις συμβολοσειρές, που ανήκουν στην L 1 ή στην L 2, δηλαδή η {w, w L 1 ή w L 2 }. Η τομή της L 1 με την L 2 συμβολίζεται με L 1 L 2
10 ΚΕΦ ΑΛΑΙΟ 1. ΓΛΩΣΣΕΣ ΚΑΙ ΥΠΟΛΟΓΙΣΜΟΙ και είναι η γλώσσα με όλες τις συμβολοσειρές, που ανήκουν τόσο στην L 1 όσο και στην L 2, δηλαδή η {w, w L 1 και w L 2 }. Το συμπλήρωμα μιας γλώσσας L με αλφάβητο Σ συμβολίζεται με L και αναφέρεται στη γλώσσα, που αποτελείται από όλες τις συμβολοσειρές του Σ, που δεν ανήκουν στην L, δηλαδή τη {w, w Σ και w L}. Η διαφορά δύο γλωσσών L 1 και L 2 συμβολίζεται με L 1 L 2 και αναφέρεται στη γλώσσα, που αποτελείται από όλες τις συμβολοσειρές, που ανήκουν στην L 1, αλλά δεν ανήκουν στην L 2, δηλαδή την {w, w L 1 και w L 2 }. Τρεις ιδιαίτερα σημαντικές πράξεις μεταξύ γλωσσών ορίζονται με τη χρήση πράξεων μεταξύ συμβολοσειρών, που έχουμε ήδη ορίσει. Η παράθεση δύο γλωσσών L 1 και L 2 με αλφάβητο Σ είναι η γλώσσα: L 1 L 2 = {w Σ : w = uv για u L 1, v L 2 } Η παράθεση γλωσσών είναι προσεταιριστική πράξη, δηλαδή για όλες τις γλώσσες L 1, L 2 και L 3 ισχύει: (L 1 L 2 )L 3 = L 1 (L 2 L 3 ) Εστω τώρα η γλώσσα L με αλφάβητο Σ. Η κλειστότητα ή αλλιώς Kleene star της L είναι η γλώσσα: L = {ɛ} {w Σ : k 1, w = w 1 w 2... w k για w 1, w 2,... w k L} δηλαδή η L είναι το σύνολο των συμβολοσειρών, που σχηματίζονται με παράθεση μηδέν ή περισσότερων συμβολοσειρών της L. Αν η L δεν είναι κενή και δεν είναι η {ɛ}, τότε η L σίγουρα περιέχει έναν άπειρο αριθμό συμβολοσειρών. Αν L =, τότε L = {ɛ}, καθώς δεν υπάρχουν συμβολοσειρές, που θα μπορούσαν να παρατεθούν στην ɛ. Αν τώρα L = {ɛ}, τότε η L είναι επίσης η {ɛ}. Η γλώσσα με συμβολοσειρές, που δίνονται ως παράθεση τουλάχιστο ενός στοιχείου της L γράφεται ως: L + = LL Εστω πάλι η γλώσσα L με αλφάβητο Σ. Η αντίστροφη της L είναι η γλώσσα: L R = {w Σ : w = v R για κάποια v L} δηλαδή η L R είναι το σύνολο των συμβολοσειρών, που σχηματίζονται από την αντιστροφή κάποιας συμβολοσειράς της L.
1.2. ΓΛΩΣΣΕΣ ΚΑΙ ΠΡΑΞΕΙΣ ΓΛΩΣΣΩΝ 11 1.2.3 Παραγωγή και αναγνώριση γλωσσών στη Θεωρία Υπολογισμού Καθώς οι γλώσσες είναι σύνολα, από υπολογιστικής άποψης ο ορισμός μιας γλώσσας μπορεί να είναι: ένας παραγωγός συμβολοσειρών, που περιγράφει το πώς παράγονται όλα τα στοιχεία της γλώσσας ή ένας αναγνωριστής συμβολοσειρών, που αποφασίζει αν μία συμβολοσειρά ανήκει ή δεν ανήκει στη γλώσσα. Στη Θεωρία Υπολογισμού, κάθε πρόβλημα που επιθυμούμε να επιλύσουμε το διατυπώνουμε πρώτα χρησιμοποιώντας μία αναπαράσταση με συμβολοσειρές. Τα αποτελέσματα που έχουμε δίνουν απάντηση στο ερώτημα «Ανήκει η w στη γλώσσα L;», που είναι ένα πρόβλημα απόφασης. Το ερώτημα που λογικά προκύπτει είναι αν μία θεωρία που περιορίζεται σ αυτού του τύπου τα αποτελέσματα είναι πρακτικά χρήσιμη στη μελέτη πραγματικών υπολογιστικών προβλημάτων. Παρατηρούμε λοιπόν ότι με την κατάλληλη αναπαράσταση, πολλά προβλήματα της καθημερινότητας μπορούν να αναδιατυπωθούν ως πρόβλημα απόφασης του αν μία συμβολοσειρά ανήκει σε μία γλώσσα ή όχι. Θα δούμε παραδείγματα προβλημάτων, που εντάσσονται σε δύο κατηγορίες: Προβλήματα που είναι ήδη διατυπωμένα ως προβλήματα απόφασης. Γι αυτά, χρειάζεται να βρούμε μία αναπαράσταση της εισόδου τους με συμβολοσειρές και στη συνέχεια να ορίσουμε μία γλώσσα, που θα περιέχει ακριβώς εκείνο το σύνολο των εισόδων, για τις οποίες η απάντηση στο ερώτημα της απόφασης είναι ΝΑΙ. Προβλήματα, που δεν έχουν εξαρχής περιγραφεί ως ερωτήματα απόφασης. Γι αυτά, μπορεί να απαιτούνται διαφόρων ειδών αποτελέσματα, που οδηγούν στην αναδιατύπωση του προβλήματος ως πρόβλημα απόφασης, που στη συνέχεια θα πρέπει να αναπαρασταθεί ως διαδικασία αναγνώρισης γλώσσας. Στα παραδείγματα που ακολουθούν συμβολίζουμε με < X > μία αναπαράσταση του αντικειμένου X με συμβολοσειρά. Με το συμβολισμό < X, Y > εκφράζουμε την αναπαράσταση δύο αντικειμένων, δηλαδή του X και του Y με μία συμβολοσειρά. Παράδειγμα 1.9 (Αναγνώριση πρώτων αριθμών) Πρόβλημα: δοθέντος ενός μη αρνητικού ακεραίου n είναι αυτός πρώτος; Α- ναζητούμε δηλαδή αν υπάρχει τουλάχιστο ένας θετικός ακέραιος παράγοντας διαφορετικός του αριθμού αυτού ή της μονάδας.
12 ΚΕΦ ΑΛΑΙΟ 1. ΓΛΩΣΣΕΣ ΚΑΙ ΥΠΟΛΟΓΙΣΜΟΙ Κωδικοποίηση του προβλήματος: αναπαριστούμε κάθε μη αρνητικό ακέραιο ως συμβολοσειρά από δυαδικά ψηφία. Σ αυτή την περίπτωση, η γλώσσα που αποφασίζεται είναι η: L prime = {w : η w είναι η δυαδική αναπαράσταση ενός πρώτου αριθμού} Παράδειγμα 1.10 (Αναζήτηση προτύπου στον παγκόσμιο ιστό) Πρόβλημα: δοθείσης μιας συμβολοσειράς αναζήτησης w και ενός πόρου d του παγκόσμιου ιστού ταιριάζει το δεύτερο με το πρώτο; Μ άλλα λόγια, θα έπρεπε μία μηχανή αναζήτησης με είσοδο w να επιστρέφει το d; Σ αυτή την περίπτωση, η γλώσσα που αποφασίζεται είναι η: L W W W = {< w, d >: το d ταιριάζει στο ερώτημα w} Παράδειγμα 1.11 (Το πρόβλημα του τερματισμού) Πρόβλημα: δοθέντος ενός προγράμματος p, που έχει γραφεί στη γλώσσα προγραμματισμού C είναι σίγουρο ότι το πρόγραμμα p τερματίζει για όλες τις εισόδους; Σ αυτή την περίπτωση, η γλώσσα που αποφασίζεται είναι η: L halt = {p : το πρόγραμμα p τερματίζει για όλες τις εισόδους} Θα θέλαμε πολύ να υπάρχει ένας αλγόριθμος, που θα μπορούσε να αποφασίσει αν μία συμβολοσειρά - πρόγραμμα - ανήκει στη γλώσσα L halt, γιατί έτσι θα αποδεικνύαμε την ορθότητα των προγραμμάτων που συντάσσουμε. Δυστυχώς ένα θεώρημα της Θεωρίας Υπολογισμού έχει δείξει ότι ένας τέτοιος αλγόριθμος δε μπορεί να υπάρξει. Παράδειγμα 1.12 (Ευθυγράμμιση ακολουθίας πρωτεΐνης) Πρόβλημα Υπολογιστικής Βιολογίας [12]: δοθέντος ενός μέρους f μιας πρωτεΐνης και ενός μορίου πρωτεΐνης pr, μπορεί το f να είναι μέρος του pr; Κωδικοποίηση του προβλήματος: αναπαριστούμε κάθε μόριο πρωτεΐνης ή ενός μέρους του ως μία ακολουθία στοιχείων αμινοξέων. Ορίζουμε ένα χαρακτήρα για το καθένα από τα είκοσι πιθανά αμινοξέα. Ετσι, θα μπορούσε για παράδειγμα η συμβολοσειρά AGHTYWDNR να αναπαριστά μέρος κάποιας πρωτεΐνης. Σ αυτή την περίπτωση, η γλώσσα που αποφασίζεται είναι η:
1.3. ΚΛΆΣΕΙΣ ΓΛΩΣΣ ΩΝ 13 L pr = {< f, p >: το f θα μπορούσε να είναι μέρος του pr} Πολλά προβλήματα που δεν είναι διατυπωμένα ως προβλήματα απόφασης μπορούν να μετασχηματιστούν σε τέτοια με μία αναδιατύπωσή τους ως προβλήματα αναγνώρισης γλώσσας. Η βασική ιδέα είναι η αναπαράσταση σε μία συμβολοσειρά τόσο των εισόδων, όσο και των εξόδων του αρχικού προβλήματος. Ετσι, για παράδειγμα, αν για το πρόβλημα Π έχουμε δύο εισόδους i 1 και i 2 και παράγεται ένα αποτέλεσμα r, τότε μπορούμε να σχηματίσουμε συμβολοσειρές της μορφής i 1 ; i 2 ; r. Σ αυτή την περίπτωση, η συμβολοσειρά w = u; v; z θα ανήκει στη γλώσσα L για το πρόβλημα Π, αν και μόνο αν z είναι η συμβολοσειρά που αναπαριστά το αποτέλεσμα για δύο εισόδους στο πρόβλημα Π, που εκφράζονται από τις συμβολοσειρές x και y. Παράδειγμα 1.13 ( Άθροιση ακεραίων ως πρόβλημα απόφασης) Πρόβλημα: υπολογισμός του αθροίσματος δύο μη αρνητικών ακεραίων. Κωδικοποίηση του προβλήματος: αναπαριστούμε τον κάθε αριθμό ως συμβολοσειρά δεκαδικών ψηφίων και μετασχηματίζουμε το αρχικό πρόβλημα σ ένα πρόβλημα ελέγχου του αν σε μία τριάδα αριθμών ο τρίτος είναι το άθροισμα των δύο πρώτων. Ετσι, κάθε περίπτωση του προβλήματος διατυπώνεται με μία συμβολοσειρά της μορφής: < ακέραιος 1 > + < ακέραιος 2 >=< ακέραιος 3 > Τότε, η γλώσσα που αποφασίζεται για το συγκεκριμένο πρόβλημα είναι η: L sum = {w : η w είναι της μορφής < ακέραιος 1 > + < ακέραιος 2 >= < ακέραιος 3 > με < ακέραιος 1 >, < ακέραιος 2 >, < ακέραιος 3 > στοιχεία της {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} + και ο ακέραιος 3 να είναι το άθροισμα των ακέραιος 1 και ακέραιος 2 } 1.3 Κλάσεις γλωσσών 1.3.1 Κλάσεις γλωσσών ως προς τις μηχανές για την αναγνώρισή τους Στα επόμενα κεφάλαια θα επεξεργαστούμε μία σειρά μοντέλων υπολογισμού, που το καθένα είναι ισχυρότερο εκφραστικά από τα προηγούμενα. Το κάθε
14 ΚΕΦ ΑΛΑΙΟ 1. ΓΛΩΣΣΕΣ ΚΑΙ ΥΠΟΛΟΓΙΣΜΟΙ μοντέλο υπολογισμού έχει τη δυνατότητα εκτέλεσης προγραμμάτων, όπου ένα πρόγραμμα εδώ ορίζεται ως μία πεπερασμένη ακολουθία εντολών με ένα πεδίο ορισμού, έστω D. Το πεδίο ορισμού D λέμε ότι είναι το πεδίο τιμών των μεταβλητών και υποθέτουμε ότι αποτελείται από ένα σύνολο στοιχείων, από τα οποία ένα ξεχωρίζει, επειδή αντιστοιχεί στην αρχική τιμή των μεταβλητών του προγράμματος. Καθένα από τα στοιχεία του συνόλου D υποθέτουμε ότι είναι ένας συνδυασμός ανάθεσης τιμών στις μεταβλητές. Κατά την εκτέλεση ενός τέτοιου προγράμματος διακρίνουμε δύο πιθανά ενδεχόμενα: (α) αποδοχή, που αντιστοιχεί σε κάποια εντολή τερματισμού μετά από επιτυχή ολοκλήρωση της εκτέλεσης και που μπορεί να συμβεί μόνο μετά από την προσέγγιση του τέλους της εισόδου 1 και (β) απόρριψη, που αντιστοιχεί σε κάποια εντολή τερματισμού μετά από ανεπιτυχή ολοκλήρωση της εκτέλεσης. Μία ακολουθία βημάτων εκτέλεσης λέγεται υπολογισμός αποδοχής αν τερματίζει εξαιτίας κάποιας εντολής αποδοχής. Αντίθετα, μία ακολουθία βημάτων εκτέλεσης για είσοδο, που δεν έχει υπολογισμούς αποδοχής, λέγεται υπολογισμός απόρριψης. Αν ένα πρόγραμμα έχει έναν υπολογισμό αποδοχής για μία είσοδο, τότε λέμε ότι αυτή η είσοδος είναι αποδεκτή ή αλλιώς αναγνωρίζεται. Σε διαφορετική περίπτωση, λέμε ότι η είσοδος δεν είναι αποδεκτή ή αλλιώς απορρίπτεται από το πρόγραμμα. Ενα πρόγραμμα λέμε ότι παράγει την έξοδο y για δοθείσα είσοδο x, αν αυτό έχει έναν υπολογισμό αποδοχής για τη x, που να παράγει την έξοδο y. Οι έξοδοι των υπολογισμών απόρριψης θεωρούμε ότι είναι απροσδιόριστες. Παράδειγμα 1.14 (Προβλήματα της υπολογιστικής συμπεριφοράς των προγραμμάτων) Γράφουμε προγράμματα για να επιλύουμε προβλήματα, αλλά μία σειρά από ενδιαφέροντα προβλήματα αφορούν τα προγράμματα που γράφουμε. Στο παράδειγμα αυτό παραθέτουμε μία λίστα τέτοιων προβλημάτων [7]. 1. Το πρόβλημα που εξετάσαμε στο Παράδειγμα 1.11, που είναι γνωστό ως το πρόβλημα του τερματισμού των προγραμμάτων. 2. Πρόβλημα του τερματισμού ενός προγράμματος: δοθέντος ενός προγράμματος p και μιας εισόδου x, τερματίζει το p με είσοδο x, δηλαδή τερματίζουν όλοι οι υπολογισμοί του p για την είσοδο x; 3. Πρόβλημα αποδοχής/αναγνώρισης για πρόγραμμα: δοθέντος ενός προγράμματος p και μιας εισόδου x, είναι η x αποδεκτή από το 1 Κάθε πρόγραμμα μπορεί να μετασχηματιστεί σ ένα ισοδύναμο, που θα συμμορφώνεται σ αυτόν τον περιορισμό.
1.3. ΚΛΑΣΕΙΣ ΓΛΩΣΣΩΝ 15 p; 4. Πρόβλημα μέλους για πρόγραμμα: δοθέντος ενός προγράμματος p και δύο στοιχείων x και y από το πεδίο (τιμών μεταβλητών) του p, έχει το p έναν υπολογισμό αποδοχής για είσοδο x με έξοδο y; 5. Πρόβλημα κενότητας για πρόγραμμα: δοθέντος ενός προγράμματος, αποδέχεται αυτό την κενή γλώσσα, μήπως δηλαδή απολύτως καμία είσοδος δεν είναι αποδεκτή; 6. Πρόβλημα αμφισημίας για πρόγραμμα: δοθέντος ενός προγράμματος δίνει αυτό δύο ή περισσότερους υπολογισμούς αποδοχής, που παράγουν την ίδια έξοδο, για κάποια είσοδο; 7. Πρόβλημα μοναδικότητας τιμής για πρόγραμμα: δοθέντος ενός προγράμματος, ορίζει αυτό μία συνάρτηση, δηλαδή παράγει τελικά για κάθε είσοδο το πολύ μία έξοδο; 8. Πρόβλημα ισοδυναμίας για προγράμματα: ορίζει ένα ζεύγος προγραμμάτων την ίδια σχέση μεταξύ εισόδου και εξόδου; Στη συνέχεια, κατά την παρουσίαση των μοντέλων υπολογισμού με την πιο σημαντική επίδραση στην εξέλιξη της Επιστήμης των Υπολογιστών, θεωρούμε χωρίς βλάβη της γενικότητας ότι η τρέχουσα κατάσταση των προγραμμάτων κατά την εκτέλεσή τους καθορίζεται από μία μόνο μεταβλητή, που η τιμή της θα μεταβάλλεται με τρόπο, που θα απεικονίζεται σε διαγράμματα καταστάσεων. Πεπερασμένα αυτόματα Το πρώτο από τα μοντέλα υπολογισμού, που θα εξετάσουμε είναι οι μηχανές πεπερασμένων καταστάσεων (finite state machines), γνωστές επίσης και ως πεπερασμένα αυτόματα (finite automata). Τα προγράμματα γι αυτές τις μηχανές είναι γενικά εύκολα στην κατανόηση, εκτελούνται σε γραμμικά μεταβαλλόμενο χρόνο και υπάρχουν αποτελέσματα για σχεδόν όλες τις ερωτήσεις, σχετικά με τη συμπεριφορά τους. Το Σχήμα 1.1 δείχνει ένα απλό πεπερασμένο αυτόματο, που αποδέχεται/ αναγνωρίζει συμβολοσειρές από 0 και 1, που τελειώνουν σε 00. Η είσοδος σ ένα πεπερασμένο αυτόματο είναι μία συμβολοσειρά με τους χαρακτήρες της να διαβάζονται ένας κάθε φορά, από τ αριστερά προς τα δεξιά. Το αυτόματο έχει μία αρχική κατάσταση, όπως φαίνεται στο σχήμα με ένα τόξο χωρίς επιγραφή,