Περιγραφή θεωρητικού και µαθηµατικού υπόβαθρου Λογισµικής ιαγραµµατικής Οντολογίας Αρχιµήδης ΙΙΙ Υποέργο 18 2013
Στο ακόλουθο κείµενο περιγράφεται το θεωρητικό υπόβαθρο ενός αυτόµατου εργαλείου για δυναµικό έλεγχο προγραµµάτων. Η θεωρία βασίζεται σε µια ποιοτική προσέγγιση του προγράµµατος καθώς και της συµπεριφοράς του, δηλαδή στην κατασκευή µιας οντολογίας. Η οντολογία αυτή αποτελείται από ένα στατικό και ένα δυναµικό µέρος τα οποία θα περιγράψουµε. Θα περιγράψουµε καταρχήν τι εννοούµε µε οντολογία και γιατί είναι ενδιαφέρον να έχουµε µια ποιοτική προσέγγιση. Για να γίνει αυτό θα εισάγουµε τις βασικές έννοιες που θα χρησιµοποιηθούν: µάγµα, έννοια της επιρροής, γράφος φάσεων, οµοµορφισµοί, κ.α. Θα αναλύσουµε επίσης τις βασικές υποθέσεις που κάνουµε (ελπίζουµε αρκετά χαλαρές και ρεαλιστικές) για να φέρουµε σε πέρας την κατασκευή και τη χρήση (δηλαδή την εφαρµογή στον έλεγχο προγραµµάτων) ενός ποιοτικού µοντέλου. ΠΟΙΟΤΙΚΗ ΟΝΤΟΛΟΓΙΑ ΠΡΟΓΡΑΜΜΑΤΩΝ Σύµφωνα µε την κοινή αποδοχή, ονοµάζουµε οντολογία ένα σύνολο αλληλένδετων εννοιών που περιγράφουν ένα συγκεκριµένο (συνήθως επιστηµονικό) τοµέα και τους κανόνες που τον διέπουν. Μια οντολογία επιτρέπει έτσι µια κοινή γλώσσα και γνώση που µπορούν να µετατρέπονται και να εµπλουτίζονται από τους ειδικούς. Οντολογίες για τη διαδικασία σχεδιασµού και ανάπτυξης ενός προγράµµατος (ή πιο συγκεκριµένα ενός αλγόριθµου) έχουν υπάρξει και χρησιµοποιούνται πολλές, λόγω της κρισιµότητας των σηµερινών υπολογιστικών εφαρµογών, χωρίς όµως αναγκαστικά να έχουν διατυπωθεί αρχικά µε το όνοµα "οντολογία". Οντολογίες έχουν αναπτυχθεί και σε άλλους επιστηµονικούς τοµείς, όπως η ιατρική, η βιολογία, κ.α., όπως επίσης έχουν αναπτυχθεί στην Ποιοτική Συλλογιστική (ΠΣ, Qualitative Reasoning) που ανήκει στο γενικότερο ερευνητικό κλάδο της Τεχνητής Νοηµοσύνης. Ο αρχικός (και κύριος) στόχος της ΠΣ ήταν να προτείνει ένα διαφορετικό τρόπο προσέγγισης της Τεχνητής Νοηµοσύνης από την κυριαρχούσα αντιµετώπιση, που ήταν καθαρά βασισµένη στη Μαθηµατική Λογική (µην ξεχνάµε ότι η Μαθηµατική Λογική αποτελεί τη "µήτρα" των ηλεκτρονικών υπολογιστών και πολλοί βλέπουν τον ηλεκτρονικό υπολογιστή σαν ΤΟ κατεξοχήν εργαλείο και υλοποίηση της Μαθηµατικής Λογικής). Η ΠΣ προσπάθησε να ενσωµατώσει στα εννοιολογικά εργαλεία της, έννοιες πιο αφηρηµένες και που συνάµα ήταν πιο κοντά στον τρόπο µε τον οποίο ένας κοινός άνθρωπος ή ένας ειδικός σε έναν τοµέα, αναπαρίσταναν την πραγµατικότητα και επέλυναν έναν συγκεκριµένο πρόβληµα. Αλλά ο απώτερος σκοπός της ΠΣ ήταν η λογισµική υλοποίηση αυτών των εννοιών προκειµένου να κατασκευαστούν συγκεκριµένα εργαλεία που θα επέτρεπαν στους υπολογιστές να έχουν µια "βαθύτερη" (δηλαδή πιο ανθρώπινη) γνώση σε έναν τοµέα. Κατόπιν αυτού ήταν λογικό να υιοθετήσει και η ΠΣ διάφορες οντολογίες (που θα µπορούσαµε να αποκαλέσουµε ποιοτικές οντολογίες). Αν και πολλές φορές η πολυπλοκότητα και η "λογική πυκνότητα" των ποιοτικών οντολογιών ήταν µεγαλύτερη των κλασικών λογικών προσεγγίσεων που ήθελαν να επικρίνουν, το αρχικό µήνυµα της ποιοτικής προσέγγισης παραµένει ακέραιο: να ξεφύγουµε από µια καθαρά µηχανιστική-λογικίστικη προσέγγιση ενός προβλήµατος, υιοθετώντας µια ορολογία και κανόνες συλλογισµού που, χωρίς να έχουν τη µαθηµατική ακρίβεια ενός µαθηµατικού µοντέλου, είναι πιο "απλές" (χρησιµοποιήθηκε πολλές φορές ο επιτυχηµένος όρος "αφελείς"), πιο κατανοήσιµες από τον άνθρωπο και πιο κοντά στον "µακροσκοπικό" τρόπο σκέψης του. Η βασική ιδέα της προσέγγισής µας µπορεί να συνοψιστεί ως εξής: εφόσον η κατασκευή ενός αλγόριθµου (και υπό αυτόν τον όρο συµπεριλαµβάνουµε τις διαδικασίες σχεδιασµού, προγραµµατισµού, διόρθωσης, ελέγχου και συντήρησης ενός προγράµµατος) είναι τόσο κρίσιµη, δύσκολη και επίπονη διεργασία γιατί να µην επιχειρήσουµε να χρησιµοποιήσουµε και σε αυτόν τον τοµέα τις αρχικές ιδέες της ποιοτικής συλλογιστικής. Πράγµατι η ΠΣ (και γενικότερα η Τεχνητή Νοηµοσύνη και οι οντολογίες) έχουν εφαρµοστεί σε τοµείς "ευρείς" και λιγότερο "κρίσιµους" από την πληροφορική. Γιατί λοιπόν αυτός ο γόρδιος δεσµός που συνδέει τη Μαθηµατική Λογική µε τους αλγόριθµους (δεσµός που έχει σπάσει σε άλλους τοµείς) να µην κοπεί για την ίδια την πληροφορική και πιο συγκεκριµένα για τον τρόπο µε τον οποίο αντιµετωπίζουµε έναν αλγόριθµο; 2
Με άλλα λόγια, όπως συνέβη και µε άλλους επιστηµονικούς τοµείς, η κυριαρχούσα αντιµετώπιση ενός αλγόριθµου είναι µέχρι σήµερα καθαρά βασισµένα στις µαθηµατικές θεωρίες της λογικής και τα παρακλάδια της (υπολογισιµότητα, πολυπλοκότητα, σύνταξη και σηµασιολογία, κ.λπ.). Για έναν θεωρητικό της πληροφορικής δεν έχει νόηµα να µιλήσουµε για έναν "αφελή" τρόπο µε τον οποίο ένας προγραµµατιστής επιλύει ένα πρόβληµα - ο όρος "αφελής" έχει µια υποτιµητική έννοια και σηµαίνει µάλλον "όχι βέλτιστος" για να µην πούµε λαθεµένος. Για έναν θεωρητικό της πληροφορικής, το να µιλήσουµε για µια δοµή η οποία περιέχει ορισµένες πληροφορίες χωρίς να χρειάζεται να την περιγράψουµε λεπτοµερώς, δεν θα ήταν παρά ένα προσχέδιο σχεδόν κενό της οποιασδήποτε υπολογιστικής χρήσης καθότι δεν θα είχε ακόµα υλοποιηθεί σε µια συγκεκριµένη προγραµµατιστική δοµή. Τέλος, για τον ίδιο καθαρόαιµο θεωρητικό δεν έχει καµία σηµασία να περιγράφουµε εξόδους που αποκλίνουν ή συγκλίνουν ή ακόµα συµπεριφέρονται σαν φυσικά φαινόµενα, δεν θα είχε νόηµα. Και όµως, στη συνέχεια θα προσπαθήσουµε να εξηγήσουµε ότι τέτοιες έννοιες όχι µόνον έχουν νόηµα αλλά µπορούν να µας βοηθήσουν να κατανοήσουµε καλύτερα την ανθρώπινη διαδικασία παραγωγής λογισµικού και να επινοήσουµε νέα (συµπληρωµατικά) εργαλεία για την ανάλυση και τον έλεγχό τους. Θα πρέπει γι' αυτό το σκοπό να προτείνουµε µια νέα ποιοτική οντολογία που να αφορά τη διαδικασία του προγραµµατισµού. Προτού όµως παρουσιάσουµε αυτή την οντολογία, ας δούµε ποιές είναι οι δυσκολίες που συναντάµε όταν επιχειρούµε να εφαρµόσουµε κλασσικές µεθόδους ποιοτικού συλλογισµού σ' έναν κλάδο όπως είναι η τεχνολογία λογισµικού και συγκεκριµένα ο προγραµµατισµός. Η πρώτη δυσκολία συνίσταται στη διαχείριση των δοµών από το λογισµικό. Για ένα κλασικό φυσικό φαινόµενο όπως είναι η τήξη µιας ουσίας, η διαδροµή ενός σώµατος µέσα σε ένα πεδίο, οι πολλαπλές χηµικές αντιδράσεις ή ακόµα η λειτουργία ενός ηλεκτρονικού κυκλώµατος, το είδος των δεδοµένων που διαχειριζόµαστε είναι κλασικές πραγµατικές ή ακέραιες τιµές οι οποίες εξελίσσονται στο χρόνο µε έναν συνήθως συνεχή (µε τη µαθηµατική έννοια) τρόπο. Η ΠΣ είναι σε θέση σ' αυτές τις περιπτώσεις να χρησιµοποιήσει ποιοτικές και ποσοτικές αφαιρέσεις ή να χρησιµοποιήσει πάµπολλα µαθηµατικά θεωρήµατα που αφορούν τοπικές, ιδιάζουσες ή γενικές συµπεριφορές µαθηµατικών σχέσεων, υιοθετώντας αποτελέσµατα από την Ανάλυση, την Τοπολογία, τη ιάδοση Περιορισµών, τις ιαφορικές Εξισώσεις, την Ασαφή Λογική ακόµα και τη Μη-καθιερωµένη Ανάλυση (ένα είδος Μαθηµατικής Ανάλυσης όπου οι απειροστές ποσότητες λαµβάνουν µια πραγµατική και τυπική υπόσταση) κ.ο.κ. Με άλλα λόγια η ποιοτική προσέγγιση σ' αυτές τις περιπτώσεις καθίσταται δυνατή καθότι οι µετασχηµατισµοί που διέπουν ένα φυσικό φαινόµενο (τουλάχιστον αυτά µε τα οποία ασχολείται η ΠΣ) αποτελούνται από κλασικές µαθηµατικές σχέσεις έτσι όπως µελετήθηκαν µακροχρόνια από τη γένεση της Μαθηµατικής Ανάλυσης. Όταν όµως πρέπει να αναλύσουµε έναν λογισµικό µετασχηµατισµό (δηλαδή την αλγοριθµική διαδικασία που µετατρέπει βήµα-βήµα αρχικές εισόδους σε εξόδους) παρατηρούµε τη µεγάλη ετεροµορφία των δεδοµένων: πραγµατικοί αριθµοί, πίνακες πινάκων, πολυµορφικά αντικείµενα του αντικειµενοστραφούς προγραµµατισµού που περικλείουν άλλα αντικείµενα µε συµβολοσειρές και λογικές τιµές ή αναφορές που µας οδηγούν σε άλλα αντικείµενα, κ.ο.κ. Και σαν να µην φτάνουν όλα αυτά, ακόµα κι ένας "πραγµατικός αριθµός" σε µια γλώσσα προγραµµατισµού δεν είναι "συνεχής" ούτε "άπειρος" αλλά είναι ένας δεκαδικός του οποίου η ακρίβεια και το εύρος εξαρτώνται από τα όρια του λογισµικού και υλικού περιβάλλοντος στο οποίο προγραµµατίζουµε. Αυτό σηµαίνει ότι πρέπει να προδιαγράψουµε ένα υποκατάστατο της συνεχούς πραγµατικής ευθείας και να εισάγουµε σχέσεις τάξεως (ποιό είναι µεγαλύτερο, ποιό είναι µικρότερο) που δεν είναι απόλυτες αλλά µερικές. Αντιµετωπίζουµε εδώ το ίδιο πρόβληµα µε τον κλάδο της Ψηφιακής Τοπολογίας που προτάθηκε από τον B. Rosenfeld. Η Ψηφιακή Τοπολογία είναι µια επιτυχηµένη απόπειρα να εισαχθούν κλασσικές τοπολογικές έννοιες (συνεκτικότητα, συνέχεια, συστολές, κ.λπ.) σε διακριτούς τοµείς και συγκεκριµένα την Επεξεργασία Εικόνας. Στη συνέχεια οι έννοιες όπως "πρόγραµµα", "λογισµικό" ή "αλγόριθµος" θα έχουν την ίδια σηµασία η οποία είναι ένα "περιορισµένο" τµήµα κώδικα (π.χ. µια µέθοδος της Java) µε µικρό αριθµό εντολών σε µια εξελιγµένη γλώσσα διαδικαστικού και δοµηµένου προγραµµατισµού. Αν και, είναι αλήθεια, η οντολογία αρµόζει καλύτερα σε έναν αντικειµενοστραφή τρόπο σκέψης, η προσέγγισή 3
µας επ' ουδενί λόγω δεν περιορίζεται στις αντικειµενοστραφείς γλώσσες. Θα θεωρήσουµε ότι ο αλγόριθµος αυτός είναι εκτελέσιµος, διαθέτει τους κατάλληλους πόρους για να τερµατίσει σε ένα εύλογο χρονικό διάστηµα. Με άλλα λόγια δεν ασχολούµαστε µε τις ανωµαλίες που µπορούν να προκύψουν από εξωγενείς και παροδικούς παράγοντες, αλλά µε τις ενδεχόµενες και αναπαραγόµενες ανωµαλίες που προκύπτουν από τα λάθη που διέπραξε ο προγραµµατιστής. Επιπλέον θεωρούµε ότι ο αλγόριθµος δε διαθέτει καµία µνήµη. Είναι δηλαδή τελείως προσδιοριστικός: για τις ίδιες εισόδους θα έχουµε πάντα τις ίδιες εξόδους. Σηµειωτέον, ότι ένας αλγόριθµος µε µνήµη µπορεί να καταστεί προσδιοριστικός προσθέτοντας νέες εισόδους (που αντιστοιχούν στη µνήµη). Επίσης, θα θεωρήσουµε ότι αν ο χρόνος εκτέλεσης του αλγόριθµου ξεπερνάει ένα προκαθορισµένο όριο, ο αλγόριθµος δεν τερµατίζει και το αποτέλεσµά του είναι εσφαλµένο (που µπορούµε να συµβολίσουµε σαν µια τυπική έξοδο µη-τερµατισµού). Οι περισσότερες γλώσσες προγραµµατισµού χρησιµοποιούν δείκτες σε πολλές µορφές (καθολικοί δείκτες, αριθµοδείκτες σε έναν πίνακα, ακόµα και οι συµβολοσειρές µπορούν καµιά φορά να χρησιµοποιηθούν σαν έµµεσοι δείκτες σε ειδικές δοµές όπως είναι τα maps της Java). είκτες χρησιµοποιούνται επίσης σαν έµµεσες είσοδοι ή σαν αποτέλεσµα εξόδων. Όταν πρέπει να ασχοληθούµε µε τέτοιους είδους δεδοµένα (δηλαδή πληροφορίες που θα µας επιτρέψουν να χρησιµοποιήσουµε το περιεχόµενο µιας διεύθυνσης της µνήµης) θα πρέπει πρώτα να γίνει η πράξη της "αναπαραποµπής" (dereference) η οποία συνίσταται στο να µη µελετήσουµε το δείκτη αυτόν καθαυτόν, αλλά το περιεχόµενο της µνήµης στην οποία παραπέµπει. Αν, για παράδειγµα, εξετάζουµε έναν αλγόριθµο που αναζητεί τη διεύθυνση του µέγιστου ακέραιου µέσα σε ένα µονοδιάστατο πίνακα Α, τότε δεν θα εξετάσουµε το ακέραιο αποτέλεσµα (π.χ. 17) αλλά το περιεχόµενο Α[17], ακριβώς όπως θα κάναµε και µε τη µελέτη ενός άλλου αλγόριθµου που θα αναζητούσε την τιµή (κι όχι τη διεύθυνση) του µέγιστου µέσα στον Α. Επ' ουδενί λόγω δε θεωρούµε ότι όλες οι λεπτότητες και οι πολυπλοκότητες των δεικτών µπορούν να αντιµετωπιστούν µε αυτό τον τρόπο (ένας δείκτης µπορεί να είναι η διεύθυνση ενός άλλου δείκτη, κ.ο.κ, και γενικότερα οτιδήποτε µπορεί να χρησιµοποιηθεί για να υπολογιστεί µια διεύθυνση όπου µπορούµε να βρούµε οτιδήποτε!). Θεωρούµε όµως ότι έτσι αντιµετωπίζουµε ένα συντριπτικό ποσοστό εφαρµογών και ότι µια ποιοτική προσέγγιση του λογισµικού δεν θα πρέπει να εισχωρεί και πολύ εις βάθος στις πολυπλοκότητες των δεικτών. Προσοχή, δεν εννοούµε ότι δεν πρέπει να χρησιµοποιούνται δείκτες στον αλγόριθµο αυτόν καθαυτόν (καθότι αυτό δεν επηρεάζει την ποιοτική µελέτη συµπεριφοράς), αλλά ότι χρειαζόµαστε αυτή την αναπαραποµπή και για να µελετήσουµε καλύτερα τη συµπεριφορά εξωτερικά, δηλαδή από την οπτική: είσοδοι/έξοδοι. Η ΟΝΤΟΛΟΓΙΑ ΤΩΝ Ε ΟΜΕΝΩΝ 1. Η Έννοια του Μάγµατος Μπορούµε να θεωρήσουµε στη συνέχεια ότι υπάρχουν δύο ειδών δεδοµένα: οι τέσσερεις βασικοί τύποι (ακέραιοι, δεκαδικοί διαφόρων ακριβειών και µεγέθους, λογικός και χαρακτήρες) και οι σύνθετοι που αποτελούνται από µια συλλογή και συνδυασµό των βασικών τύπων: πολυδιάστατοι πίνακες, αντικείµενα του αντικειµενοστραφούς προγραµµατισµού ή οι δοµές της C και της Pascal, οι λίστες της LISP ή ακόµα οι περίφηµες συλλογές (collections), οι ποικιλόµορφες δοµές (τύπου map) της JV και C++ και των διαδικτυακών διαλέκτων τους. Στην οντολογία µας θα ξεχωρίσουµε συνεπώς τους βασικούς τύπους, τους οποίους θα ονοµάσουµε άτοµα, από τους σύνθετους, τους οποίους θα ονοµάσουµε µάγµατα. Ο τελευταίος όρος εµπνέεται από τις εργασίες του Κ. Καστοριάδη ο οποίος πρότεινε αυτόν τον όρο σε αντιπαράθεση µε τον όρο σύνολο που προτάσσεται στη συνολοταυτιστική προσέγγιση. Ένα µαθηµατικό σύνολο, µια συλλογή Java, έχουν µια προκαθορισµένη δοµή η οποία αλλοιώνεται µε ένα συγκεκριµένο τρόπο όταν προσθαφαιρούµε αντικείµενα. Αντιθέτως, ένα µάγµα δεν έχει δοµή, παραµένει µάγµα όταν προσθέτουµε ή αφαιρούµε αντικείµενα. Θα θεωρήσουµε φυσικά ότι ένα µάγµα έχει ένα µέγεθος το οποίο αυξάνεται ή µειώνεται αλλά χωρίς συγκεκριµένες τιµές και χωρίς κατώτατα και ανώτατα 4
όριο. Ένα µάγµα δεν είναι µια κλάση τους αντικειµενοστραφούς προγραµµατισµού αλλά ένα συγκεκριµένο σύνολο πληροφοριών που έχουν πραγµατική υπόσταση στη µνήµη. Το που και το πόσο δεν µας αφορούν. Ένα µάγµα δεν είναι µια αφαίρεση. Ένα µάγµα, από την στιγµή που δηµιουργηθεί, µπορεί µόνο να καταστραφεί και δεν µας αφορούν ούτε τα όρια τις περιεκτικότητάς του ούτε το γεγονός ότι µπορεί να είναι κενό. Το εσωτερικό ενός µάγµατος µας ενδιαφέρει µόνο αν αποτελείται από οµοιόµορφα αντικείµενα (σε αυτή την περίπτωση έχουµε το παράδειγµα ενός πίνακα) ή από µη οµοιόµορφα αντικείµενα (σε αυτή την περίπτωση έχουµε το παράδειγµα ενός κλασσικού object της Java) και δεν µας ενδιαφέρει η εσωτερική δοµή του (που στις περισσότερες φορές είναι δενδροειδής της οποίας τερµατικά φύλλα είναι οι βασικοί τύποι). Συνεπώς, αν ένας ακέραιος αντιστοιχεί στην ηλικία ενός φοιτητή σε µια τάξη σε µια γενικότερη δοµή ενός σχολείου, θα θεωρήσουµε απλώς ότι αυτή η ηλικία εµφανίζεται, ανήκει στο µάγµα τάξη και µόνο στην περίπτωση (αρκετά σπάνια) µιας ποιοτικής συνωνυµίας θα προσθέσουµε την αναγκαία πληροφορία για να τις διαχωρίσουµε. Ένα µάγµα δηµιουργείται από τη στιγµή που ενώνουµε δύο ή περισσότερους βασικούς τύπους. Το µικρότερο µάγµα θα αποτελούνταν από δύο boolean. Ένα µάγµα µπορεί να χάνει ή να κερδίζει πληροφορίες, το µέγεθός του να αυξάνεται ή να µειώνεται, να διασπάται ή να συγχωνεύεται µε άλλα µάγµατα, να εξελίσσεται (στο βαθµό που οι πληροφορίες που περιέχει µεταβάλλονται) χωρίς όµως να χάνει ποτέ την ίδια την ιδιότητα του µάγµατος, δηλαδή, να αντιπροσωπεύει ένα συνονθύλευµα συγκεκριµένων τιµών που εγγράφονται σε µια συγκεκριµένη µνήµη σε µια συγκεκριµένη στιγµή της εκτέλεσης και στο οποίο συνονθύλευµα αποφασίσαµε να δώσουµε ένα όνοµα. Στο γραφικό συµβολισµό που προτείνουµε για την οντολογία, ένα µάγµα θα αντιπροσωπεύεται από ένα τετράγωνο, στο πάνω µέρος του οποίου τοποθετούµε το όνοµά του. Αν χρειαστεί να χρησιµοποιήσουµε ορισµένα στοιχεία του µάγµατος, δεν έχουµε παρά να τα ονοµάσουµε χωρίς να είµαστε αναγκασµένοι να προσδιορίσουµε την ακριβή θέση τους στην ιεραρχία, καθότι το µάγµα δε διαθέτει ιεραρχία. 2. Οι Τρείς Βασικές Επιρροές Είδαµε προηγουµένως ότι ένα µάγµα µετατρέπεται αφοµοιώνοντας καινούργια δεδοµένα και εµπλουτιζόµενο εξελίσσεται µε υπολογιστικές διαδικασίες, µεταδίδει µέσω αντιγραφής µερικά από τα δεδοµένα σε άλλα µάγµατα (ή βασικά δεδοµένα) ή εξαρτάται από τα δεδοµένα άλλων µαγµάτων για να εξελιχθεί, κ.ο.κ. Στην οντολογία µας έχουµε έτσι την πρώτη υπόθεση. Υπόθεση 1: Αν εξαιρέσουµε τη διαδικασία επανεκκίνησης-αρχικοποίησης µιας οντότητας (reinitialization), σε µια συντριπτική πλειοψηφία των αλγόριθµων, η εξέλιξη ενός µάγµατος είναι δυνατή µόνο υπό την επιρροή εξωτερικών παραγόντων (άλλων µαγµάτων ή εξωτερικών ατόµων). Η υπόθεση αυτή ισχύει φυσικά και για τα άτοµα καθότι είναι αυτονόητη. Κανένας αλγόριθµος δεν µετατρέπει έναν ακέραιο αν η αρχική τιµή αυτού του ακέραιου δεν είναι κατά κάποιο τρόπο είσοδός του: αυτό θα αποτελούσε µια κλασική ανωµαλία ροής δεδοµένων. Αυτή η υπόθεση αντιστοιχεί στην Αριστοτέλεια αρχική αιτία: κάθε εξελικτικό φυσικό φαινόµενο οφείλεται σε µια εξωτερική αρχική αιτία. Αν θέλουµε να κάνουµε µια πληροφορική αναλογία: οι περισσότεροι αλγόριθµοι έχουν εισόδους και εξόδους. Αυτοί χωρίς εισόδους ή χωρίς αποτελέσµατα δεν είναι πολύ ενδιαφέροντες. Με άλλα λόγια για να αλλάξουν οι τιµές στο εσωτερικό ενός µάγµατος χρειαζόµαστε, συνήθως, ένα έναυσµα, δηλαδή την επιρροή µιας εξωτερικής οντότητας (µάγµα ή άτοµο). Η επόµενη υπόθεση της οντολογίας µας πάει πιο µακριά και προτείνει ότι υπάρχουν µόνο τριών ειδών επιρροές. Υπόθεση 2: Όλες οι επιρροές µεταξύ των οντοτήτων είναι συνδυασµός τριών βασικών επιρροών: 1. Αντιγραφή 2. Υπολογισµός 3. ραστηριοποίηση 5
Η αντιγραφή συνίσταται στο ότι ορισµένες πληροφορίες από το εσωτερικό ενός µάγµατος (για παράδειγµα, ενός πίνακα βαθµών) αντιγράφονται στο εσωτερικό ενός άλλου (για παράδειγµα, τα δεδοµένα ενός σχολείου). Ο υπολογισµός συνίσταται στο ότι µια νέα τιµή, που απορρέει από µια βασική αριθµητική πράξη, δηµιουργείται για να καταχωρηθεί σε ένα µέρος της µνήµης. Αυτή η υπολογιστική πράξη µπορεί να είναι µια κλασική αριθµητική πράξη, µια µαθηµατική ή γραφική ρουτίνα, η συγχώνευση δύο λέξεων ή γενικότερα η δηµιουργία µιας νέας λέξης από µερικές άλλες, η επαναφορά ενός δείκτη, ο υπολογισµός του κώδικα SCII ενός χαρακτήρα, µια βοηθητική ρουτίνα που µας επιστρέφει έναν τυχαίο αριθµό, το µήκος µιας λίστας, η ηµεροµηνία ή ώρα, κ.α. Η δραστηριοποίηση αποτελεί την εξ αποστάσεως επιρροή αυτή καθεαυτή. Όταν µια οντότητα (µάγµα ή άτοµο) έχει µια επιρροή δραστηριοποίησης σε µια άλλη οντότητα, αυτό σηµαίνει ότι χρειάζεται να γνωρίζουµε (πρέπει να συµβουλευτούµε) την τιµή της πρώτης οντότητας προκειµένου να δραστηριοποιήσουµε µιαν άλλη επιρροή (αντιγραφή ή υπολογισµό) σε µια άλλη οντότητα. Κάθε ποιοτικό µοντέλο της οντολογίας µας αποτελείται συνεπώς από οντότητες οι οποίες εξελίσσονται στο χρόνο σύµφωνα µε ένα συνδυασµό των επιρροών των άλλων οντοτήτων. Τέλος προτού δώσουµε µερικά παραδείγµατα, ας δώσουµε µια αντιστοίχιση των τριών επιρροών µε τις εντολές µιας κλασικής διαδικαστικής γλώσσας προγραµµατισµού. Η επιρροή αντιγραφής αντιστοιχεί σε απλή εντολή εκχώρησης τιµής "a = b;". Η αντιγραφή είναι ένα είδος αναπαραγωγής και διάδοσης της πληροφορίας από το ένα µάγµα στο άλλο. Η επιρροή υπολογισµού αντιστοιχεί σε εντολές της µορφής "a = b + 5*c;", για strings "allname = first + last;" ή ακόµα σε προκαθορισµένες σχέσεις "limit = studentset.size();", κ.α. Επίσης, όταν χρησιµοποιούµε έναν αλγόριθµο για να προγραµµατίσουµε µια πολύπλοκη µαθηµατική σχέση, αυτός ο αλγόριθµος αντιστοιχεί στο γεγονός ότι οι οντότητες που περιέχουν τις εισόδους αυτής της µαθηµατικής σχέσης επηρεάζουν υπολογιστικά την οντότητα που θα περιέχει το αποτέλεσµα. Με τον ίδιο τρόπο αν χρησιµοποιούµε ένα βρόχο για να µετρήσουµε πόσα στοιχεία εντός ενός µάγµατος ικανοποιούν µια λογική ιδιότητα, θεωρούµε ότι αυτό ισοδυναµεί µε µια υπολογιστική επιρροή. Σηµειωτέον ότι η επιρροή αντιγραφής θα µπορούσε να θεωρηθεί ως µια ειδική περίπτωση της επιρροής υπολογισµού. Θεωρούµε όµως ότι αυτό δεν είναι σωστό και ότι µια πράξη αντιγραφής έχει µια δικιά της αυτόνοµη σηµασία µεταφοράς αυτούσιας πληροφορίας ενώ αντιθέτως ο υπολογισµός αποτελεί µια πράξη µετουσίωσης και συγχώνευσης της πληροφορίας σε µια νέα τιµή. Μέσα στο τελικό αποτέλεσµα ενός υπολογισµού δεν υπάρχει τρόπο να ξεχωρίσουµε τα πρωταρχικά υλικά που χρησιµοποιήθηκαν. Η επιρροή δραστηριοποίησης αντιστοιχεί σε ένα συνδυασµό, εµφωλευµένων ή µη, συνθηκών για παράδειγµα "if (a < b)...". Η επιρροή δραστηριοποίησης δε µπορεί ποτέ να εµφανίζεται µόνη της. Πάντα αναφέρεται σε µια από τις άλλες δύο επιρροές. Αν, για παράδειγµα, ένα µάγµα επηρεάζει µε δραστηριοποίηση µια άλλη οντότητα αυτό σηµαίνει ότι η δεύτερη οντότητα υπόκειται σε µια (ή περισσότερες) επιρροές αντιγραφής ή υπολογισµού, που θα πραγµατοποιηθούν εφόσον ο συνδυασµός των τιµών της πρώτης οντότητας επιτρέπει ή όχι να δραστηριοποιηθεί η επιρροή αντιγραφής ή υπολογισµού. Αντιθέτως µε αυτές τις τελευταίες, η επιρροή δραστηριοποίησης δεν είναι ανεξάρτητη. Μια οντότητα, που επηρεάζει κάποια άλλη, δεν επηρεάζεται. Η κατάστασή της παραµένει η ίδια, µέχρις ότου δραστηριοποιηθούν άλλες επιρροές επάνω της οι οποίες θα την αναγκάσουν ενδεχοµένως να αλλάξει. Παρατηρούµε ότι στην οντολογία αυτή δεν υπάρχει η περιγραφή της σειράς µε την οποία θα δραστηριοποιηθούν οι επιρροές. Θα µπορούσαµε να πούµε ότι η οντολογία είναι καθαρά δηλωτική (declarative) σε αντίθεση µε µια γλώσσα προγραµµατισµού που είναι διαδικαστική (procedural). Συνηθίζεται να λέγεται ότι στην πρώτη προσέγγιση προσδιορίζουµε το τι ενώ στη δεύτερη το πώς, η πρώτη είναι αχρονική ενώ η δεύτερη εκτυλίσσεται στο χρόνο. 6
Όµως αυτός ο απόλυτος διαχωρισµός δεν είναι ακριβής καθότι ένα δίκτυο επιρροών καθορίζει από µόνο του µια χρονική κατάταξη. Αν για παράδειγµα η Α επηρεάζει τη Β που επηρεάζει τη Γ, η πρώτη επιρροή πρέπει να πραγµατοποιηθεί πρώτη. Με άλλα λόγια σε κάθε περιγραφή ροής (ή επιρροής) εµπεριέχεται σε λανθάνουσα µορφή µια αιτιακή σχέση άρα µια χρονική ιεράρχηση. Αυτό το θέµα έχει συζητηθεί εκτενώς στην κοινότητα της ποιοτικής συλλογιστικής. Συνοπτικά, όταν λέµε ότι κάτι επηρεάζει κάτι άλλο, εισάγουµε αυτοµάτως µια χρονική διάταξη, µια αιτιατή σχέση: πρώτα υπάρχει αυτό που επηρεάζει και µετά η επιρροή διαδίδεται σαν µια ροή πληροφορίας, ύλης ή άλλου φυσικού πεδίου, στην οντότητα που επηρεάζεται και µετατρέπεται. Αιτία αυτής της µετατροπής είναι η πρώτη οντότητα. Η ποιοτική οντολογία θα µπορούσε να ειδωθεί ως ένα µοντέλο ροής δεδοµένων (data flow) στο βαθµό που δεν περιγράφεται η διαδικασία µε την οποία αυτές οι επιρροές θα λάβουν χώρα και στο βαθµό που κάποιος µπορεί να θεωρήσει ότι µια επιρροή είναι ένα είδος ροής πληροφορίας. Όµως αυτή η αντιµετώπιση δεν είναι απολύτως ικανοποιητική. Νοµίζουµε ότι η λέξη επιρροή είναι πιο ακριβής από τον όρο ροή, καθότι µε τον όρο "ροή" εννοούµε µια υλική (ή ενεργειακή µετατόπιση από ένα αντικείµενο σε άλλο) ενώ η επιρροή εκφράζει το γεγονός ότι αυτός που επηρεάζει δεν βλέπει την κατάστασή του να µετατρέπεται. 3. Παραδείγµατα επιρροών Ο σκοπός µιας ποιοτικής οντολογίας είναι να προτείνει µια ποιοτική προσέγγιση (µε την έννοια του ποιοτικού συλλογισµού, δηλαδή ασαφή, αφελή, αφηρηµένο, κ.λπ.) ενός αλγόριθµου. Σηµαίνει ότι πρέπει να είµαστε σε θέση να εκφράσουµε την ουσία ενός αλγόριθµου χρησιµοποιώντας τα εργαλεία και το φορµαλισµό της οντολογίας. Oι συντακτικές λεπτοµέρειες των συµβολισµών της καθώς και τα γραφικά θα αναλυθούν σε ένα εξειδικευµένο κεφάλαιο του εργαλείου. 3.1. Παράδειγµα 1 Ας υποθέσουµε ότι έχουµε έναν απλό αλγόριθµο που εντοπίζει το µέγιστο, το ελάχιστο και το µέσο όρο των βαθµολογιών των µαθητών µιας τάξης σε ένα διαγώνισµα. Για να εκφράσουµε αυτόν τον αλγόριθµο στην οντολογία µας, θα πρέπει πρώτα να παρατηρήσουµε ότι δεν µας ενδιαφέρει η δοµή που περιέχει τους βαθµούς. Μπορεί να είναι οργανωµένη µε βάση τα ονοµατεπώνυµα των µαθητών ή µε βάση τα µαθήµατα. Μπορεί να βρίσκεται σε ένα άλλο αρχείο µε άλλες βαθµολογίες ή ακόµα να χρειαστεί να τα βρούµε σε µια ιστοσελίδα. Ο τρόπος µε τον οποίο θα έχουµε πρόσβαση στους βαθµούς δεν µας ενδιαφέρει, ούτε και η συγκεκριµένη οργάνωσή τους. Θα υποθέσουµε λοιπόν ότι οι βαθµοί βρίσκονται µέσα σε ένα µάγµα Grades. Τα αποτελέσµατα είναι τρεις πραγµατικοί αριθµοί (άτοµα): max, min, mean. Ποιές είναι οι επιρροές που έχει το αρχικό µάγµα στα αποτελέσµατα. Για τα δύο πρώτα (max και min) παρατηρούµε ότι αποτελούν µια αντιγραφή των δεδοµένων του µάγµατος. Για να γίνει όµως αυτή η αντιγραφή χρειάζεται να συµβουλευτούµε την τιµή των βαθµών. Με άλλα λόγια, ανάλογα µε την τιµή των βαθµών θα δραστηριοποιήσουµε ή όχι (κατά τη διάρκεια του αλγόριθµου) την επιρροή αντιγραφής. Αυτό σηµαίνει ότι εκτός από την επιρροή αντιγραφής, το µάγµα Grades έχει επίσης µια επιρροή δραστηριοποίησης στις δύο πρώτες εξόδους. Για το τρίτο που είναι ο µέσος όρος χρειάζεται να δραστηριοποιηθεί ο υπολογισµός. Σηµειωτέον ότι ο υπολογισµός αυτός δραστηριοποιείται όποιες και να είναι οι βαθµολογίες, άρα δεν υπάρχει επιρροή δραστηριοποίησης γι αυτό το αποτέλεσµα. 7
Η γραφική απεικόνιση ενώνει µε διακοσµηµένα βέλη τον επηρεαστή (στην περίπτωσή µας Grades) µε τους επηρεαζόµενους (τα τρία αποτελέσµατα). Η διακόσµηση έχει ως εξής: Αντιγραφή: Υιοθετούµε ένα βέλος του οποίο βάση έχει ένα γεµισµένο κύκλο. Υπολογισµός: Υιοθετούµε ένα κανονικό βέλος. ραστηριοποίηση: Υιοθετούµε ένα διακεκοµµένο βέλος. Για την απεικόνιση ενός ατόµου θα χρησιµοποιούµε µόνο το όνοµά του, για την απεικόνιση του µάγµατος θα χρησιµοποιούµε ένα παραλληλόγραµµο που θα περιέχει το όνοµά του, ενώ αν επιθυµούµε να εµφανίσουµε στοιχεία του µάγµατος τα οποία παίζουν ρόλο στον αλγόριθµο θα τα εµφανίζουµε στο εσωτερικό του παραλληλόγραµµου, κάτι αντίστοιχο µε τις κλάσεις UML στο διάγραµµα κλάσεων. Στην περίπτωσή µας υπονοείται ότι το µόνο που µας ενδιαφέρει στο µάγµα Grades, είναι οι βαθµοί και τίποτα άλλο οπότε δεν είναι ανάγκη να τους συµπεριλάβουµε. 3.2. Παράδειγµα 2 Έστω ένας αλγόριθµος ο οποίος αφαιρεί ορισµένες λέξεις από ένα αρχείο και τις κωδικοποιεί χρησιµοποιώντας ένα κώδικα που περιγράφεται σε ένα σύνολο κλειδιών. Το αρχείο θα είναι το µάγµα Α και το κωδικοποιηµένο αποτέλεσµα το µάγµα Β. Επίσης θα ονοµάσουµε Κ το µάγµα µε τους κώδικες. Σηµειώνουµε επίσης ότι πρέπει να εκφράσουµε στην οντολογία την τελευταία έννοια που αποµένει, εκείνη της εξέλιξης µιας οντότητας (µάγµατος ή ατόµου). Η εξέλιξη, όπως είπαµε, είναι πάντα αποτέλεσµα διαφόρων επιρροών. Αυτό απεικονίζεται µε ένα απλό βέλος το οποίο θα ενώνει την κατάσταση πριν µε την κατάσταση µετά του εν λόγου αντικειµένου. Μπορούµε να απλοποιήσουµε τους συµβολισµούς των επιρροών µεταξύ δύο οντοτήτων συγχωνεύοντας τη διακόσµησή τους. Έτσι ένα διακεκοµµένο βέλος µε γεµισµένη βάση από το µάγµα Α στο µάγµα Β απεικονίζει την ύπαρξη δύο επιρροών. Το ίδιο κάναµε και στο προηγούµενο παράδειγµα. Σηµειώνουµε επίσης ότι εµφανίζονται δύο µάγµατα Α στο παραπάνω σχεδιάγραµµα, ένα πριν την αφαίρεση των λέξεων και ένα µετά. Ο διακόσµηση > πάνω από το απλό βέλος σηµαίνει ότι µειώθηκε ο όγκος του µάγµατος. Είδαµε ότι ένα µάγµα µπορεί να εξελιχθεί κάτω από την επίδραση τριών ειδών επιρροών. Την 8
εξέλιξη αυτή συµβολίζουµε µε ένα απλό τόξο το οποίο ενώνει το ίδιο µάγµα πριν και µετά από την εξέλιξη. Στο επόµενο σχεδιάγραµµα µία λίστα Α εξελίσσεται. Θα µπορούσαµε να υιοθετήσουµε τους συµβολισµούς Α (για πριν) και Α' (για µετά), αλλά η ύπαρξη ενός βέλους (άρα µιας χρονικής, αιτιατής, προτεραιότητας) δε µας το επιβάλλει. Μην ξεχνάµε ότι το Α αντιπροσωπεύει ένα συγκεκριµένο υποσύνολο της µνήµης που εξελίσσεται. Ας υποθέσουµε τώρα ότι αυτή η εξέλιξη οφείλεται σε δύο επιρροές: δραστηριοποίηση και αντιγραφή. Μπορούµε σ' αυτή την περίπτωση να συγχωνεύσουµε διαγραµµατικά τις δύο επιρροές στο ίδιο το τόξο εξέλιξης. Επίσης µπορούµε σε αυτό το σηµείο να διακοσµήσουµε αυτό το τόξο για να πούµε π.χ. ότι αυτές οι επιρροές αφορούν όλα τα στοιχεία του µάγµατος προσθέτοντας µια µικρή κάθετο (βλ. σχετική παράγραφο πιο κάτω). Εδώ έχουµε ένα µάγµα του οποίου εξέλιξη οφείλεται στο γεγονός ότι αντιγράψαµε όλα τα στοιχεία του Α συµβουλευόµενοι όλα τα στοιχεία του. Αυτό είναι το κλασικό µοντέλο συλλογιστικής οντολογίας µιας ρουτίνας ταξινόµησης (sort). Στο επόµενο παράδειγµα έχουµε µία εξέλιξη του Β καθότι αντιγράφουµε στα στοιχεία του όλα τα στοιχεία του Α. Πρόκειται δηλαδή για µία συγχώνευση. Παρατηρούµε επίσης ότι διακοσµήσαµε το βέλος εξέλιξης µε το σύµβολο < που σηµαίνει (ακολουθώντας τη φορά του βέλους) ότι το µάγµα Β ήταν µικρότερο πριν από την εξέλιξη. B < B ίνουµε ένα ανάλογο παράδειγµα αν εισάγαµε το Α σε µία υποδοµή του Β. 9
B < B Ας δούµε τώρα τι είδους διακοσµήσεις µπορούµε να βάλουµε στις διάφορες επιρροές. +/- Αυτή η διακόσµηση αφορά την επιρροή δραστηριοποίησης και την επιρροή υπολογισµού. Στην πρώτη σηµαίνει ότι η αύξηση της τιµής του αυξάνει την πιθανότητα δραστηριοποίησης. Π.χ. στη συνθήκη (a > b) οι επιρροές του a και του b είναι επιρροές δραστηριοποίησης, η πρώτη όµως θα διακοσµηθεί µε "+" ενώ η δεύτερη µε "-". Όσον αφορά την επιρροή υπολογισµού, η διακόσµηση "+" ή " " σηµαίνει ότι υπάρχει µία ποιοτική σχέση µονοτονίας µεταξύ της εισόδου και του αποτελέσµατος. Στο επόµενο ποιοτικό διάγραµµα, υπολογίζουµε το µέγιστο και το ελάχιστο ενός πίνακα Α. + max, min Έχουµε κι εδώ δύο επιρροές (δραστηριοποίηση και αντιγραφή) καθότι συγκρίνουµε τα στοιχεία του Α προκειµένου να δραστηριοποιήσουµε την αντιγραφή των δύο στοιχείων. Σηµειωτέον ότι για αυτή την περίπτωση θα µπορούσαµε να είχαµε προσθέσει και τη διακόσµηση της µικρής καθέτου (µόνο για την δραστηριοποίηση και χωρίς να κάνουµε συγχώνευση) για να δείξουµε ότι είµαστε αναγκασµένοι να συµβουλευτούµε όλα τα στοιχεία του µάγµατος Α. Η χρήση της διακόσµησης "+" σηµαίνει ότι όταν το µάγµα αυξάνει στην τιµή (ή ακόµα και στο µέγεθος στην προκειµένη περίπτωση) αυτό έχει µία αυξητική επιρροή στο µέγιστο και στο ελάχιστο. Η κάθετος (ως προς το βέλος) που διακοσµεί µια επιρροή σηµαίνει ότι η επιρροή αφορά το σύνολο των στοιχείων του επηρεάζοντα. Στο επόµενο παράδειγµα ένα σύνολο λέξεων W εµπλουτίζεται µε τους χαρακτήρες κενό ή αλλαγή γραµµής ανάλογα µε το µήκος της κάθε λέξης. Βλέπουµε εδώ ότι όλες οι λέξεις αντιγράφονται, αλλά και όλες οι λέξεις εξετάζονται προκειµένου να παρεµβάλουµε µεταξύ τους κενά ή την αλλαγή γραµµής. Εδώ έχουµε ένα κλασικό µοντέλο επεξεργασίας κειµένου (justification). Παρατηρούµε επίσης ότι το µέγεθος του αρχικού µάγµατος αυξήθηκε. 10
W space, return < W @ Το σύµβολο at χρησιµοποιείται για να δείξουµε ότι οι επιρροές δεν αφορούν το περιεχόµενο της µνήµης αλλά τη διεύθυνσή της. Ανάλογα µε τη θέση του (αρχή ή τέλος του βέλους) δηλώνουµε από (σε) ποιό µάγµα προέρχονται (προορίζονται) οι διευθύνσεις. Στο επόµενο παράδειγµα επιθυµούµε να ανταλλάξουµε τις τιµές του µέγιστου µε το ελάχιστο. Γι αυτό το σκοπό εξετάζουµε τα στοιχεία του Α και αποθηκεύουµε στις µνήµες max, min τις διευθύνσεις του µέγιστου και ελάχιστου (και όχι τις τιµές τους). Χρησιµοποιούµε στη συνέχεια αυτές τις δύο διευθύνσεις για να τις αντιγράψουµε ανταλλάσσοντας έτσι τα περιεχόµενά τους. @ max, min 1, 2, 3... n >1, <= 4, κ.λ.π Μπορούµε, προσθέτοντας έναν αριθµό ή µια ανισότητα σε µια επιρροή ή µια εξέλιξη, να προσδιορίσουµε πόσα (ή το πολύ ή το ελάχιστο) στοιχεία αλλάζουν ή συµµετέχουν στην επιρροή. Στο επόµενο παράδειγµα αντιγράφουµε όλα τα στοιχεία ενός µάγµατος Α σε δύο υποµάγµατα (χωρίς όνοµα) του Β. ύο στοιχεία από το κάθε υποµάγµα µετατρέπονται σύµφωνα µε µία εσωτερική διαδικασία. 11
B B = 2 = 2 <, <=, >, >= Χρησιµοποιούµε αυτά τα σύµβολα για να εκφράσουµε τη µεταβολή µεγέθους ενός µάγµατος πριν και µετά από µια εξέλιξη. Για παράδειγµα, ας πάρουµε τα ποιοτικά µοντέλα των ρουτινών pop και push σε µια στοίβα Α. Παρατηρούµε ότι στην pop (αριστερά στο επόµενο σχεδιάγραµµα) το µέγεθος του Α είναι µεγαλύτερο από µετά. Το αντίθετο ισχύει για την push (δεξιά στο σχεδιάγραµµα). > a a < L, G, C Τα τρία αυτά σύµβολα αφορούν µόνο τα βέλη εξέλιξης και εκφράζουν την τοπολογία των στοιχείων που υπέστησαν την αλλαγή. L(ocal) : η µετατροπή ήταν τοπική. Αφορά µόνο µερικά στοιχεία του µάγµατος. G(lobal) : η µετατροπή είναι καθολική. C(onnected) : τα στοιχεία που υπέστησαν την µετατροπή αποτελούν ένα συνεκτικό υποσύνολο του µάγµατος. Για παράδειγµα, αλλάζουν τρία διαδοχικά στοιχεία σε έναν πίνακα ή µία ολόκληρη στήλη σε ένα δισδιάστατο πίνακα. Στη συνέχεια δίνουµε µερικά παραδείγµατα εφαρµογής της ποιοτικής οντολογίας. Όλα τα παραδείγµατα δεν έχουν αναγκαστικά όλες τις διακοσµήσεις. 1) Υπολογισµός του µέγιστου και του ελάχιστου ενός πίνακα. 12
2) Υπολογισµός του µέσου όρου mean των στοιχείων ενός πίνακα Α, που είναι µεγαλύτερα ενός ορίου threshold. max, min threshold mean 3) Αρχικοποίηση ενός πίνακα µε την αρχική τιµή initvalue. initvalue 4) Στο επόµενο σχεδιάγραµµα εξετάζουµε αν το στοιχείο elem ανήκει στον πίνακα Α. Παρατηρούµε ότι η απάντηση στηρίζεται σε µία αντιγραφή από µία δοµή που περιέχει µόνο δύο άτοµα yes, no. yes, no elem answer 13
5) Το κλασικό πρόβληµα knapsack. ιαθέτουµε ένα σύνολο αντικειµένων µε διαφορετικές αξίες και βάρη. ιαθέτουµε ένα σάκο Sack µε περιορισµένη αντοχή (capacity) στο βάρος. Ποιά είναι τα αντικείµενα που πρέπει να επιλέξουµε έτσι ώστε να αντέξει το συνολικό βάρος (weight) ο σάκος µας αλλά και να µεγιστοποιούν τη συνολική αξία (price); K capacity Sack weight, price 6) Μετάφραση ενός αρχείου χαρακτήρων στον αντίστοιχο SCII κώδικά τους. Chars 0..255 Codified 7) Υπολογισµός του µέσου όρου ηλικίας από ένα σύνολο φοιτητών που είναι µεγαλύτεροι από ένα όριο. Ας υπογραµµιστεί ότι ακολουθούµε τη φιλοσοφία του µάγµατος και δεν προσδιορίζουµε, εφόσον δεν υπάρχει αµφισηµία, σε ποιά υποδοµή τοποθετείται η µεταβλητή age. Students age threshold mean_age 8) Μεταφορά ορισµένων στοιχείων του µάγµατος Α στο µάγµα Β. 14
B > < B 9) Στο επόµενο παράδειγµα τα µάγµατα Α και Β δεν είναι οµοιόµορφα, περιέχουν διευθύνσεις καθώς και τιµές. Χρησιµοποιούµε το περιεχόµενο µερικών διευθύνσεων του Α για να εντοπίσουµε ορισµένες διευθύνσεις στο Β και να αντιγράψουµε το περιεχόµενό τους στο Α. Οι διευθύνσεις του Β σβήνονται ενώ το µέγεθος του Α παραµένει αµετάβλητο. @ @ B > B 10) Στο επόµενο σχήµα έχουµε δύο µάγµατα Β και C. Η διεύθυνση του Β µας επιτρέπουν να κάνουµε υπολογισµούς που αφορούν το Α. Επίσης από το C θα αντιγράψουµε ορισµένα αντικείµενα συγκρίνοντάς µε το a. Το νέο µάγµα Α θα εξελιχθεί εκ νέου υπολογιστικά και µε αντιγραφή ορισµένων στοιχείων του. 15
B C @ a 11) Τέλος δίνουµε ένα παράδειγµα ανώµαλου σχήµατος. Πράγµατι η εξέλιξη του, δηλαδή η αύξηση του µεγέθους του οφείλεται µόνο στη χρήση (χωρίς υπολογισµό ή αντιγραφή) των στοιχείων του. Αυτό είναι αδύνατο. < Στη συνέχεια θα δούµε ποιές είναι οι επιπτώσεις µιας τέτοιας προσέγγισης στην ανάλυση και τον έλεγχο ενός αλγόριθµου. Και για να γίνει αυτό θα πρέπει να πάµε πιο µακριά και να δούµε πώς οι 16
κλασικές φυσικές έννοιες της ποιοτικής συλλογιστικής (συνέχεια, συνεκτικότητα, παράγωγος, οριακές συµπεριφορές, τάξεις σύγκρισης για να ξέρουµε αν κάτι αυξάνεται ή µειώνεται) µεταφράζονται στον κόσµο των αλγόριθµων. Για να γίνει αυτό πρέπει να εµπλουτίσουµε την λογισµική οντολογία µας µε αλγεβρικές δοµές που επιτρέπουν την αντιµετώπιση µιας αλγοριθµικής µετατροπής σαν να ήταν µια κλασική µαθηµατική σχέση. ΑΛΓΕΒΡΙΚΕΣ ΟΜΕΣ Ε ΟΜΕΝΩΝ 1. Σχέσεις διάταξης για τις δοµές δεδοµένων ενός αλγόριθµου Για να είµαστε σε θέση να αναλύσουµε το αποτέλεσµα ενός αλγόριθµου ποιοτικά, το ελάχιστο που πρέπει να είµαστε σε θέση να πράξουµε είναι να συγκρίνουµε το αποτέλεσµα µε ένα άλλο αποτέλεσµα. Ορίζουµε καταρχήν µια σχέση διάταξης µεταξύ των ατόµων της οντολογίας. Υπενθυµίζουµε ότι µια σχέση διάταξης " " επαληθεύει για κάθε στοιχείο α : α α (ανακλαστική) α β και β α συνεπάγεται α = β (αντισυµµετρική) α β και β γ συνεπάγεται α γ (µεταβατική) Όταν δύο στοιχεία µπορούν να συγκριθούν λέµε ότι είναι συγκρίσιµα. Όταν όλα τα στοιχεία είναι συγκρίσιµα, η διάταξη είναι ολική, στην αντίθεση περίπτωση η διάταξη είναι µερική. Μιλάµε τότε για µερικώς διατεταγµένο σύνολο (partially ordered set ή αλλιώς poset) ή µεδιασύνολο. Είδαµε προηγουµένως ότι µε άτοµα εννοούµε τις εξής προγραµµατιστικές δοµές: 1. Ακέραιοι ή πραγµατικοί. Αυτές οι δοµές µπορεί να είναι οποιουδήποτε εύρους και ακρίβειας. Θα χρησιµοποιηθεί εδώ η κλασική διάταξη των πραγµατικών αριθµών η οποία είναι ολική. 2. Συµβολοσειρές και χαρακτήρες. Αν και οι συµβολοσειρές (τις οποία θα ονοµάζουµε και λέξεις ) εθεωρούντο µη ατοµικές δοµές, στις πρόσφατες γλώσσες προγραµµατισµού, χρησιµοποιούνται στην πράξη ως ανεξάρτητες και αυτόνοµες δοµές (εκτός φυσικά και αν ασχολούµαστε µε αλγόριθµους που διαχειρίζονται το εσωτερικό τους, οπότε πρέπει να τις θεωρήσουµε ως ένα µάγµα χαρακτήρων). Στην οντολογία µας θα θεωρήσουµε ότι οι χαρακτήρες λειτουργούν ως συµβολοσειρές εκτός και αν χρησιµοποιούνται ως κώδικες. Στην τελευταία περίπτωση, χρησιµοποιούµε τον SCII κώδικα για να τα ταξινοµήσουµε. Γενικότερα, στη βιβλιογραφία έχουν προταθεί πολλές σχέσεις διάταξης για τις συµβολοσειρές. Η πιο διαδεδοµένη διάταξη είναι η λεξικογραφική (αλφαβητική) που έχει την ιδιότητα να είναι ολική. Υπάρχουν όµως κι άλλες διατάξεις που αποδίδουν στο σύνολο τους τη δοµή ενός µεδιασυνόλου. Για παράδειγµα, µια µερική διάταξη µπορεί να οριστεί ως εξής: σ1 σ2 όταν η ακολουθία γραµµάτων της σ1 εµφανίζεται µέσα στη σ2 Έτσι, άγρα διάγραµµα χρονοδιάγραµµα, αλλά η λέξης χρόνος είναι µη συγκρίσιµη µε τη λέξη χρονοδιάγραµµα. 3. Λογικές τιµές. Εδώ ορίζουµε συµβατικά τη διάταξη false true. Θα επεκτείνουµε τώρα τις διατάξεις των ατόµων σε πιο περίπλοκες δοµές που είναι τα µάγµατα. Στην οντολογία µας δεν ενδιαφέρει να συγκρίνουµε δύο οποιαδήποτε µάγµατα, αν και υπάρχουν πάντα τρόποι να ορίσουµε ολικές διατάξεις για έναν οποιονδήποτε τύπου µάγµατος (π.χ. λεξικογραφικές διατάξεις), αλλά κάτι τέτοιο δεν θα ήταν πολύ ενδιαφέρον. Αυτό που µας ενδιαφέρει είναι να συγκρίνουµε το ίδιο µάγµα σε δύο διαφορετικές καταστάσεις. Πιο συγκεκριµένα µας ενδιαφέρει να συγκρίνουµε τα στοιχεία του ιδίου µάγµατος Μ πριν και µετά από µια αλλαγή. Αυτή η αλλαγή θα είναι µικρή όπως θα δούµε αλλά αυτό είναι µια άλλη υπόθεση. 17
Για να επεκτείνουµε µια διάταξη στα µάγµατα θα υποθέσουµε ότι τα µάγµατα παρουσιάζονται σε µια δενδροειδή µορφή της οποίας τα τερµατικά (φύλλα), αν υποθέσουµε ότι έχουµε επαναφέρει όλους τους δείκτες, είναι άτοµα. Με άλλα λόγια υποθέτουµε ότι ΕΝ έχουµε κυκλικές µορφές δεδοµένων π.χ. αλυσιδωτές κυκλικές λίστες. Μπορούµε εύκολα να ορίσουµε µια διάταξη και σε αυτές τις περιπτώσεις. Ξεχωρίζουµε δύο περιπτώσεις: Στην πρώτη περίπτωση το µάγµα είναι οµοιόµορφο, δηλαδή, περιέχει σ' ένα πρώτο επίπεδο τον ίδιο τύπο δεδοµένων (π.χ. πίνακας). Εδώ ορίζουµε µια διάταξη ως εξής. Αν τα µάγµατα Α και Β έχουν το ίδιο πλήθος στοιχείων, έστω α ι και β ι, τότε γράφουµε Α Β όταν για κάθε δείκτη ι έχουµε α ι β ι. Εννοείται ότι αυτός ο ορισµός µπορεί να γίνει αναδροµικός στην περίπτωση που τα στοιχεία δεν είναι ατοµικά µέχρις ότου φτάσουµε στα φύλλα. Αν όµως τα µάγµατα δεν έχουν το ίδιο πλήθος και τα στοιχεία του Α περιέχονται στο Β, τότε θα πούµε Α Β. Αν κανένα µάγµα δεν περιέχεται σε άλλο, τότε Α και Β θα θεωρούνται µη συγκρίσιµα. Η περιεκτικότητα µπορεί να εννοηθεί ως ακολουθία ή συνολοθεωρητικά. Στη δεύτερη περίπτωση, όπου το µάγµα δεν είναι οµοιόµορφο (κάτι που αντιστοιχεί σε ένα αντικείµενο του αντικειµενοστραφούς προγραµµατισµού), για να είναι τα µάγµατα συγκρίσιµα θα πρέπει να έχουν την ίδια δοµή οπότε η σύγκριση θα εξαρτηθεί από την (ενδεχοµένως αναδροµική) σύγκριση των στοιχείων τους. Αν δεν έχουν την ίδια δοµή τότε θα θεωρούνται µη συγκρίσιµα. Ας µην ξεχνάµε ότι µας ενδιαφέρει να συγκρίνουµε το ίδιο µάγµα πριν και µετά την εκτέλεση µιας πράξης. Το να αλλάξει δυναµικά δοµή ένα µάγµα (και όχι µόνος τιµές ή καινούργια οµοιόµορφα στοιχεία), είναι κάτι που δεν αποκλείεται από την οντολογία µας, αλλά είναι σχετικά σπάνιο γιατί αυτό θα σήµαινε ότι ένα αντικείµενο προσέλαβε, κατά τη διάρκεια της εκτέλεσης, καινούργιες µεταβλητές µέλη, κάτι που είναι ιδιαίτερα δύσκολο να γίνει σε µια κλασική αντικειµενοστραφή γλώσσα προγραµµατισµού που δεν έχει ανακλαστικές (reflexion όπως στη Java) λειτουργίες. Παράδειγµα. Έστω ότι ένα µάγµα φοιτητής περιλαµβάνει τα πεδία: όνοµα, ηλικία, φύλο και µια λίστα βαθµών που είναι ακέραιοι. Ας υποθέσουµε ότι ένα αντικείµενο φοιτητής φ1 µετατράπηκε σε φ2 ύστερα από µερικές επιρροές. ε θα εξετάσουµε την περίπτωση που το φ2 έχει ένα πεδίο περισσότερο από το φ1. Αποκλείουµε την περίπτωση που οι επιρροές θα προσέθεταν για παράδειγµα στο µάγµα φ1 το πεδίο αριθµός κινητού, ο οποίος δεν υπάρχει (µε την έννοια ότι δεν έχει προβλεφθεί) στο φ1. Σ' αυτήν την περίπτωση θεωρούµε ότι τα δύο µάγµατα δεν είναι συγκρίσιµα. Αντίθετα οι αλλαγές που µπορεί να έγιναν για να προκύψει το φ2 είναι η αφαίρεση µερικών βαθµών και η αύξηση της ηλικίας του. Σ' αυτήν την περίπτωση θα συγκρίνουµε το φ1 µε το φ2 συγκρίνοντας καταρχήν τις ηλικίες (µε την κλασική διάταξη) και ενδεχοµένως την παλιά λίστα βαθµών µε την καινούργια. Έστω ότι η παλιά λίστα του φ1 είναι η ακόλουθη: [8, 10, 10, 1, 2] και ας δούµε σε τι θα µπορούσε να εξελιχθεί αυτή η βαθµολογία στο φ2: [9,10,10,2,3] αύξηση [0, 0,0,1,2] µείωση [8,10,10,1,2,8,9] αύξηση καθότι η λίστα φ2 περιλαµβάνει τη φ1 [10] µείωση [5,5,10,2,3,8] µη συγκρίσιµα καθότι κανένα δεν περιέχει κανένα [6,12,10,1,2] µη συγκρίσιµα καθότι ο πρώτος βαθµός είναι µικρότερος ενώ ο δεύτερος είναι µεγαλύτερος. Με αυτό το παράδειγµα βλέπουµε ότι ακόµα και αν πρόκειται για το ίδιο αντικείµενο σε διαφορετικές καταστάσεις, αλλά µε την ίδια δοµή, τίποτα δεν µας εξασφαλίζει, εκ των προτέρων, ότι τα δύο µάγµατα θα είναι συγκρίσιµα. 18
2. Ο γράφος φάσεων ενός αλγόριθµου Μετά τον ορισµό των σχέσεων διάταξης που διέπουν τα δεδοµένα ενός αλγόριθµου, θα ορίσουµε µια δεύτερη σηµαντική έννοια της ποιοτικής οντολογίας: το γράφο φάσεων. Ο γράφος φάσεων είναι το αντίστοιχο του χώρου φάσεων ενός φυσικού συστήµατος και µπορεί να ειδωθεί σαν τη γραφική αναπαράσταση της εκτέλεσης ενός αλγόριθµου µε τον ίδιο τρόπο που µια καµπύλη απεικονίζει τη συµπεριφορά µιας µαθηµατικής σχέσης. Σε γενικές γραµµές ένας γράφος Γ είναι ένα ζεύγος (Χ, Υ) όπου Χ είναι ένα οποιοδήποτε σύνολο και Υ ένα σύνολο που αποτελείται από ζεύγη στοιχείων του Χ. Γράφουµε επίσης Γ(Χ,Υ). Κάθε στοιχείο του Χ µπορεί να ειδωθεί ως ένας κόµβος. Κάθε ζεύγος του Υ, ας πούµε (χ1, χ2) µπορούµε να το παραστήσουµε ως εξής: χ1 χ2. Τίποτα δεν αναγκάζει το χ1 να είναι διαφορετικό από το χ2. Στην περίπτωση που είναι όµοια, το βέλος επιστρέφει στον εαυτό του και λέµε ότι έχουµε ένα βρόχο. Έστω ένας αλγόριθµος Λ, τον οποίο θέλουµε να αναλύσουµε µε εισόδους και εξόδους. Έστω και το σύνολο Ε που αντιστοιχεί σε όλες τις δυνατές εισόδους που προδιαγράφονται για το Λ. Χρησιµοποιώντας το παράδειγµά µας µε τους φοιτητές, το σύνολο Ε αντιστοιχεί σε όλες τις δυνατές τιµές που η τάξη µπορεί να πάρει και αυτό αντιστοιχεί σε όλες τις δυνατές διαστάσεις που µπορεί να λάβει προγραµµατιστικά ο πίνακας των φοιτητών συνδυαζόµενο µε όλες τις δυνατές τιµές που µπορεί να πάρει η λίστα των βαθµών, το φύλου του, κ.λπ. Το σύνολο Ε είναι ένα πολύ µεγάλο σύνολο ακόµη και για µικρές εφαρµογές, που αντιστοιχεί τυπικά στο καρτεσιανό γινόµενο των πεδίων τιµών των παραµέτρων που αποτελούν την τάξη. Ένα στοιχείο ε του συνόλου Ε είναι µια συγκεκριµένη επιλογή τιµών εισόδων ε. Το ε αντιστοιχεί πρακτικά σε µια λίστα µεταβλητών. Για παράδειγµα, το ε1 αντιστοιχεί στο όνοµά του, το ε2 στο φύλο του κ.ο.κ. Μια άλλη είσοδος ζ αντιστοιχεί και αυτή σε µια άλλη επιλογή τιµών εισόδου π.χ. ζ1 είναι µια άλλη τιµή ονόµατος από το ε1, ζ2 µια επιλογή για το φύλο, κ.ο.κ. Είδαµε στην αρχή ότι ο αλγόριθµος είναι προσδιοριστικός, άρα για µια συγκεκριµένη επιλογή εισόδων ε η εκτέλεση του αλγόριθµου (εντός ενός συγκεκριµένου χρονικού διαστήµατος γιατί στην αντίθετη περίπτωση θεωρείται εσφαλµένος) θα παράγει πάντα (όποια και να είναι η σειρά εκτέλεσης καθότι δεν διαθέτουµε µνήµη) το ίδιο αποτέλεσµα ω. Το ίδιο θα συµβεί και για µια άλλη, διαφορετική επιλογή εισόδου ε' η οποία θα παραγάγει ένα αποτέλεσµα ω'. Το ω' δεν είναι αναγκαστικά διαφορετικό του ω, καθότι διαφορετικές είσοδοι µπορεί να δίνουν το ίδιο αποτέλεσµα. Για κάθε στοιχείο ε του συνόλου Ε θα σχηµατίσουµε το ζεύγος (ε, Λ(ε)) όπου ω είναι το αποτέλεσµα που δίνει ο αλγόριθµος Λ όταν του υποβάλουµε τις εισόδους που αντιστοιχούν στη συγκεκριµένη επιλογή των τιµών της ε. Αν, για παράδειγµα, το λογισµικό έχει σαν σκοπό να υπολογίζει το µέσο όρο της βαθµολογίας ενός φοιτητή και να µας πληροφορεί αν περνάει το έτος ή όχι µε µια λογική τιµή, τότε ένα πιθανό ε θα µπορούσε να ήταν: παπαδόπουλος άνδρας 22 [5,5,6,4,10] όπου 22 είναι η ηλικία του φοιτητή και ακολουθεί η λίστα των βαθµών του. Αν το Λ είναι σωστό τότε θα παραγάγει ως αποτέλεσµα 6, δηλαδή, (5+5+6+4+10)/5 και true καθότι ο φοιτητής παπαδόπουλος προβιβάστηκε. Το Λ(ε) είναι η εικόνα του ε από τον µετασχηµατισµό Λ µε το ίδιο τρόπο που θα γράφαµε µια µαθηµατική σχέση, όπως φ(χ) = ηµ(χ) + χ + 2. Άρα το ζεύγος που θα σχηµατιστεί είναι: (ε, ω) = (ε, Λ(ε)) = (< παπαδόπουλος, άνδρας, 22, [5,5,6,4,10]>, <6, true>) όπου χρησιµοποιήσαµε τα σύµβολα < και > για να οριοθετήσουµε τις δύο λίστες εισόδου και εξόδου. Ένα άλλο παράδειγµα ζεύγους εισόδων/εξόδων θα µπορούσε να είναι το ακόλουθο: (ε', ω') = (ε', Λ(ε')) = (< καραπούλιου, γυναίκα, 20, [7,7,9,9,8]>, <8, true>) 19
Θα χρησιµοποιήσουµε τώρα το ζεύγος (ε, Λ(ε)) για να κατασκευάσουµε τους κόµβους του γράφου φάσεων. Με άλλα λόγια ο γράφος φάσεων Φ(Χ, Υ) έχει ένα Χ, δηλαδή ένα σύνολο κόµβων που ισούται µε όλα τα δυνατά ζεύγη (ε, Λ(ε)) που µπορούν να σχηµατιστούν σύµφωνα µε τις προδιαγραφές του Λ. Είναι ευνόητο ότι ο Φ έχει τόσους κόµβους όσα στοιχεία έχει το Ε, δηλαδή οι κόµβοι του Φ είναι τόσοι όσες και οι δυνατές τιµές από τις προδιαγραφόµενες εισόδους του Λ. Μας µένει τώρα να δούµε πώς θα ενώσουµε τους διάφορους κόµβους του Φ, µε άλλα λόγια πώς θα σχηµατίσουµε το σύνολο Υ των βελών του Φ. Θα ζωγραφίζουµε ένα βέλος από τον κόµβο (ε, Λ(ε)) στον κόµβο (ε', Λ(ε')) αν οι είσοδοι ε και ε' έχουν την ελάχιστη διαφορά ή (αν θέλουµε απόσταση) που µπορούν να έχουν δύο διαφορετικές εισόδους µεταξύ τους. Στο βέλος αυτό θα προσθέσουµε µια ετικέτα που αντιστοιχεί στην συγκεκριµένη παράµετρο στην οποία διαφέρουν οι δύο είσοδοι. Αν, για παράδειγµα, δύο είσοδοι είναι ακριβώς πανοµοιότυπες αλλά διαφέρουν µόνο στην δεύτερη παράµετρό τους που είναι το φύλο, τότε θα σχηµατίσουµε µια ακµή (ε, ε') της οποίας ο προσανατολισµός εξαρτάται από τη σχέση διάταξης που διέπει αυτή τη συγκεκριµένη παράµετρο. Αν δηλαδή έχουµε άνδρας γυναίκα τότε το βέλος θα πηγαίνει από την είσοδο που έχει το φύλο άνδρας στην είσοδο που έχει το φύλο γυναίκα. Ξέρουµε ότι µεταξύ αυτών των εισόδων δεν µπορεί να υπάρξει άλλο βέλος µε άλλη ετικέτα καθότι εξ υποθέσεως το φύλο είναι η µόνη διαφορά τους. Για ένα βέλος του τύπου (χ1, χ2) µε την ετικέτα ηλικία, θα πούµε επίσης ότι ο χ1 ενώνεται µε τον χ2 µε κατεύθυνση το πεδίο ηλικία. Ας πάρουµε ένα άλλο παράδειγµα. Υποθέτουµε ότι έχουµε δύο εισόδους: ε = < παπαδόπουλος, άνδρας, 22, [5,5,6,4,10]> και ε'= < παπαδόπουλος, άνδρας, 22, [5,5,6,5,10]> Παρατηρούµε ότι οι δύο αυτές είσοδοι διαφέρουν µόνο ως προς τη βαθµολογία που πήραν οι οµώνυµοι φοιτητές στο τέταρτο µάθηµα της λίστας (ο πρώτος έχει πάρει 4 και ο δεύτερος 5). Βλέπουµε δηλαδή ότι οι δύο αυτές είσοδοι διαφέρουν µόνο σε µια παράµετρο και πληρούν την ελάχιστη δυνατή διαφορά. Μην ξεχνάµε ότι υποθέσαµε ότι οι βαθµοί είναι ακέραιοι, άρα η ελάχιστη διαφορά είναι 1. Αντιθέτως, αν είχαµε υποθέσει ότι οι βαθµοί είναι δεκαδικοί, τότε θα έπρεπε, για να ενώσουµε τους δύο κόµβους, να είχαµε ένα βαθµό του τύπου 4.0000001, όπου φυσικά το.0000001 θα ήταν η ελάχιστη διαφορά που θα διαχώριζε δύο διαφορετικούς βαθµούς. Στην πραγµατικότητα, αυτή η διαφορά µπορεί να είναι πολύ µικρότερη καθότι οι γλώσσες προγραµµατισµού και οι σύγχρονοι επεξεργαστές προσφέρουν µεγαλύτερη ακρίβεια. Εδώ πάντως θα ζωγραφίσουµε ένα βέλος σύµφωνα µε τη φυσική σχέση διάταξης που διέπει τους ακέραιους. Το ίδιο φαινόµενο θα είχαµε αν συναντούσαµε µια είσοδο η οποία θα είχε ακριβώς το ίδιο φύλο και ακριβώς τους ίδιους βαθµούς µε το ε αλλά το όνοµα θα ήταν παραδόπουλος, δηλαδή περίπου το ίδιο µε το προηγούµενο. Προσοχή η γειτνίαση στο γράφο φάσεων ορίζεται σύµφωνα µε την ελάχιστη απόσταση στο χώρο των εισόδων και όχι στο χώρο των εξόδων. Θα συµβολίσουµε τους γείτονες ενός κόµβου Κ = (ε, Λ(ε)) µε το συµβολισµό Κ + δ όπου δ εκφράζει µια απειροελάχιστη µετατροπή. Κ+δ είναι λοιπόν ένα σύµβολο κόµβων, µε κέντρο τον Κ, οι οποίοι είναι γείτονες του Κ. Με τοπολογικούς όρους, το Κ + δ είναι η γειτονιά του Κ στο γράφο φάσεων. Καταλαβαίνουµε λοιπόν ότι ο γράφος φάσεων είναι ένας τεράστιος και πυκνότατος γράφος, ο οποίος αποτελεί το αντίστοιχο της γραφικής απεικόνισης της σχέσης Λ και όπως δεν απεικονίζουµε ποτέ µε όλες τις λεπτοµέρειες µια µαθηµατική σχέση από το µείον άπειρο µέχρι το συν άπειρο, έτσι κι εδώ δεν θα απεικονίσουµε ούτε θα κατασκευάσουµε ποτέ εκτενώς το γράφο φάσεων Φ ενός λογισµικού. Ο Φ θα χρησιµοποιηθεί σαν µια πρώτη ύλη, πιο συγκεκριµένα θα κατασκευαστούν αλγεβρικά πηλίκα, για να κατανοήσουµε την υφή της Λ. 3. Οµοµορφισµοί γράφων και η υπόθεση συγκρισιµότητας Σε ένα διακριτό κόσµο όπως είναι οι ακέραιοι, οι γράφοι και οι υπολογιστικές µηχανές δεν είναι 20
δυνατό να εφαρµόσουµε τον κλασικό ορισµό της συνέχειας. Αυτός ο τελευταίος ισχυρίζεται ότι σε µια κλασική συνεχή µαθηµατική σχέση µπορούµε πάντα να αλλάξουµε όσο λίγο θέλουµε την έξοδο (ή αν θέλουµε την εικόνα φ(χ)) φτάνει να αλλάξουµε λίγο και την είσοδο. Με λίγα λόγια, όταν αλλάζουµε για πολύ λίγο την είσοδο τότε δεν έχουµε εκπλήξεις στην συµπεριφορά των εξόδων. Σ' ένα διακριτό κόσµο όµως η έννοια του όσο µικρό θέλουµε είναι ανεδαφική γιατί πάντα έχουµε ένα κατώτατο όριο που αντιστοιχεί στην ακρίβεια που έχουµε για έναν δεκαδικό. Αν διασκευάζαµε πιστά την έννοια της συνέχειας σε έναν διακριτό κόσµο αυτό θα σήµαινε ότι αν, για παράδειγµα, ένας εκ των βαθµών ενός φοιτητή αυξηθεί κατά µία µονάδα (που είναι η ελάχιστη αύξηση για έναν ακέραιο) τότε ο µέσος όρος θα πρέπει να αυξηθεί κατά την ελάχιστη δεκαδική ακρίβεια του υπολογιστή. Όµως καταλαβαίνουµε ότι η αύξηση κατά µια µονάδα ενός βαθµού θα προσαύξανε κατά 0.2 (καθότι οι βαθµοί είναι πέντε) το αποτέλεσµα, αριθµός ο οποίος είναι σαφώς µεγαλύτερος από την ελάχιστη ακρίβεια του υπολογιστή. Άρα, τυπικά, ο αλγόριθµος δεν είναι συνεχής. Αυτό δεν σηµαίνει όµως ότι συµπεριφέρεται τυχαία και ότι δεν έχει κανονικότητες, αλλά ότι πρέπει να ξαναορίσουµε την έννοια συνέχεια. Προτού ορίσουµε µια κεντρική έννοια της ποιοτικής προσέγγισης, την έννοια της συγκρισιµότητας, θα δούµε πώς διασκευάζεται η έννοια της συνέχειας στην κατηγορία των γράφων. Έστω µια σχέση Λ µεταξύ δύο γράφων Γ(Χ,Υ) και Γ'(Χ', Υ'), δηλαδή µια σχέση που σε κάθε κόµβο του Χ αντιστοιχίζει έναν κόµβο του Χ'. Αυτό που θέλουµε είναι, η µετακίνηση από έναν κόµβο χ1 του Γ σε έναν κοντινό (δηλαδή, που ενώνεται µε βέλος) κόµβο χ2 του Γ συνεπάγεται ότι και οι εικόνες τους από τη Λ θα παραµείνουν όµοιες ή κοντά στον Γ'. Πιο τυπικά χ1 χ2 συνεπάγεται Λ(χ1) = Λ(χ2) ή Λ(χ1) Λ(χ2) Όταν µια σχέση Λ µεταξύ δύο γράφων πληροί αυτή την υπόθεση τότε λέµε ότι αποτελεί έναν οµοµορφισµό γράφων. Υπάρχουν κι άλλοι ορισµοί για τους οµοµορφισµούς γράφων όµως εµείς θα υιοθετήσουµε τον προηγούµενο. Ας σηµειωθεί ότι στη θεωρία των κατηγοριών, η κλασική έννοια της συνέχειας αποτελεί µια ειδική περίπτωση µορφισµού στην κατηγορία των πραγµατικών σχέσεων. Θα χρησιµοποιήσουµε συχνά τους οµοµορφισµούς για να αναλύσουµε τους γράφους πηλίκα του γράφου φάσεων. Όµως το πρόβληµα της συνέχειας παραµένει όταν µιλάµε για αλγόριθµους. Είδαµε πριν ότι ακόµα και για έναν απλό αλγόριθµο όπως είναι η εύρεση του µέσου όρου, είναι αδύνατο να περιµένουµε απειροστές µεταβολές στο αποτέλεσµα του αλγόριθµου, όταν διενεργούµε απειροστές µεταβολές στις εισόδους. Σηµαίνει αυτό ότι για απειροστές µετακινήσεις τα αποτελέσµατα µπορεί να είναι οποιαδήποτε; Ασφαλώς όχι. Υπόθεση 3 : Η υπόθεση συγκρισιµότητας (ΥΣ). Η βασική υπόθεσή µας είναι ότι στα λογισµικά που γράφονται έµµεσα ή άµεσα από ανθρώπους (δεν είναι δηλαδή τυχαίες αλλά συντακτικά σωστές εντολές) για απειροστές µεταβολές οι έξοδοι ναι µεν δεν µετακινούνται πάντα απειροστά, αλλά παραµένουν συγκρίσιµες µε το προηγούµενο αποτέλεσµα. Θα ονοµάσουµε τους αλγόριθµους που πληρούν αυτήν την υπόθεση αλγόριθµους τοπικής συγκρισιµότητας (ΤΣ). Η υπόθεση αυτή µπορεί να θεωρηθεί πολύ χαλαρή και αυτονόητη. Ιδιαίτερα στο παράδειγµά µας η υπόθεση αυτή ισχύει τετριµµένα καθότι ο αλγόριθµος έχει µόνο ένα αποτέλεσµα (το µέσο όρο) και αυτό το αποτέλεσµα πληροί µια ολική σχέση διάταξης (τη φυσική διάταξη των ακεραίων). Άρα ό,τι και να έχουµε ως αποτέλεσµα θα είναι συγκρίσιµο µε τα προηγούµενα και ο αλγόριθµος είναι τετριµµένα τοπικά συγκρίσιµος. Όµως, αν το σκεφτούµε καλά, από την στιγµή που µια έξοδος ανήκει σ' ένα µεδιασύνολο που δεν είναι ολικό, τίποτα δεν µας εξασφαλίζει την τοπική συγκρισιµότητα. Ας υποθέσουµε ότι ένας αλγόριθµος έχει έναν ακέραιο α ως είσοδο και ως αποτέλεσµα ένα πίνακα. Ας υποθέσουµε, επίσης, ότι για την είσοδο 31 το αποτέλεσµα είναι [4, 1, 10, 100, 5] και ότι µετατρέποντας απειροστά την είσοδο από 31 σε 32 έχουµε ως αποτέλεσµα [5, 0, 10, 100, 5] ή [3, 7]. Βλέπουµε ότι κανένα από τα δύο πιθανά αποτελέσµατα δεν είναι συγκρίσιµο µε το αρχικό που αντιστοιχούσε στο 31. Κάτι καταστροφικό και απρόοπτο συνέβη 21