Τίτλος Υποέργου: Εφαρµογές Τεχνητής Νοηµοσύνης στην Τεχνολογία Λογισµικού και στην Ιατρική

Σχετικά έγγραφα
Τίτλος Υποέργου: Εφαρµογές Τεχνητής Νοηµοσύνης στην Τεχνολογία Λογισµικού και στην Ιατρική

"The Project ARXIMIDIS ΙΙ is co-funded by the European Social Fund and National Resources EPEAEK ΙΙ "

Τίτλος Υποέργου: Εφαρµογές Τεχνητής Νοηµοσύνης στην Τεχνολογία Λογισµικού και στην Ιατρική

Βασικές δοµές δεδοµένων. Ορολογία λιστών. 8.1 Βασικές έννοιες δοµών δεδοµένων 8.2 Υλοποίηση δοµών δεδοµένων 8.3 Μια σύντοµη υπόθεση εργασίας

Α. Ερωτήσεις Ανάπτυξης

n true false if t then t else t u t t b t emptylist cons t t t t λx.t u ::= head tail isempty

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ιαφάνειες παρουσίασης #11

Περιεχόμενα Πρόλογος 1. Εισαγωγή 2. Τα Βασικά Μέρη ενός Προγράμματος Prolog

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ουρές Προτεραιότητας. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κεφάλαιο 6 ο Εισαγωγή στον Προγραμματισμό 1

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

for for for for( . */

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

ΑΕΠΠ Ερωτήσεις θεωρίας

Πληροφορική 2. Αλγόριθμοι

Εισαγωγή - Βασικές έννοιες. Ι.Ε.Κ ΓΛΥΦΑΔΑΣ Τεχνικός Τεχνολογίας Internet Αλγοριθμική Ι (Ε) Σχολ. Ετος A Εξάμηνο

ÔÏÕËÁ ÓÁÑÑÇ ÊÏÌÏÔÇÍÇ

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΕΠΛ 434: Λογικός Προγραμματισμός

a = 10; a = k; int a,b,c; a = b = c = 10;

ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

A) Να γράψετε στο τετράδιό σας τον αριθµό καθεµιάς από τις παρακάτω προτάσεις 1-10 και δίπλα τη λέξη Σωστό, αν είναι σωστή, ή τη λέξη Λάθος, αν είναι

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Α1. Να γράψετε στο τετράδιό σας τον αριθµό καθεµιάς από τις παρακάτω προτάσεις 1-5 και, δίπλα, τη λέξη ΣΩΣΤΟ, αν η πρόταση είναι σωστή, ή τη λέξη

Β. Να εξηγήσετε τι σηµαίνει ολίσθηση ενός δυαδικού αριθµού 3 θέσεις αριστερά µπορεί να είναι: Α: ουρά Β:στοίβα Γ:και τα δυο :τίποτα

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Επιµέλεια Θοδωρής Πιερράτος

Ενότητα 7 Ουρές Προτεραιότητας

4.1 Θεωρητική εισαγωγή

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Σχεσιακή Άλγεβρα και Σχεσιακός Λογισμός. Σχεσιακή Άλγεβρα Σχεσιακός Λογισμός

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

Σου προτείνω να τυπώσεις τις επόμενες τέσσερις σελίδες σε ένα φύλο διπλής όψης και να τις έχεις μαζί σου για εύκολη αναφορά.

Εισαγωγή στην επιστήµη των υπολογιστών ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ

Διδάσκων: Παναγιώτης Ανδρέου

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

ΑΛΓΟΡΙΘΜΟΙ ΜΕ C. ΝΙΚΟΛΑΟΣ ΣΑΜΑΡΑΣ Αναπληρωτής Καθηγητής. CMOR Lab. Computational Methodologies and Operations Research

ΙΑΓΩΝΙΣΜΑ ΣΤΗΝ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΘΕΜΑ 1 Α.

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

o AND o IF o SUMPRODUCT

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Απλοποιεί τα γεγονότα έτσι ώστε να περιγράφει τι έχει γίνει και όχι πως έχει γίνει.

ΚΕΦΑΛΑΙΟ Μηχανική Μάθηση

Προγραμματισμός Η/Υ (ΤΛ2007 )

Γλώσσες υψηλού επιπέδου Περιέχουν περισσότερες εντολές για την εκτέλεση πολύπλοκων εργασιών Τα προγράµµατα µεταφράζονται σε γλώσσα µηχανής είτε από το

Αριθµητική Ολοκλήρωση

Κεφάλαιο 6 Εισαγωγή στον Προγραμματισμό. 26-Jun-15 ΑΕΠΠ - Καραμαούνας Π. 1

ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ Γ ΤΑΞΗ

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της;

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

Week. 6: Java Collections

Λογικός Προγραµµατισµός: Η Γλώσσα Prolog

Επιλογή και επανάληψη. Λογική έκφραση ή συνθήκη

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΟΜΟΣΠΟΝ ΙΑ ΕΚΠΑΙ ΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑ ΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2014 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Εισαγωγή στην επιστήµη των υπολογιστών. Υπολογιστές και Δεδοµένα Κεφάλαιο 3ο Αναπαράσταση Αριθµών

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

υαδικό έντρο Αναζήτησης (BSTree)

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

Μαλούτα Θεανώ Σελίδα 1

5.1 Θεωρητική εισαγωγή

Επίπεδα Γραφήματα : Προβλήματα και Υπολογιστική Πολυπλοκότητα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εισαγωγή στην επιστήµη των υπολογιστών. Αναπαράσταση Αριθµών

ΤΕΛΟΣ 1ΗΣ ΑΠΟ 5 ΣΕΛΙ ΕΣ

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΠΑΝΕΛΛΑΔΙΚΩΝ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

Διαδικασιακός Προγραμματισμός

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Βασικές Αρχές Προγραμματισμού

Γνωριµία µε τη Microsoft Access

Επαναληπτικό ιαγώνισµα Πληροφορικής Γ Γυµνασίου Γιώργος Λιακέας Σχολικός Σύµβουλος Πληροφορικής Ερωτήσεις

Εισαγωγή στον Προγ/μό Υπολογιστών

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

Transcript:

Αρχιµήδης ΙΙ Ενίσχυση Ερευνητικών Οµάδων του ΤΕΙ Κρήτης Τίτλος Υποέργου: Εφαρµογές Τεχνητής Νοηµοσύνης στην Τεχνολογία Λογισµικού και στην Ιατρική Επιστηµονικός Υπεύθυνος: ρ Εµµανουήλ Μαρακάκης ραστηριότητα 1: Εργαλεία Μετασχηµατισµού και Επαλήθευσης Προγραµµάτων. Πακέτο Εργασίας 1.2 (ΠΕ 1.2): Υλοποίηση του Συστήµατος Μετασχηµατισµών. Χρονική ιάρκεια : 1/8/05 µέχρι 31/11/05 Παραδοτέο: Π1.2 - Λογισµικό και η Τεχνική Περιγραφή του Συστήµατος Λογισµικού. Τίτλος Τεχνικής Περιγραφής: Φειδίας: Ένα Αυτόµατο Σύστηµα Μετασχηµατισµού Λογικών Προγραµµάτων. Μέλη της ερευνητικής Οµάδας Ονοµατεπώνυµο Α. ρ Εµµανουήλ Μαρακάκης Υπογραφή Β. Χαρά Κουνάλη Γ. Μαριάννα Σγουράκη Επιστηµονικός Υπεύθυνος Υποέργου "The Project ARXIMIDIS ΙΙ is co-funded by the European Social Fund and National Resources EPEAEK ΙΙ " 1

2

Περιεχόµενα Κατάλογος Προγραµµάτων... 5 Κατάλογος Σχηµάτων... 5 Κατάλογος Εικόνων... 5 1. Εισαγωγή... 7 2. Εισαγωγικές έννοιες... 9 2.1. Αναπαράσταση σε Βασική Μορφή... 9 2.1.1. Εισαγωγή στον µετα-προγραµµατισµό... 9 2.1.2. Αναπαράσταση Προγράµµατος-Αντικείµενο σε Βασικούς Όρους... 9 2.2. Ταξινοµηµένα υαδικά έντρα... 12 2.2.1. Εισαγωγή στα Ταξινοµηµένα υαδικά έντρα... 12 2.2.2. Εύρεση, διαγραφή και εισαγωγή στοιχείου δυαδικού δέντρου... 13 3. Αναπαραστάσεις... 14 3.1. Αναπαράσταση Προγράµµατος σαν Λίστα Λιστών... 15 3.1.1. Παράσταση Προγράµµατος-Αντικείµενο σε Βασικούς Όρους στο σύστηµά µας... 15 3.2. Αναπαράσταση Προγράµµατος σαν Ταξινοµηµένο υαδικό έντρο... 16 4. Αυτόµατο Σύστηµα Μετασχηµατισµού Λογικών Προγραµµάτων... 21 4.1. Αρχιτεκτονική Συστήµατος και Περιγραφή Κύριων Τµηµάτων του... 21 4.2. Οι Αλγόριθµοι Μετασχηµατισµών... 24 4.2.1. Αλγόριθµος υλοποίησης της πράξης της Εισαγωγής Ορισµού... 24 4.2.2. Αλγόριθµος υλοποίησης της πράξης της Ανάπτυξης... 27 4.2.3. Αλγόριθµος υλοποίησης της πράξης της Πτύξης... 36 4.3. Άλλοι Σηµαντικοί Αλγόριθµοι του υποσυστήµατος «µετασχηµατισµού προγραµµάτων» του συστήµατος Φειδίας... 46 4.3.1. Εισαγωγή...46 4.3.2. Κορυφαίος Αλγόριθµος υποσυστήµατος «Μετασχηµατισµού Προγραµµάτων»... 46 4.3.3. Αλγόριθµος µετατροπής προγράµµατος από µη-βασική σε βασική µορφή... 51 4.3.4. Αλγόριθµος υλοποίησης της αναπαράστασης προγράµµατος από µορφή λίστας σε ταξινοµηµένο δυαδικό δέντρο (SBT)... 52 4.3.5. Αλγόριθµος µετασχηµατισµού ενός προγράµµατος πλην των πράξεων της εισαγωγής ορισµού, της ανάπτυξης και της πτύξης στο πρόγραµµα που παριστάνεται σαν Τ... 54 4.3.6. Αλγόριθµος δηµιουργίας της λίστας των "αχρησιµοποίητων" ορισµάτων, Lunused... 60 4.3.7. Αλγόριθµος εφαρµογής του µετασχηµατισµού ανάπτυξης σε προτάσεις που έχουν σαν σώµα τους το βασικό κατηγόρηµα true... 61 4.3.8. Αλγόριθµος µετατροπής της αναπαράστασης προγράµµατος από ταξινοµηµένο δυαδικό δέντρο (SBT) σε µορφή λίστας ProgrGr... 64 4.3.9. Αλγόριθµος µετατροπής ενός προγράµµατος βασικής αναπαράστασης (µορφή λίστας) ProgrGr σε πρόγραµµα µη-βασικής µορφής ProgrNonGr... 65 4.4. ιεπικοινωνία συστήµατος... 67 4.4.1. Εισαγωγή...67 4.4.2. ιεπικοινωνία Visual Basic Prolog... 68 4.4.3. Περιγραφή ιεπικοινωνίας του συστήµατος Φειδίας... 70 4.5. Ένα πλήρες Σενάριο Χρήσης του συστήµατος Φειδίας... 75 5. Συµπεράσµατα και µελλοντικές βελτιώσεις και επεκτάσεις... 87 3

6. Βιβλιογραφία... 89 4

Κατάλογος Προγραµµάτων ΠΡΟΓΡΑΜΜΑ 2.1 : ΠΑΡΑΣΤΑΣΗ ΣΕ ΒΑΣΙΚΟΥΣ ΌΡΟΥΣ 11 ΠΡΟΓΡΑΜΜΑ 2.2 : ΕΥΡΕΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΥΑ ΙΚΟ ΕΝΤΡΟ 13 ΠΡΟΓΡΑΜΜΑ 2.3 : ΠΡΟΣΘΕΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΥΑ ΙΚΟ ΕΝΤΡΟ 14 ΠΡΟΓΡΑΜΜΑ 2.4 : ΙΑΓΡΑΦΗ ΣΤΟΙΧΕΙΟΥ ΑΠΟ ΥΑ ΙΚΟ ΕΝΤΡΟ 14 ΠΡΟΓΡΑΜΜΑ 3.1 : ΠΡΟΓΡΑΜΜΑ-ΑΝΤΙΚΕΙΜΕΝΟ SUM/2 15 ΠΡΟΓΡΑΜΜΑ 3.2 : ΠΑΡΑΣΤΑΣΗ ΣΕ ΒΑΣΙΚΟΥΣ ΌΡΟΥΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ 3.1 16 ΠΡΟΓΡΑΜΜΑ 3.3 : ΠΑΡΑΣΤΑΣΗ ΣΑΝ ΤΑΞΙΝΟΜΗΜΕΝΟ ΥΑ ΙΚΟ ΕΝΤΡΟ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ 3.1 19 Κατάλογος Σχηµάτων ΣΧΗΜΑ 2.1 : ΥΑ ΙΚΟ ΕΝΤΡΟ 12 ΣΧΗΜΑ 2.2 : ΤΑΞΙΝΟΜΗΜΕΝΟ ΥΑ ΙΚΟ ΕΝΤΡΟ 12 ΣΧΗΜΑ 4.1 : ΤΑ ΤΜΗΜΑΤΑ ΤΟΥ ΥΠΟΣΥΣΤΗΜΑΤΟΣ «ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΥ ΠΡΟΓΡΑΜΜΑΤΩΝ» 22 ΣΧΗΜΑ 4.2 : ΑΝΑΛΥΤΙΚΗ ΠΕΡΙΓΡΑΦΗ ΤΟΥ ΤΜΗΜΑΤΟΣ C 23 Κατάλογος Εικόνων ΕΙΚΟΝΑ 4.1 : ΚΥΡΙΟΣ ΚΑΤΑΛΟΓΟΣ ΕΠΙΛΟΓΩΝ 71 ΕΙΚΟΝΑ 4.2 : ΑΡΧΙΚΑ ΠΡΟΓΡΑΜΜΑΤΑ ΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟ 72 ΕΙΚΟΝΑ 4.3 : ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ 72 ΕΙΚΟΝΑ 4.4 : ΠΡΟΒΟΛΗ ΑΡΧΙΚΩΝ ΠΡΟΓΡΑΜΜΑΤΩΝ 73 ΕΙΚΟΝΑ 4.5 : ΠΡΟΒΟΛΗ ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΩΝ ΠΡΟΓΡΑΜΜΑΤΩΝ 73 ΕΙΚΟΝΑ 4.6 : ΕΠΙΛΟΓΗ ΠΡΟΓΡΑΜΜΑΤΩΝ ΓΙΑ ΕΚΤΕΛΕΣΗ 74 ΕΙΚΟΝΑ 4.7 : ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ 74 ΕΙΚΟΝΑ 4.8 : ΕΝΤΟΛΗ ΑΞΙΟΛΟΓΗΣΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ 75 ΕΙΚΟΝΑ 4.9 : ΑΠΟΤΕΛΕΣΜΑΤΑ ΑΞΙΟΛΟΓΗΣΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ 75 ΕΙΚΟΝΑ 4.10 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ - ΚΥΡΙΟΣ ΚΑΤΑΛΟΓΟΣ 76 ΕΙΚΟΝΑ 4.11 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΠΙΛΟΓΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟ 76 ΕΙΚΟΝΑ 4.12 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΚΤΕΛΕΣΗ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΥ 77 ΕΙΚΟΝΑ 4.13 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΟΛΟΚΛΗΡΩΣΗ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΥ 77 ΕΙΚΟΝΑ 4.14 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΠΙΛΟΓΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟ 77 ΕΙΚΟΝΑ 4.15 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΠΙΛΟΓΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΙΑ ΠΡΟΒΟΛΗ 78 ΕΙΚΟΝΑ 4.16 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΠΡΟΒΟΛΗ ΠΡΟΓΡΑΜΜΑΤΟΣ 78 ΕΙΚΟΝΑ 4.17 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΠΙΛΟΓΗ ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΙΑ ΠΡΟΒΟΛΗ 79 ΕΙΚΟΝΑ 4.18 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΠΡΟΒΟΛΗ ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ 79 ΕΙΚΟΝΑ 4.19 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΠΙΛΟΓΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΙΑ ΕΚΤΕΛΕΣΗ 80 ΕΙΚΟΝΑ 4.20 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΛΙΣΤΑ ΑΡΧΙΚΩΝ ΠΡΟΓΡΑΜΜΑΤΩΝ ΓΙΑ ΕΚΤΕΛΕΣΗ 80 ΕΙΚΟΝΑ 4.21 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ 81 ΕΙΚΟΝΑ 4.22 : ΕΠΙΣΤΡΟΦΗ ΑΠΟΤΕΛΕΣΜΑΤΟΣ ΑΠΟ ΤΗΝ ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ 81 ΕΙΚΟΝΑ 4.23 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΛΙΣΤΑ ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΩΝ ΠΡΟΓΡΑΜΜΑΤΩΝ ΓΙΑ ΕΚΤΕΛΕΣΗ 82 ΕΙΚΟΝΑ 4.24 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΚΤΕΛΕΣΗ ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ 82 ΕΙΚΟΝΑ 4.25 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΠΙΣΤΡΟΦΗ ΑΠΟΤΕΛΕΣΜΑΤΟΣ ΑΠΟ ΤΗΝ ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ 83 ΕΙΚΟΝΑ 4.26 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΑΞΙΟΛΟΓΗΣΗ ΠΡΟΓΡΑΜΜΑΤΩΝ 83 ΕΙΚΟΝΑ 4.27 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΕΠΙΛΟΓΗ ΑΡΧΙΚΟΥ-ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΙΑ ΑΞΙΟΛΟΓΗΣΗ 84 ΕΙΚΟΝΑ 4.28 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΣΤΟΧΟΣ ΑΞΙΟΛΟΓΗΣΗΣ ΤΩΝ ΕΠΙΛΕΓΕΝΤΩΝ ΠΡΟΓΡΑΜΜΑΤΩΝ 84 ΕΙΚΟΝΑ 4.29 : ΠΛΗΡΕΣ ΣΕΝΑΡΙΟ ΑΠΟΤΕΛΕΣΜΑΤΑ ΑΞΙΟΛΟΓΗΣΗΣ 85 5

6

1. Εισαγωγή Ο στόχος αυτής της τεχνικής αναφοράς είναι η παρουσίαση της υλοποίησης του συστήµατος µετασχηµατισµού λογικών προγραµµάτων. Το σύστηµα βελτιώνει λογικά προγράµµατα µετασχηµατίζοντάς τα σε ισοδύναµα προγράµµατα µικρότερου µεγέθους (µικρότερο πλήθος προτάσεων και αποµάκρυνση αχρησιµοποίητων ορισµάτων) και πιθανόν περισσότερο αποτελεσµατικά. Όπως ο γλύπτης παίρνει ένα ακατέργαστο υλικό και µετά από επεξεργασία του δίνει µορφή, έτσι και το σύστηµά µας παίρνει ένα δοµηµένο (προγραµµατιστικά άκοµψο) πρόγραµµα, αποµακρύνει τα περιττά στοιχεία (ορίσµατα ή στοιχειώδης τύπους «literals» ή και ολόκληρες προτάσεις «clauses») και το κάνει προγραµµατιστικά πιο κοµψό (πιο αποτελεσµατικό, µικρότερο σε πλήθος προτάσεων, χωρίς περιττά στοιχεία). Αυτό το σύστηµα µετασχηµατισµού Λογικών Προγραµµάτων ονοµάζεται «Φειδίας» κατ αντιστοιχία µε το όνοµα του γλύπτη που φιλοτέχνησε τον Παρθενώνα. Η δοµή των προγραµµάτων που βελτιώνει το σύστηµα Φειδίας εµπεριέχουν τις σχεδιαστικές αποφάσεις που πάρθηκαν κατά την κατασκευή τους. Το πλεονέκτηµα τους είναι η ευκρινής δοµή τους η οποία δηµιουργείται µε ηµι-αυτόµατο τρόπο. Η ευκρίνεια της δοµής τους είναι χρήσιµη για την κατασκευή τους και για την συντήρηση τους. Τα µειονέκτηµα τους τα οποία δηµιουργούνται λόγω του ηµι-αυτόµατου τρόπου κατασκευής τους είναι το µεγάλο πλήθος σε προτάσεις καθώς και οι αχρησιµοποίητες µεταβλητές στα κατηγορήµατα. Αυτά τα µειονεκτήµατα τα οποία µπορεί να έχουν συνέπεια στην αποτελεσµατικότητα τους λύνονται µε µετασχηµατισµό τους σε ισοδύναµα προγράµµατα. Οι µετασχηµατισµοί οι οποίοι χρησιµοποιούνται από το σύστηµα Φειδίας είναι οι Νέοι ορισµοί (New definitions), η Ανάπτυξη (Unfold) και η Πτύξη (Fold). Η ηµιαυτόµατη µεθοδολογία κατασκευής τους στηρίζεται σε σχήµατα προγραµµάτων όπου το κάθε σχήµα παριστά και µια σχεδιαστική απόφαση. Για τις παραπάνω τεχνικές, θα µελετηθεί ο τρόπος αναπαράστασης ενός προγράµµατος σε βασική µορφή (ground representation), καθώς και ο τρόπος αναπαράστασης σε ταξινοµηµένο δυαδικό δέντρο (sorted binary tree). Θεωρούµε ότι ο αναγνώστης γνωρίζει βασικές έννοιες του Λογικού Προγραµµατισµού όπως µετονοµασία µεταβλητών (variable renaming), αντικατάσταση (substitution), ταυτοποίηση (unification), εφαρµογή αντικαταστάσεων (apply substitution) και σύνθεση αντικαταστάσεων (composition of substitutions). Επιπλέον, ο αναγνώστης γνωρίζει τους ορισµούς των µετασχηµατισµών, Νέοι ορισµοί (New definitions), Ανάπτυξη (Unfold) και Πτύξη (Fold) [Tamaki and Sato, 1984], [Pettorossi and Proietti, 1998], [Pettorossi and Proietti, 1999], [Pettorossi and Proietti, 2000] καθώς και την µεθοδολογία µετασχηµατισµού λογικών προγραµµάτων [Μαρακάκης, Κουνάλη και Σγουράκη, 2005] που κατασκευάζονται µε την µέθοδο [Marakakis and Gallagher, 1994], [Marakakis, 1997].. Το Σύστηµα Φειδίας υλοποιήθηκε σε γλώσσα προγραµµατισµού Prolog [Μαρακάκης, 2004], [Bratko, 2001], [SICStus Prolog User s Manual, 2003], [Sterling and Shapiro, 1997]. Η διεπικοινωνία (Interface) του συστήµατος υλοποιήθηκε στη γλώσσα προγραµµατισµού Visual Basic [Petroutsos, 1998]. Ο χρήστης εισάγει τα δεδοµένα µέσω παραθυρικού και γραφικού περιβάλλοντος. Το σύστηµα δίνει τα αποτελέσµατα είτε µέσω του ίδιου παραθύρου ή σε µορφή αρχείου κειµένου. 7

Τα υπόλοιπα κεφάλαια αυτής της τεχνικής αναφοράς έχουν ως εξής: Στο δεύτερο κεφάλαιο παρουσιάζονται έννοιες όπως µετα-προγραµµατισµός, αναπαράσταση προγράµµατος σε βασική µορφή και ταξινοµηµένα δυαδικά δέντρα. Στο τρίτο κεφάλαιο γίνεται παρουσίαση των αναπαραστάσεων του προγράµµατος και των µετασχηµατισµών στο σύστηµα Φειδίας. Στο τέταρτο κεφάλαιο γίνεται αρχιτεκτονική περιγραφή του συστήµατός µας. Περιγράφονται τα τµήµατα (modules) που το απαρτίζουν και που αλληλεπιδρούν µεταξύ τους καθώς επίσης και ο σχεδιασµός της διεπικοινωνίας του συστήµατος. Τέλος, δίνεται ένα πλήρες σενάριο χρήσης του συστήµατος. Στο πέµπτο κεφάλαιο αναφέρονται τα συµπεράσµατα, οι δυνατές επεκτάσεις και οι τυχόν αδυναµίες του συστήµατος. 8

2. Εισαγωγικές έννοιες 2.1. Αναπαράσταση σε Βασική Μορφή 2.1.1. Εισαγωγή στον µετα-προγραµµατισµό Μετα-γλώσσα είναι µια γλώσσα που περιγράφει κάποια άλλη γλώσσα [Μαρακάκης, 2004]. Η περιγραφόµενη γλώσσα ονοµάζεται γλώσσα-αντικείµενο. Για παράδειγµα, έστω ότι έχουµε την παρακάτω πρόταση «ο πληθυντικός των ουσιαστικών στην Αγγλική σχηµατίζεται προσθέτοντας την κατάληξη s πλην των ουσιαστικών που τελειώνουν σε ch, -sh, -o, -x και ss στα οποία προστίθεται η κατάληξη es». Στην πρόταση αυτή, η Ελληνική γλώσσα χρησιµοποιείται σαν µετα-γλώσσα για να περιγράψει την Αγγλική γλώσσα (γλώσσα-αντικείµενο). Μετα-πρόγραµµα είναι ένα πρόγραµµα που δέχεται σαν δεδοµένα ένα άλλο πρόγραµµα. Το πρόγραµµα που χρησιµοποιείται σαν δεδοµένα ονοµάζεται πρόγραµµααντικείµενο. Οι µεταφραστές (interpreters), οι µεταγλωττιστές (compilers), οι µετασχηµατιστές προγραµµάτων, οι αναλυτές προγραµµάτων (analyzers), κτλ. είναι µεταπρογράµµατα. Η γλώσσα στην οποία γράφεται ένας µεταφραστής ή ένας µεταγλωττιστής είναι η µετα-γλώσσα και η γλώσσα την οποία µεταφράζει ή µεταγλωττίζει είναι η γλώσσα αντικείµενο. Ο µετα-προγραµµατισµός είναι εύκολος στην Prolog αλλά και γενικά στις γλώσσες του λογικού προγραµµατισµού, επειδή προγράµµατα και δεδοµένα µπορούν να παρασταθούν µε τον ίδιο τρόπο. ύο τρόποι υπάρχουν για να παραστήσουµε ένα πρόγραµµα-αντικείµενο. 1. Αναπαράσταση σε βασικούς όρους (ground representation). 2. Αναπαράσταση σε µη-βασικούς όρους (non-ground representation). 2.1.2. Αναπαράσταση Προγράµµατος-Αντικείµενο σε Βασικούς Όρους Ένας τρόπος παράστασης λογικών προγραµµάτων γίνεται µε βάση τους παρακάτω κανόνες [Hill and Gallagher, 1998], [Μαρακάκης, 2004] : 1. Κάθε σταθερά της γλώσσας-αντικείµενο παριστάνεται από µία µοναδική σταθερά της µετα-γλώσσας. 2. Κάθε µεταβλητή της γλώσσας-αντικείµενο παριστάνεται από µια µοναδική σταθερά της µετα-γλώσσας. 3. Κάθε συνάρτηση (όρος) f µε πληθυκότητα ν>0, f/ν, της γλώσσας-αντικείµενο παριστάνεται από µία µοναδική συνάρτηση (όρος) f µε πληθυκότητα ν>0, f/ν, της µεταγλώσσας. 4. Κάθε κατηγόρηµα p µε πληθυκότητα ν>0 της γλώσσας-αντικείµενο παριστάνεται από µία µοναδική συνάρτηση f µε πληθυκότητα ν>0 της µετα-γλώσσας. 5. Κάθε λογικός σύνδεσµος µε ν τελεστέους της γλώσσας-αντικείµενο παριστάνεται έµµεσα από το «,» (κόµµα) που χωρίζει τα στοιχεία της λίστας. Ένας τρόπος παράστασης των συµβόλων και των παραστάσεων (εκφράσεων) της γλώσσας αντικείµενο είναι ο εξής. Σύµβολο γλώσσας αντικείµενο Μεταβλητή π.χ. Χ Αναπαράσταση σε βασικούς όρους σταθερά x ή όρος v(i) (ή var(i)) όπου i ακέραιος. 9

Σταθερά π.χ. d Όνοµα Συνάρτησης π.χ. g Πρόταση (preposition) π.χ. q Όνοµα Κατηγορήµατος π.χ. q σταθερά d ή όρος c(i) όπου i ακέραιος. σταθερά g ή όρος f(i) όπου i ακέραιος σταθερά q ή όρος p(i) όπου i ακέραιος σταθερά q ή όρος p(i) όπου i ακέραιος Λογικό και ( ) έµµεσα από το «,» (κόµµα) που χωρίζει τα στοιχεία της λίστας. Συνεπαγωγή ( ) έµµεσα από το «,» (κόµµα) που χωρίζει τα στοιχεία της λίστας. Άρνηση ( ) Έκφραση της γλώσσας αντικείµενο Σταθερά, π.χ. d Όρος (term), π.χ. g(t 1,..,t v ) Ατοµικός τύπος (atom), π.χ. q(t 1,..,t v ) συνάρτηση not/1 Αναπαράσταση σε βασικούς όρους Σταθερά d, ή όρος term(d,[]) ή όρος term(c(i),[]) Λίστα [g, t 1,,t v ] ή λίστα [f(i), t 1,..,t v ] ή όρος g(t 1,..,t v ) Λίστα [q, t 1,,t v ] ή λίστα [p(i), t 1,..,t v ] ή όρος q(t 1,..,t v ) τύπος A B Στοιχεία στην ουρά της λίστας [..,A,B,..] τύπος A Στοιχείο στην ουρά της λίστας [.., not A,..] τύπος A B Λίστα [A,B] τύπος A Λίστα [A] ή λίστα [Α, true] ή λίστα [Α, []] Ένα πρόγραµµα παριστάνεται σαν µια λίστα από προτάσεις. Κάθε πρόταση του προγράµµατος-αντικείµενο είναι στοιχείο µιας λίστας µε στοιχεία λίστες. Η κεφαλή κάθε πρότασης είναι το πρώτο στοιχείο της λίστας και ακολουθούν οι στόχοι του σώµατος µε την σειρά που βρίσκονται στην πρόταση. ηλαδή, θα έχουµε τον εξής τρόπο παράστασης: Παράσταση προγράµµατος [[Πρόταση 1 ], [Πρόταση 2 ],..., [Πρόταση κ ] ] Παράσταση προτάσεων [[Κεφαλή_πρότασης], [1 ος _στοιχειώδης_τύπος], [2 ος _στοιχειώδης_τύπος],...] 10

Για παράδειγµα, η πρόταση Α Β, C, D, E παριστάνεται ως εξής: [[A], [B], [not C], [D], [E]] Παράσταση στοιχειωδών τύπων (literals) (θετικών ατοµικών τύπων ) [Κατηγόρηµα, 1 ο _όρισµα, 2 ο _όρισµα,...] ή Κατηγόρηµα(1 ο _όρισµα, 2 ο _όρισµα,...) Για παράδειγµα, ο θετικός ατοµικός τύπος p(x, Y, a, f(x)) παριστάνεται ως εξής: [p, v(1), v(2), a, f(v(1))] ή [p, v(1), v(2), a, [f,v(1)]] ή p(v(1), v(2), a, f(v(1))) Παράσταση στοιχειωδών τύπων (literals) (αρνητικών ατοµικών τύπων ) [not Κατηγόρηµα, 1 ο _όρισµα, 2 ο _όρισµα,...] ή not Κατηγόρηµα(1 ο _όρισµα, 2 ο _όρισµα,...) Για παράδειγµα, ο αρνητικός ατοµικός τύπος p(x, Y, a, f(x)) παριστάνεται ως εξής: [not p, v(1), v(2), a, f(v(1))] ή [not p, v(1), v(2), a, [f, v(1)]] ή not p(v(1), v(2), a, f(v(1))) Παράδειγµα Το κατηγόρηµα member/2 είναι αληθές εάν το στοιχείο X ανήκει στη λίστα L. member(x, [X T]) true. member(x, [Y T]) member(x, T). Στο παράδειγµά µας υπάρχουν οι εξής αντιστοιχίες παραστάσεων: Σύµβολο γλώσσας αντικείµενο Μεταβλητές : Χ, Υ, Τ Συναρτήσεις : [ ] Κατηγορήµατα : member, true Όροι : [X T], [Y T] Τύποι : member(x, [X T]) true member(x, [Y T]) member(x, T) Αναπαράσταση σε βασικούς όρους v(1), v(3), v(2) cons member, true [cons, v(1), v(2)], [cons,v(3),v(2)] [[member, v(1), [cons, v(1), v(2)]], true], [[member, v(1), [cons, v(3), v(2)]], [member, v(1),v(2)]] Με βάση τα παραπάνω το κατηγόρηµα member/2 παριστάνεται ως εξής χρησιµοποιώντας την λίστα της Prolog : [ [[member, v(1), [cons, v(1), v(2)]], true], [[member, v(1), [cons, v(3), v(2)]], [member, v(1),v(2)]] ] Πρόγραµµα 2.1 : Παράσταση σε Βασικούς Όρους 11

2.2. Ταξινοµηµένα υαδικά έντρα 2.2.1. Εισαγωγή στα Ταξινοµηµένα υαδικά έντρα Τα δυαδικά δέντρα παριστάνονται σαν όροι της µορφής [Μαρακάκης 2004], [Bratko, 2001], [Sterling and Shapiro, 1997]: binarytree( Data, LeftSubtree, RightSubtree ), όπου Data είναι τα δεδοµένα του τρέχοντος κόµβου του δέντρου, LeftSubtree είναι το αριστερό υπόδεντρο, RightSubtree είναι το δεξιό υπόδεντρο. Ένα άδειο δυαδικό δέντρο παριστάνεται από το άτοµο nil. Για παράδειγµα, το δέντρο του σχήµατος 2.2 παριστάνεται σαν όρος της Prolog ως εξής : binarytree(a, binarytree(b, binarytree(c, nil, nil), binarytree(d, nil, nil)), binarytree(e, nil, nil)). a b e c d Σχήµα 2.1 : υαδικό έντρο Ένα µη-άδειο δυαδικό δέντρο binarytree( Χ, Left, Right ), όπου X είναι τα δεδοµένα του τρέχοντος κόµβου θεωρείται ταξινοµηµένο όταν ισχύουν τα εξής : Όλοι οι κόµβοι στο αριστερό υπόδεντρο, Left, είναι µικρότεροι του X Όλοι οι κόµβοι στο δεξιό υπόδεντρο, Right, είναι µεγαλύτεροι του X Τα δύο υπόδεντρα είναι επίσης ταξινοµηµένα. Η έρευνα σε ένα ταξινοµηµένο δυαδικό δέντρο έχει κάποια πλεονεκτήµατα. Όταν ψάχνουµε ένα στοιχείο σε ένα ταξινοµηµένο δυαδικό δέντρο είναι σχεδόν πάντα επαρκές να κάνουµε την έρευνα µόνο στο ένα υπόδεντρο. 5 3 8 1 4 Σχήµα 2.2 : Ταξινοµηµένο υαδικό έντρο 12

Προγράµµατα τα οποία επεξεργάζονται δυαδικά δέντρα είναι παρόµοια µε τα προγράµµατα που επεξεργάζονται λίστες µε την διαφορά ότι πρέπει να έχουν διπλή αναδροµή. Αυτό λόγω της αναδροµικής φύσης των δυαδικών δέντρων. 2.2.2. Εύρεση, διαγραφή και εισαγωγή στοιχείου δυαδικού δέντρου Παρακάτω θα περιγράψουµε τρία βασικά προγράµµατα που χρησιµοποιούµε στο σύστηµά µας όταν επεξεργαζόµαστε δυαδικά δέντρα (δδ). Το πρώτο αφορά την εύρεση ενός στοιχείου στο δδ, το δεύτερο την εισαγωγή ενός νέου στοιχείου στο δδ και το τρίτο την διαγραφή ενός στοιχείου από το δδ. Το κατηγόρηµα get_element(binarytree, Element) είναι αληθές εάν το στοιχείο Element είναι µέλος του δέντρου BinaryTree [Μαρακάκης 2004]. Το κατηγόρηµα get_element/2 υλοποιείται από το πρόγραµµα 2.3. Η δηλωτική έννοια αυτού του προγράµµατος είναι ότι το στοιχείο Y ανήκει στο δέντρο εάν συµβαίνει µία από τις εξής περιπτώσεις. a) Το στοιχείο Y είναι µέλος στον (τρέχοντα) κόµβο του δέντρου που εξετάζεται. Αυτή η περίπτωση εξετάζεται από την πρόταση π 1. b) Εάν το στοιχείο Y είναι µικρότερο ή ίσο από το τρέχοντα κόµβο, τότε ψάξε για το Y στο αριστερό υπόδεντρο. Αυτή η περίπτωση εξετάζεται από την πρόταση π 2. c) Εάν το στοιχείο Y είναι µεγαλύτερο από το τρέχοντα κόµβο, τότε ψάξε για το Y στο αριστερό υπόδεντρο. Αυτή η περίπτωση εξετάζεται από την πρόταση π 3. π 1 : get_element( bt( X, Left, Right), X ). π 2 : get_element( bt(x, Left, Right), Y ) :- X @> =Y, get_element(left, Y). melos_dentrou(x, AristeroD). π 3 : get_element( bt(x, Left, Right), Y ) :- X @< Y, get_element(right, Y). Πρόγραµµα 2.2 : Εύρεση στοιχείου σε δυαδικό δέντρο Το κατηγόρηµα add_element(binarytree, Element, NewBinaryTree) είναι αληθές εάν το στοιχείο Element προστεθεί στο δέντρο BinaryTree, επιστρέφοντας το δέντρο NewBinaryTree [Bratko 2001]. Το κατηγόρηµα add_element/3 υλοποιείται από το πρόγραµµα 2.4. Για να προσθέσουµε ένα στοιχείο X σε ένα δυαδικό δέντρο ακολουθούµε τους παρακάτω κανόνες: a) Το αποτέλεσµα της πρόσθεσης ενός στοιχείου X σε ένα άδειο δέντρο είναι το δέντρο bt(x,nil,nil). Αυτή η περίπτωση εξετάζεται από την πρόταση π 1. b) Εάν το στοιχείο X είναι ίσο µε το τρέχοντα κόµβο, τότε επιστρέφεται το ίδιο το δέντρο (δεν προστίθενται το ίδιο στοιχείο δύο φορές). Αυτή η περίπτωση εξετάζεται από την πρόταση π 2. c) Εάν το στοιχείο X είναι µικρότερο από το τρέχοντα κόµβο D, τότε πρόσθεσε το X στο αριστερό υπόδεντρο. Αυτή η περίπτωση εξετάζεται από την πρόταση π 3. d) Εάν το στοιχείο X είναι µεγαλύτερο από το τρέχοντα κόµβο D, τότε πρόσθεσε το X στο δεξιό υπόδεντρο. Αυτή η περίπτωση εξετάζεται από την πρόταση π 4. π 1 : add_element( nil, X, bt(x, nil, nil) ). 13

π 2 : add_element( bt(x, Left, Right), X, bt(x, Left, Right) ). π 3 : add_element( bt(d, Left, Right), X, bt(d, Left1, Right) ):- D@>X, add_element( Left, X, Left1 ). π 4 : add_element( bt(d, Left, Right), X, bt(d, Left, Right1) ):- X@>D, add_element( Right, X, Right1 ). Πρόγραµµα 2.3 : Πρόσθεση στοιχείου σε δυαδικό δέντρο Το κατηγόρηµα delete_element(binarytree, Element, NewBinaryTree) είναι αληθές εάν το στοιχείο Element διαγραφεί από το δέντρο BinaryTree, επιστρέφοντας το δέντρο NewBinaryTree [Bratko 2001]. Το κατηγόρηµα delete_element/3 υλοποιείται από το πρόγραµµα 2.5. Για να διαγράψουµε ένα στοιχείο X από ένα δυαδικό δέντρο εξετάζουµε τις παρακάτω περιπτώσεις : a) Εάν το στοιχείο X είναι στο τρέχοντα κόµβο του δέντρου και δεν έχει αριστερό υπόδεντρο. Αυτή η περίπτωση εξετάζεται από την πρόταση π 1. b) Εάν το στοιχείο X είναι στο τρέχοντα κόµβο του δέντρου και δεν έχει δεξιό υπόδεντρο. Αυτή η περίπτωση εξετάζεται από την πρόταση π 2. c) Εάν το στοιχείο X είναι µικρότερο ή ίσο από το τρέχοντα κόµβο D. Αυτή η περίπτωση εξετάζεται από την πρόταση π 3. d) Εάν το στοιχείο X είναι µεγαλύτερο από το τρέχοντα κόµβο D. Αυτή η περίπτωση εξετάζεται από την πρόταση π 4. e) Εάν ο τρέχοντας κόµβος D έχει και δεξιό και αριστερό υπόδεντρο. Τότε εξετάζουµε δυο υποπεριπτώσεις. Εάν το δέντρο που εισάγουµε δεν έχει αριστερό υπόδεντρο, και εάν το δέντρο που εισάγουµε έχει και αριστερό και δεξιό υπόδεντρο. Αυτή η περίπτωση εξετάζεται από τις προτάσεις π 5, π 6 και π 7. π 1 : delete_element( bt(x, nil, Right), X,Right ). π 2 : delete_element( bt(x, Left, nil), X,Left ). π 3 : delete_element( bt( D, Left, Right ), X, bt( D, Left1, Right ) ):- D @> X, delete_element(left, X, Left1). π 4 : delete_element( bt( D, Left, Right ), X, bt( D, Left, Right1 ) ):- X @> D, delete_element(right, X, Right1). π 5 : delete_element( bt(d, Left, Right), X, bt(y, Left, Right1 ) ):- delete2(right, Y, Right1). π 6 : delete2( bt(y, nil, Right ), Y, Right ). π 7 : delete2( bt(d, Left, Right), Y, bt(d, Left1, Right)) :- delete2(left, Y, Left1). Πρόγραµµα 2.4 : ιαγραφή στοιχείου από δυαδικό δέντρο 3. Αναπαραστάσεις 14

3.1. Αναπαράσταση Προγράµµατος σαν Λίστα Λιστών 3.1.1. Παράσταση Προγράµµατος-Αντικείµενο σε Βασικούς Όρους στο σύστηµά µας Αρχικά το λογικό πρόγραµµα από την µη-βασική µορφή µετατρέπεται σε βασική µορφή σαν µια λίστα της παρακάτω µορφής. Τα προγράµµατα που εµείς εισάγουµε στο σύστηµά µας (sum, factorial, max_sequence κτλ ) αναπαρίστανται µε τον ίδιο τρόπο σαν λίστες της µορφής : [ [Πρόταση1_κατηγορήµατος1, Πρόταση2_κατηγορήµατος1,.. ], [Πρόταση1_κατηγορήµατος2, Πρόταση2_κατηγορήµατος2,.. ],, [Πρόταση1_κατηγορήµατοςΝ, Πρόταση2_κατηγορήµατοςN,.. ] ] όπου Πρόταση1_κατηγορήµατοςΝ, Πρόταση2_κατηγορήµατοςΝ,... έχουν τη µορφή [Κεφαλή_πρότασης, Στοιχειώδης_τύπος_σώµατος_1,, Στοιχειώδης_τύπος_σώµατος_Κ] όπου Κεφαλή_πρότασης είναι µια λίστα της µορφής [Όνοµα_κατηγορήµατος, Όρισµα_1,..., Όρισµα_Μ1] και κάθε Στοιχειώδης _τύπος_σώµατος_ι όπου 1 Ι Κ είναι µια λίστα της µορφής [Όνοµα_κατηγορήµατος, Όριµα_Ι 1,..., Όρισµα_Ι ν1 ] ή της µορφής [not Όνοµα_κατηγορήµατος, Όριµα_Ι 1,..., Όρισµα_Ι ν1 ] Παράδειγµα Το κατηγόρηµα sum(x,y) είναι αληθές εάν Υ είναι το άθροισµα των ακεραίων της λίστας Χ. Έστω το πρόγραµµα sum(x,y), Πρόγραµµα 3.1, στο οποίο δεν φαίνονται οι ορισµοί των τελεστών των τύπων δεδοµένων (data type operations) όπως tail/2, head/2 κτλ. Αυτό είναι ένα πολύ δοµηµένο πρόγραµµα το οποίο θα είναι είσοδος στο σύστηµά µας. sum(x1,x2) p0(x1) p1(x1,x2) sum(x1,x2) \+ p0(x1) p2(x1,x3,x4) sum(x4,x5) p3(x1,x3,x5,x2) p0(x1) empty_seq(x1) p1(x1,x2) neutral_add_subtr_int(x2) p2(x1,x3,x4) p4(x1,x3,x4) p5(x1,x3,x4) p3(x1,x3,x5,x2) plus_int(x3,x5,x2) p4(x1,x3,x4) head(x1,x3) p5(x1,x3,x4) tail(x1,x4) Πρόγραµµα 3.1 : Πρόγραµµα-αντικείµενο sum/2 Η παράσταση του προγράµµατος αυτού σε βασική µορφή φαίνεται παρακάτω : [ [ [[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]], [[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)], 15

[p3,v(1),v(3),v(5),v(2)]] ], [ [[p0,v(6)],[empty_seq,v(6)]] ], [ [[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]] ], [ [[p2,v(9),v(10),v(11)],[p4,v(9),v(10),v(11)],[p5,v(9),v(10),v(11)]] ], [ [[p3,v(12),v(13),v(14),v(15)],[plus_int,v(13),v(14),v(15)]] ], [ [[p4,v(16),v(17),v(18)],[head,v(16),v(17)]] ], [ [[p5,v(19),v(20),v(21)],[tail,v(19),v(21)]] ] ] Πρόγραµµα 3.2 : Παράσταση σε Βασικούς Όρους του Προγράµµατος 3.1 3.2. Αναπαράσταση Προγράµµατος σαν Ταξινοµηµένο υαδικό έντρο Η αναπαράσταση του προγράµµατος σαν λίστα από λίστες δεν είναι επαρκής για τις ανάγκες ενός συστήµατος fold/unfold µετασχηµατισµών. Γι αυτό θα χρησιµοποιήσουµε έναν άλλο τρόπο παράστασης του προγράµµατος σαν ταξινοµηµένο δυαδικό δέντρο. Αυτό θα διευκολύνει την εκτέλεση των µετασχηµατισµών, κάνοντας το σύστηµά µας περισσότερο αποτελεσµατικό. Σε κάθε µη κενό κόµβο του δυαδικού δέντρου υπάρχει η αναπαράσταση των προτάσεων ενός κατηγορήµατος µαζί µε άλλες πληροφορίες για το συγκεκριµένο κατηγόρηµα, οι οποίες είναι χρήσιµες για τον µετασχηµατισµό του. Ένας κόµβος του ταξινοµηµένου δυαδικού δέντρου έχει την εξής µορφή (όπου bt binarytree): bt( PredName, GrClauses, Father, Children, DTopFlag, PredType, PredMode, OnOffFlag, Other_Info, LeftSubtree, RightSubtree ) Εκτός από το LeftSubtree και το RightSubtree τα οποία παριστούν το αριστερό και το δεξιό υπόδεντρο αντίστοιχα, τα υπόλοιπα στοιχεία του κόµβου παριστούν τα δεδοµένα του. Τα δεδοµένα έχουν ως εξής : PredName : Παριστά το όνοµα του κατηγορήµατος του τρέχοντος κόµβου. Αυτό χρησιµοποιείται και σαν κλειδί για την ταξινόµηση του δυαδικού δέντρου. GrClauses : Παριστά τις προτάσεις του κατηγορήµατος PredName σε βασική µορφή. Father : Έχει τον πατρικό κόµβο του κατηγορήµατος PredName. Η έννοια πατρικός κόµβος σηµαίνει ότι το κατηγόρηµα PredName βρίσκεται στο σώµα κάποιας πρότασης του κατηγορήµατος Father. 16

Children : Λίστα µε τα παιδιά του PredName. Η έννοια παιδιά αναφέρεται στα κατηγορήµατα που εµφανίζονται στο σώµα των προτάσεων του κατηγορήµατος PredName. DTopFlag : Ένα flag που παίρνει τη τιµή yes εάν υπάρχουν data types operations στην λίστα Children ή την τιµή no εάν δεν υπάρχουν data types operations. PredType : PredMode : Τα δεδοµένα PredType και PredMode θα χρησιµοποιηθούν σε µελλοντική επέκταση του συστήµατος ώστε να λαµβάνει υπόψιν του κατά τους µετασχηµατισµούς τις αλλαγές που θα εκτελούνται στους τύπους και στα modes των κατηγορηµάτων. OnOffFlag : Ένα flag το οποίο παίρνει την τιµή on όταν ο κόµβος είναι ενεργός κόµβος του δέντρου, και την τιµή off όταν ο κόµβος είναι ανενεργός. Στη δεύτερη περίπτωση οι προτάσεις του κόµβου είναι άχρηστες, δεν χρησιµοποιούνται πουθενά στο πρόγραµµα, οπότε µπαίνουν σε µια λίστα που ονοµάζεται UselessClauses. Other_Info : Ένα flag που παίρνει τη τιµή new_def εάν ο αντίστοιχος κόµβος προέρχεται από την λίστα των νέων ορισµών. Παράδειγµα 1. Ο κόµβος για το κατηγόρηµα sum/2 στο ταξινοµηµένο δυαδικό δέντρο του προγράµµατός µας έχει την εξής µορφή. Όπου υπάρχουν µεταβλητές σηµαίνει ότι ακόµα δεν έχουν καταχωρηθεί τιµές, εκτός από το LeftSubtree_sum, RightSubtree_sum το οποίο φαίνεται παρακάτω. bt(sum, [ [[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]], [[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)], [p3,v(1),v(3),v(5),v(2)]] ], none, [p0,p1,p2,p3], no, PredType_sum, PredMode_sum, OnOffFlag_sum, Other_Info_sum, LeftSubtree_sum, RightSubtree_sum 2. Ο κόµβος για το κατηγόρηµα p5/3 έχει την εξής µορφή : bt(p5, [ [[p5,v(19),v(20),v(21)],[tail,v(19),v(21)]] ], p2, [tail], yes, PredType_p5, PredMode _p5, OnOffFlag_p5, 17

OtherInfo_p5, nil, nil 3. Το ταξινοµηµένο δυαδικό δέντρο για όλο το πρόγραµµα sum/2, Πρόγραµµα 3.1,είναι το εξής : bt(sum, [ [[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]], [[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)], [p3,v(1),v(3),v(5),v(2)]] ], none,[p0,p1,p2,p3],no,predtype_sum,predmode_sum, OnOffFlag_sum,Other_Info_sum, bt(p0, [ [[p0,v(6)],[empty_seq,v(6)]] ], sum,[empty_seq],yes,predtype_p0,predmode_p0, OnOffFlag_p0,Other_Info_p0,nil, bt(p1, [ [[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]] ], sum,[neutral_add_subtr_int],yes,predtype_p1,predmode_p1, OnOffFlag_p1,Other_Info_p1,nil, bt(p2, [ [[p2,v(9),v(10),v(11)],[p4,v(9),v(10),v(11)],[p5,v(9),v(10),v(11)]] ], sum,[p4,p5],no,predtype_p2,predmode_p2, OnOffFlag_p2,Other_Info_p2,nil, bt(p3, [ [[p3,v(12),v(13),v(14),v(15)],[plus_int,v(13),v(14),v(15)]] ], sum,[plus_int],yes,predtype_p3,predmode_p3, OnOffFlag_p3,Other_Info_p3,nil, bt(p4, [ [[p4,v(16),v(17),v(18)],[head,v(16),v(17)]] ], p2,[head],yes,predtype_p4,predmode_p4, OnOffFlag_p4,Other_Info_p4,nil, bt(p5, [ [[p5,v(19),v(20),v(21)],[tail,v(19),v(21)]] ], p2,[tail],yes,predtype_p5,predmode_p5, 18

OnOffFlag_p5,Other_Info_p5,nil,nil) ) ) ) ) ), nil) Πρόγραµµα 3.3 : Παράσταση σαν Ταξινοµηµένο υαδικό έντρο του προγράµµατος 3.1 19

20

4. Αυτόµατο Σύστηµα Μετασχηµατισµού Λογικών Προγραµµάτων 4.1. Αρχιτεκτονική Συστήµατος και Περιγραφή Κύριων Τµηµάτων του Το σύστηµα Φειδίας αποτελείται από τα εξής υποσυστήµατα : 1. Το υποσύστηµα «µετασχηµατισµού προγραµµάτων». 2. Το υποσύστηµα «προβολής αρχικών και µετασχηµατισµένων προγραµµάτων». 3. Το υποσύστηµα «εκτέλεσης ενός προγράµµατος». 4. Το υποσύστηµα «αξιολόγησης αρχικού µετασχηµατισµένου προγράµµατος». Το υποσύστηµα «µετασχηµατισµού προγραµµάτων» είναι το πλέον σηµαντικό. Η συνεισφορά αυτής της τεχνικής αναφορά βρίσκεται στον σχεδιασµό και στην υλοποίηση αυτού του υποσυστήµατος το οποίο θα παρουσιάσουµε µε λεπτοµέρειες στο κεφάλαιο 4. Τα υποσυστήµατα «προβολής αρχικών και µετασχηµατισµένων προγραµµάτων» και «εκτέλεσης ενός προγράµµατος» είναι τετριµµένα και δεν χρειάζονται ιδιαίτερη παρουσίαση. Το υποσύστηµα «αξιολόγησης αρχικού µετασχηµατισµένου προγράµµατος» υποστηρίζει την αξιολόγηση του υποσυστήµατος «µετασχηµατισµού προγραµµάτων» και θα παρουσιαστεί σε επόµενη τεχνική αναφορά. Το υποσύστηµα «µετασχηµατισµού προγραµµάτων» αποτελείται από ένα αριθµό τµηµάτων που αλληλεπιδρούν µεταξύ τους και µας δίνουν το τελικό µετασχηµατισµένο πρόγραµµα. Αρχικά το υποσύστηµα µας δέχεται σαν είσοδο το αρχικό πρόγραµµα σε Prolog Pαρχ. και το κορυφαίο κατηγόρηµα (top level predicate). Επειδή το Pαρχ. είναι σε µη-βασική µορφή µετατρέπεται από το υποσύστηµά µας στο πρόγραµµα Pgr1 σε βασική µορφή (Σχήµα 4.1, Τµήµα Α). Η αναπαράσταση αυτή του Pgr1 σαν λίστα από λίστες δεν επαρκεί για να εφαρµόσουµε τους µετασχηµατισµούς. Γι αυτό το λόγο το υποσύστηµα αλλάζει την παράσταση του Pgr1 από λίστα σε ταξινοµηµένο δυαδικό δέντρο (Τ ) στο Τµήµα Β. Κάθε κόµβος του Τ αποτελείται από τα δεδοµένα του κόµβου και από το αριστερό και το δεξιό υπόδεντρο του. Τα δεδοµένα του κόµβου αποτελούνται µεταξύ άλλων από τα εξής στοιχεία : 1. Το όνοµα του κατηγορήµατος το οποίο είναι και το κλειδί ταξινόµησης του δέντρου. 2. Τις προτάσεις του κατηγορήµατος. 3. Άλλα στοιχεία τα οποία αναφέρονται µε λεπτοµέρεια στο κεφάλαιο 3. Η δοµή του Τ καθώς και τα δεδοµένα κάθε κόµβου υποστηρίζουν την αποτελεσµατικότερη εκτέλεση των µετασχηµατισµών. Στο Τ εφαρµόζουµε διαδοχικά και επαναληπτικά τους µετασχηµατισµούς definition introduction, unfold, fold παίρνοντας τελικά το SBT_transform (Σχήµα 4.2). Στο SBT_transform εφαρµόζεται ο µετασχηµατισµός unfold στις προτάσεις που έχουν σαν σώµα µόνο το βασικό κατηγόρηµα true, και έτσι προκύπτει το Τ SBT_Final (Σχήµα 4.2). Κάθε επανάληψη στα τµήµατα C1, C2 και C3 του Σχήµατος 4.2 έχει σαν συνέπεια την αφαίρεση "αποµονωµένων" ορισµάτων. Ενώ στο τµήµα C4 γίνεται αφαίρεση των προτάσεων που έχουν σαν σώµα µόνο το κατηγόρηµα true. Από το τελικό δυαδικό δέντρο SBT_Final προκύπτει το πρόγραµµα Pgr2 σε βασική µορφή (Τµήµα D, Σχήµα 4.1). Στο Τµήµα E µετατρέπεται το πρόγραµµα Pgr2 από βασική µορφή σε µη-βασική µορφή, παράγοντας το πρόγραµµα Pτελ. Σχηµατικά τα βήµατα που ακολουθούµε φαίνονται στο Σχήµα 4.1 και στο Σχήµα 4.2 : 21

A B C Μετατροπή του Αναπαράσταση του προγράµµατος Pαρχ Εφαρµογή των µετασχηµατισµών Pαρχ. Pgr1 Pgr1 από λίστα σε SBT SBT_Final σε βασική µορφή. στο πρόγραµµα Pgr1 που ταξινοµηµένο δυαδικό Αναπαριστάνεται σε παριστάνεται από το TopPred TopPredName δέντρο (Τ ). µορφή λίστας Pgr1. ταξινοµηµένο δυαδικό δέντρο. D E Αλλαγή της Μετατροπή του SBT_Final αναπαράσταση του Pgr2 προγράµµατος Pgr2 από Pτελ. προγράµµατος από βασική µορφή (µορφή TopPredName Τ (SBT_Final) σε λίστας) σε µη-βασική µορφή λίστας Pgr2. µορφή Pτελ. TopPred : Κορυφαίο κατηγόρηµα, π.χ sum(x,y) TopPredName : Όνοµα κορυφαίου κατηγορήµατος, π.χ sum Σχήµα 4.1 : Τα τµήµατα του Υποσυστήµατος «Μετασχηµατισµού Προγραµµάτων» 22

Εάν Lunused [] C1 C2 C3 SBT Μετασχηµατισµός SBT_nd Μετασχηµατισµός SBT_un Μετασχηµατισµός SBT_fl Εισαγωγή Ορισµού Ανάπτυξης (Unfold). Πτύξης (Fold). Lunused (Definition introduction). Dnew Dnew NewLunused Εάν Lunused = [] SBT_transform C4 Μετασχηµατισµός Ανάπτυξης (Unfold) στις προτάσεις µε σώµα µόνο το κατηγόρηµα true. SBT_Final Σχήµα 4.2 : Αναλυτική περιγραφή του τµήµατος C 23

4.2. Οι Αλγόριθµοι Μετασχηµατισµών Παρακάτω περιγράφονται τα τµήµατα εισαγωγής ορισµού, ανάπτυξης και πτύξης (C1, C2 και C3) του Σχήµατος 4.2 παρουσιάζοντας τους αλγορίθµους υλοποίησης κάθε τµήµατος. 4.2.1. Αλγόριθµος υλοποίησης της πράξης της Εισαγωγής Ορισµού Η διαδικασία αυτή δέχεται σαν είσοδο ένα ταξινοµηµένο δυαδικό δέντρο SBT και µια λίστα Lunused και επιστρέφει το σύνολο των νέων ορισµών Dnew και το καινούργιο δυαδικό δέντρο NewSBT. SBT : Ένα ταξινοµηµένο δυαδικό δέντρο, e.g bt(sum, [[[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]],[[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)],[p3,v(1),v(3),v(5),v(2)]]], none,[p1,p0,p2,p3],no,predtype_sum,predmode_sum,onoffflag_sum, Other_Info_sum, bt(p0, [[[p0,v(6)],[empty_seq,v(6)]]],sum,[empty_seq], yes,predtype_p0,predmode_p0,onoffflag_p0,other_info_p0,nil, bt(p1, [[[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]]], sum,[neutral_add_subtr_int],yes,predtype_p1, PredMode_p1,OnOffFlag_p1,Other_Info_p1,nil, bt(p2, [[[p2,v(9),v(10),v(11)],[p4,v(9),v(10),v(11)],[p5,v(9),v(10),v(11)]]], sum,[p4,p5],no,predtype_p2,predmode_p2,onoffflag_p2, Other_Info_p2,nil, bt(p3, [[[p3,v(12),v(13),v(14),v(15)],[plus_int,v(13),v(14),v(15)]]], sum,[plus_int],yes,predtype_p3,predmode_p3,onoffflag_p3, Other_Info_p3,nil, bt(p4, [[[p4,v(16),v(17),v(18)],[head,v(16),v(17)]]], p2,[head],yes,predtype_p4,predmode_p4,onoffflag_p4,other_info_p4,nil, bt(p5, [[[p5,v(19),v(20),v(21)],[tail,v(19),v(21)]]], p2,[tail],yes,predtype_p5,predmode_p5,onoffflag_p5, Other_Info_p5,nil,nil)))))),nil), Lunused : λίστα της µορφής [ (PredName1, N1, List1 ), (PredName2, N2, List2),...,(PredNameK, NK, ListK) ], όπου PredNameK είναι το όνοµα του κατηγορήµατος, NK είναι η πληθυκότητα του PredName και ListK είναι η λίστα µε τα µη χρησιµοποιηµένα ορίσµατα. e.g [ (p1,2,[v(28)]), (p3,4,[v(33)]), (p4,3,[v(39)]), (p5,3,[v(41)]) ], 24

Dnew : Ένα σύνολο προτάσεων, που ονοµάζονται σύνολο νέων ορισµών, της µορφής [ [[NewPredNameA, NewArgsA], [PredNameA, ArgsA]], [[NewPredNameB, NewArgsB], [PredNameB, ArgsB]],..., [[NewPredNameK, NewArgsK], [PredNameK, ArgsK]] ] e.g [[[[pn1,v(8)],[p1,v(7),v(8)]]], [[[pn2,v(13),v(14),v(15)],[p3,v(12),v(13),v(14),v(15)]]], [[[pn3,v(16),v(17)],[p4,v(16),v(17),v(18)]]], [[[pn4,v(19),v(21)],[p5,v(19),v(20),v(21)]]]], NewSBT : Το νέο δυαδικό δέντρο e.g bt(sum, [[[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]],[[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)],[p3,v(1),v(3),v(5),v(2)]]], none,[p1,p0,p2,p3],no,predtype_sum,predmode_sum, OnOffFlag_sum,Other_Info_sum, bt(p0, [[[p0,v(6)],[empty_seq,v(6)]]], sum,[empty_seq],yes,predtype_p0,predmode_p0,onoffflag_p0, Other_Info_p0,nil, bt(p1, [[[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]]], sum,[neutral_add_subtr_int],yes,predtype_p1,predmode_p1, OnOffFlag_p1,Other_Info_p1,nil, bt(p2, [[[p2,v(9),v(10),v(11)],[p4,v(9),v(10),v(11)],[p5,v(9),v(10),v(11)]]], sum,[p4,p5],no,predtype_p2,predmode_p2,onoffflag_p2, Other_Info_p2,nil, bt(p3, [[[p3,v(12),v(13),v(14),v(15)],[plus_int,v(13),v(14),v(15)]]], sum,[plus_int],yes,predtype_p3,predmode_p3,onoffflag_p3, Other_Info_p3,nil, bt(p4, [[[p4,v(16),v(17),v(18)],[head,v(16),v(17)]]], p2,[head],yes,predtype_p4,predmode_p4,onoffflag_p4,other_info_p4,nil, bt(p5, [[[p5,v(19),v(20),v(21)],[tail,v(19),v(21)]]], p2,[tail],yes,predtype_p5,predmode_p5,onoffflag_p5,other_info_p5,nil, bt(pn1, [[[pn1,v(8)],[p1,v(7),v(8)]]], none,[p1],no,predtype_pn1,predmode_pn1,onoffflag_pn1,new_def,nil, bt(pn2, [[[pn2,v(13),v(14),v(15)],[p3,v(12),v(13),v(14),v(15)]]], none,[p3],no,predtype_pn2,predmode_pn2,onoffflag_pn2,new_def,nil, bt(pn3, [[[pn3,v(16),v(17)],[p4,v(16),v(17),v(18)]]], none,[ p4],no,predtype_pn3,predmode_pn3,onoffflag_pn3,new_def,nil, bt(pn4, 25

[[[pn4,v(19),v(21)],[p5,v(19),v(20),v(21)]]], none,[p5],no,predtype_pn4,predmode_pn4,onoffflag_pn4,new_def,nil, nil)))))))))),nil)) διαδικασία new_definitions_repetitions( SBT, Lunused, Dnew, NewSBT ) D = { } ; για κάθε Xunused Lunused κάνε εφάρµοσε το µετασχηµατισµό new_definition( SBT, Lunused, Dnew ); %Καταχώρησε στο SBT τις νέες προτάσεις insert_newdef_to_sbt( Dnew, SBT, NewSBT ) ; τέλος_για_κάθε Η διαδικασία αυτή δέχεται σαν είσοδο το ταξινοµηµένο δυαδικό δέντρο SBT και τη λίστα Lunused και επιστρέφει το σύνολο των νέων ορισµών Dnew. SBT: as above Lunused: as above Dnew: as above διαδικασία new_definition( SBT, Lunused, Dnew) Dnew := { } ; για κάθε PredName Lunused κάνε make_new_name( PredName, NewPredName ) ; % Βρές από το SBT το κόµβο Node του PredName get_node( SBT, PredName, Node ) ; % Από τις προτάσεις Clauses του κόµβου Node φτιάξε τις καινούργιες προτάσεις NewCls για το NewPredName make_newnode_cls( Clauses, PredName, UnusedArgs, NewPredName, NewCls ), Dnew := Dnew NewCls ; τέλος_για_κάθε Η διαδικασία αυτή δέχεται σαν είσοδο ένα σύνολο προτάσεων Clauses, ένα όνοµα κατηγορήµατος PredName, µια λίστα µε αποµονωµένα ορίσµατα UnusedArgs και ένα νέο όνοµα κατηγορήµατος NewPredName και δηµιουργεί ένα καινούργιο σύνολο προτάσεων NewCls για το NewPredName. Clauses : [[[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]]] PredName : p1 UnusedArgs : [v(7)] NewPredName : pn1 26

NewCls : [[[pn1,v(8)],[p1,v(7),v(8)]]] διαδικασία make_newnode_cls( Clauses, PredName, UnusedArgs, NewPredName, NewCls ) για κάθε Cl Clauses κάνε βρες το literal του PredName και τα ορίσµατά του Args ; %Βρες τη διαφορά NewArgs των Args από τα UnusedArgs NewArgs := Args UnusedArgs, % ηµιούργησε το καινούργιο literal NewCl του PredName NewCl := NewPredName NewArgs ; δηµιούργησε την καινούργια πρόταση NewCls για την πρόταση Cl ; τέλος_για_κάθε Η διαδικασία αυτή δέχεται σαν είσοδο ένα σύνολο προτάσεων Clauses και ένα ταξινοµηµένο δυαδικό δέντρο SBT και δηµιουργεί τόσους κόµβους όσες είναι οι προτάσεις. Επιπλέον εισάγει τους κόµβους στο SBT και επιστρέφει το NewSBT. Clauses: as above SBT: as above NewSBT: as above διαδικασία insert_newdef_to_sbt(clauses, SBT, NewSBT) για κάθε Cl Clauses κάνε % ηµιούργησε ένα καινούργιο κόµβο make_new_node(cl, NodeCl) ; %Βάλε το καινούργιο κόµβο στο δέντρο δηµιουργώντας ένα καινούργιο δέντρο insert_new_node(sbt, NodeCl, NewSBT) ; τέλος_για_κάθε 4.2.2. Αλγόριθµος υλοποίησης της πράξης της Ανάπτυξης Η διαδικασία αυτή δέχεται σαν είσοδο ένα ταξινοµηµένο δυαδικό δέντρο SBT και ένα σύνολο προτάσεων Dnew, εφαρµόζει τον µετασχηµατισµό της ανάπτυξης στο πρόγραµµα που παριστάνεται από το SBT, και επιστρέφει ένα νέο δυαδικό δέντρο FinalSBT. SBT : Το ταξινοµηµένο δυαδικό δέντρο, e.g bt(sum, [[[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]],[[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)],[p3,v(1),v(3),v(5),v(2)]]], none,[p1,p0,p2,p3],no,predtype_sum,predmode_sum,onoffflag_sum, 27

Other_Info_sum, bt(p0, [[[p0,v(6)],[empty_seq,v(6)]]],sum,[empty_seq], yes,predtype_p0,predmode_p0,onoffflag_p0,other_info_p0,nil, bt(p1, [[[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]]], sum,[neutral_add_subtr_int],yes,predtype_p1,predmode_p1, OnOffFlag_p1,Other_Info_p1,nil, bt(p2, [[[p2,v(9),v(10),v(11)],[p4,v(9),v(10),v(11)],[p5,v(9),v(10),v(11)]]], sum,[p4,p5],no,predtype_p2,predmode_p2,onoffflag_p2, Other_Info_p2,nil, bt(p3, [[[p3,v(12),v(13),v(14),v(15)],[plus_int,v(13),v(14),v(15)]]], sum,[plus_int],yes,predtype_p3,predmode_p3,onoffflag_p3, Other_Info_p3,nil, bt(p4, [[[p4,v(16),v(17),v(18)],[head,v(16),v(17)]]], p2,[head],yes,predtype_p4,predmode_p4,onoffflag_p4,other_info_p4,nil, bt(p5, [[[p5,v(19),v(20),v(21)],[tail,v(19),v(21)]]], p2,[tail],yes,predtype_p5,predmode_p5,onoffflag_p5,other_info_p5,nil, bt(pn1, [[[pn1,v(8)],[p1,v(7),v(8)]]], none,[p1],no,predtype_pn1,predmode_pn1,onoffflag_pn1,new_def,nil, bt(pn2, [[[pn2,v(13),v(14),v(15)],[p3,v(12),v(13),v(14),v(15)]]], none,[p3],no,predtype_pn2,predmode_pn2,onoffflag_pn2,new_def,nil, bt(pn3, [[[pn3,v(16),v(17)],[p4,v(16),v(17),v(18)]]], none,[p4],no,predtype_pn3,predmode_pn3,onoffflag_pn3,new_def,nil, bt(pn4, [[[pn4,v(19),v(21)],[p5,v(19),v(20),v(21)]]], none,[p5],no,predtype_pn4,predmode_pn4,onoffflag_pn4,new_def, nil,nil)))))))))),nil) Dnew : ένα σύνολο προτάσεων, που ονοµάζονται σύνολο νέων ορισµών, της µορφής [ [[NewPredNameA,NewArgsA],[PredNameA,ArgsA]], [[NewPredNameB,NewArgsB],[PredNameB,ArgsB]],..., [[NewPredNameK,NewArgsK],[PredNameK,ArgsK]] ] e.g Dnew=[[[[pn1,v(8)],[p1,v(7),v(8)]]], [[[pn2,v(13),v(14),v(15)],[p3,v(12),v(13),v(14),v(15)]]], [[[pn3,v(16),v(17)],[p4,v(16),v(17),v(18)]]], [[[pn4,v(19),v(21)],[p5,v(19),v(20),v(21)]]]], FinalSBT : e.g bt(sum, 28

[[[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]],[[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)],[p3,v(1),v(3),v(5),v(2)]]], none,[p1,p0,p2,p3],no,predtype_sum,predmode_sum,onoffflag_sum, Other_Info_sum, bt(p0, [[[p0,v(6)],[empty_seq,v(6)]]], sum,[empty_seq],yes,predtype_p0,predmode_p0,onoffflag_p0, Other_Info_p0,nil, bt(p2, [[[p2,v(9),v(10),v(11)],[p4,v(9),v(10),v(11)],[p5,v(9),v(10),v(11)]]], sum,[p4,p5],no,predtype_p2,predmode_p2,onoffflag_p2, Other_Info_p2,nil, bt(pn1, [[[pn1,v(8)],[neutral_add_subtr_int,v(8)]]], none,[neutral_add_subtr_int],yes,predtype_pn1,predmode_pn1, OnOffFlag_pn1,new_def,nil, bt(pn2, [[[pn2,v(13),v(14),v(15)],[plus_int,v(13),v(14),v(15)]]], none,[plus_int],yes,predtype_pn2,predmode_pn2,onoffflag_pn2, new_def,nil, bt(pn3, [[[pn3,v(16),v(17)],[head,v(16),v(17)]]], none,[head],yes,predtype_pn3,predmode_pn3,onoffflag_pn3,new_def,nil, bt(pn4, [[[pn4,v(19),v(21)],[tail,v(19),v(21)]]], none,[tail],yes,predtype_pn4,predmode_pn4,onoffflag_pn4, new_def,nil,nil)))))),nil) διαδικασία unfold_transformation( SBT, Dnew, FinalSBT ) για κάθε DnewCl Dnew κάνε %Βρες από το DnewCl το DPredName find_predname( DnewCl, DPredName ) ; %Βρες από το SBT τις προτάσεις του DPredName get_pred_cls( DPredName, SBT, DPredCls ) ; %Βρες τα ονόµατα των κατηγορηµάτων που ανήκουν στο σώµα του DPredCls body_preds( DPredCls, DBdPreds ) ; %Βρες το DBdPred για το οποίο θα εφαρµοστεί η πράξη unfold find_unfold_predname( DBdPreds, DBdPred ) ; %Βρες από το SBT τις προτάσεις του DBdPred get_pred_cls_prg( DBdPred, SBT, PCls ) ; %Εφάρµοσε τη πράξη unfold unfolding( DPredCls, PCls, DPredNewCls ) ; %Φτιάξε το καινούργιο κόµβο για τις νέες προτάσεις DPredNewCls make_new_node( DPredNewCls, NewNode ) ; %Ενηµέρωσε το SBT update( SBT, NewNode, NewSBT ) ; %σηµείωσε το κόµβο που θα διαγραφεί, 29

mark_onoffflag(newsbt, DnewCl, FinalSBT) ; τέλος_για_κάθε Η διαδικασία αυτή δέχεται σαν είσοδο µια πρόταση και επιστρέφει το όνοµα του κατηγορήµατος που βρίσκεται στη κεφαλή της πρώτης πρότασης. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα DnewCl : [[[pn1,v(8)],[p1,v(7),v(8)]],[[pn1,v(8)],[p1,v(7),v(8)],[p0,v(8)]]] DPredName : pn1 διαδικασία find_predname( DnewCl, DPredName ) Η διαδικασία αυτή δέχεται σαν είσοδο ένα όνοµα κατηγορήµατος DPredName και ένα δυαδικό δέντρο SBT. Βρίσκει από το δέντρο τον κόµβο του DPredName και επιστρέφει τις προτάσεις του DPredCls. DPredName : pn1 SBT : DPredCls :[[[pn1,v(8)],[p1,v(7),v(8)]],[[pn1,v(8)],[p1,v(7),v(8)],[p0,v(8)]]] διαδικασία get_pred_cls( DPredName, SBT, DPredCls ) get_node( SBT, PredName, Node ) ; DPredCls = Clauses ; Η διαδικασία αυτή δέχεται σαν είσοδο ένα σύνολο προτάσεων και επιστρέφει τα ονόµατα των κατηγορηµάτων που βρίσκονται στο σώµα τους. PredNameCls: [[[pn1,v(201)],[p1,v(200),v(201)]],[[pn1,v(201)], [p1,v(200),v(201)],[p0,v(201)]]] BdPredNames : [p1,p0] διαδικασία body_preds ( PredNameCls, BdPredNames ) BdPredNames= {}; για κάθε Cl PredNameCls κάνε find_body_preds( Cl, LCl ) ; BdPredNames1 := BdPredNames LCl ; 30

τέλος_για_κάθε delete_the_same_once( BdPredNames1, BdPredNames ) ; Η διαδικασία αυτή δέχεται σαν είσοδο µια λίστα από ονόµατα κατηγορηµάτων BdPredNames και επιστρέφει το όνοµα κατηγορήµατος DBdPred στο οποίο θα εφαρµοστεί ο µετασχηµατισµός unfold. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα BdPredNames : [p1,p0] DBdPred : p1 or p0 διαδικασία find_unfold_predname( DBdPreds, DBdPred ) ;... Η διαδικασία αυτή δέχεται σαν είσοδο ένα όνοµα κατηγορήµατος DBdPred και ένα δυαδικό δέντρο SBT. Βρίσκει από το δέντρο τον κόµβο του DBdPred και επιστρέφει τις προτάσεις του PCls στις οποίες δεν έχει εφαρµοστεί ο µετασχηµατισµός new definition. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα DBdPred : p1 SBT : PCls : [[[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]],[[p1,v(7),v(8)],[empty,v(8)]]] διαδικασία get_pred_cls_prg( DBdPred, SBT, PCls ) ;... Η διαδικασία αυτή δέχεται δύο σύνολα προτάσεων και εφαρµόζει το µετασχηµατισµό unfold όπως περιγράφεται στην τεχνική αναφορά [Μαρακάκης, Κουνάλη και Σγουράκη, 2005]. DPredCls : [[[pn1,v(8)],[p1,v(7),v(8)]],[[pn1,v(8)],[p1,v(7),v(8)],[p0,v(8)]]] PCls : [[[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]],[[p1,v(7),v(8)],[empty,v(8)]]], DPredNewCls : [[[pn1,v(8)],[neutral_add_subtr_int,v(8)]],[[pn1,v(8)], [empty,v(8)]],[[pn1,v(8)],[neutral_add_subtr_int,v(8)],[p0,v(8)]],[[pn1,v(8)], [empty,v(8)],[p0,v(8)]]] διαδικασία unfolding( DPredCls, PCls, DPredNewCls ) DPredNewCls = { } ; για κάθε DPredCl DPredCls κάνε 31

unfold( DPredCl, PCls, DPredNewCl ) ; DPredNewCls := DPredNewCls DPredNewCl ; τέλος_για_κάθε Η διαδικασία αυτή εφαρµόζει το µετασχηµατισµό unfold στο σύνολο των προτάσεων Pcls. PredCl : [[p1n1,v(8)],[p1,v(7),v(8)]] Pcls : [[[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]],[[p1,v(7),v(8)],[empty,v(8)]]] PredNewCl : [[[pn1,v(8)],[neutral_add_subtr_int,v(8)]],[[pn1,v(8)],[empty,v(8)]]] διαδικασία unfold( PredCl, Cls, PredNewCl ) PredNewCl = { } ; για κάθε Cl Cls κάνε unfold1( PredCl, Cl, PredNewCl1 ) ; PredNewCl := PredNewCl DPredNewCl1 ; τέλος_για_κάθε Η διαδικασία αυτή εφαρµόζει το µετασχηµατισµό unfold στην πρόταση P_PredCl. D_PredCl : [[[p1n1,v(8)],[p1,v(7),v(8)]] P_PredCl : [[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)]] D_PredNewCl : [[pn1,v(8)],[neutral_add_subtr_int,v(8)]] διαδικασία unfold1( D_PredCl, P_PredCl, D_PredNewCl ) rename_cls( P_PredCl, NewP_PredCl ) ; get_head( NewP_PredCl, P_PredName, P_Pred_literal ) ; get_unfold_literal( P_PredName, D_PredCl, D_Pred_literal ) ; unification ( D_Pred_literal, P_Pred_literal, Theta ) ; replace_body( D_PredCl, NewP_PredCl, NewD_PredCl ) ; apply_theta( NewD_PredCl, Theta, D_PredNewCl ) ; Η διαδικασία αυτή βρίσκει τα arguments της πρότασης Cls, τα µετονοµάζει, και δηµιουργεί µια καινούργια πρόταση Cls_renamed. Cls : [[p1,v(7),v(8)],[neutral_add_subtr_int,v(8)],[empty,v(8)]] Cls_renamed : [[p1,v(218),v(219)],[neutral_add_subtr_int,v(219)],[empty,v(219)]] διαδικασία rename_cls( Cls, Cls_renamed ) 32

get_args( Cls, Args ) ; rename_args( Args, NewArgs ) ; replace_cls_args( Cls, NewArgs, Cls_renamed ) ; Η διαδικασία αυτή επιστρέφει το PredName και το PredLiteral της κεφαλής µιας πρότασης. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα Clauses : [[not p1,v(202),v(203)],[neutral_add_subtr_int,v(203)],[empty,v(203)]], PredName : p1 PredLiteral : [not p1,v(202),v(203)] διαδικασία get_head( Clauses, PredName, PredLiteral ) Η διαδικασία αυτή δέχεται σαν είσοδο ένα PredName και ένα σύνολο προτάσεων και επιστρέφει το literal PredLiteral του κατηγορήµατος PredName. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα : PredName : p1 PredCls : [[[pn1,v(8)],[p1,v(7),v(8)]],[[pn1,v(8)],[p0,v(8)]]] PredLiteral : [p1,v(7),v(8)] διαδικασία get_unfold_literal( PredName, PredCls, PredLiteral ) Η διαδικασία αυτή εφαρµόζει την πράξη της ταυτοποίησης στα arguments των L1 και L2 [Μαρακάκης 200]. L1 : [p1,v(17),v(18)], L2 : [p1,v(7),v(8)], Lunify : [[v(17),v(7)],[v(18),v(8)]] διαδικασία unification( L1, L2, Theta ). unify( Args1, Args2, Theta ) ; 33

Η διαδικασία αυτή δέχεται σαν είσοδο δυο προτάσεις DPredCls, PPredCls και αντικαθιστά το σώµα της DPredCls στο σώµα της PPredCls. DPredCls : [[pn1,v(8)],[p1,v(7),v(8)]], PPredCl : [[p1,v(272),v(273)],[neutral_add_subtr_int,v(273)]], NewDPredCls : [[pn1,v(8)],[neutral_add_subtr_int,v(273)]] διαδικασία replace_body( DPredCls, PPredCls, NewDPredCls ) get_body( PPredCls, BdPPredCls ) ; find_pred( PPredCls, PredNameR ) ; replace_cls( DPredCls, BdPPredCls, PredNameR, NewDPredCls ) ; Η διαδικασία αυτή επιστρέφει το σώµα της πρότασης Cl. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα Cl : [[p1,v(200),v(201)],[neutral_int,v(201)],[p2,v(18)],[p3,v(12)]] BdCl : [[neutral_int,v(201)],[p2,v(18)],[p3,v(12)]] διαδικασία get_body( Cl, BdCl )... Η διαδικασία αυτή βρίσκει το literal του PredNameR στο DPredCls και το αντικαθιστά µε το BdPPredCls επιστρέφοντας το NewDPredCls. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα : DPredCls : [[pn1,v(8)],[p1,v(7),v(8)],[p0,v(8)]], BdPPredCls : [[not neutral_int,v(201)],[p2,v(18)],[p3,v(12)]], PredNameR : p1, NewDPredCls : [[pn1,v(8)],[not neutral_int,v(201)],[p2,v(18)],[p3,v(12)], [p0,v(8)]] διαδικασία replace_cls( DPredCls, BdPPredCls, PredNameR, NewDPredCls )... Η διαδικασία αυτή δέχεται σαν είσοδο ένα σύνολο προτάσεων NodeCls και δηµιουργεί το κόµβο Node. NodeCls : [[[pn1,v(8)],[neutral_add_subtr_int,v(8)]],[[pn1,v(8)],[empty,v(8)], 34

[p0,v(8)]]] Node : [pn1,[[[pn1,v(8)],[neutral_add_subtr_int,v(8)]],[[pn1,v(8)],[empty,v(8)], [p0,v(8)]]],none,[neutral_add_subtr_int,empty,p0],yes,predtype_pn1, PredMode_pn1,OnOffFlag_pn1,new_def]) διαδικασία make_new_node ( NodeCls, Node ) make_childlist( NodeCls, [], Children ) ; put_flag( Children, DTopFlag ) ; Other_Info=new_def ; OnOffFlag=on ; φτιάξε το κόµβο Node ; Η διαδικασία αυτή δέχεται σαν είσοδο ένα δυαδικό δέντρο SBT και ένα καινούργιο κόµβο NewNode και καταχωρεί το κόµβο NewNode στο δέντρο δηµιουργώντας ένα καινούργιο δυαδικό δέντρο NewSBT. SBT : NewNode : [pn1,[[[pn1,v(8)],[neutral_add_subtr_int,v(8)]],[[pn1,v(8)], [empty,v(8)],[p0,v(8)]]],none,[neutral_add_subtr_int,empty,p0],yes,predtype_pn1, PredMode_pn1,OnOffFlag_pn1,new_def]) NewSBT : διαδικασία update( SBT, NewNode, NewSBT ) βρες από το NewNode το NodePredName ; delete_node( SBT, PredName, SBTi ) ; insert_new_node( SBTi, Node, NewSBT ) ; Η διαδικασία αυτή δέχεται σαν είσοδο ένα δυαδικό δέντρο SBT και µια πρόταση DnewCl, βρίσκει τον παλιό κόµβο που θα απενεργοποιηθεί και βάζει στο flag OnOffFlag την τιµή off δηµιουργώντας το νέο δέντρο NewSBT. SBT : DnewCl : [[[pn1,v(8)],[p1,v(7),v(8)]]] NewSBT : διαδικασία mark_onoffflag(sbt, DnewCl, FinalSBT) mark_offflag(sbt, DnewBody, FinalSBT) ; 35

Η διαδικασία αυτή δέχεται σαν είσοδο ένα δυαδικό δέντρο SBT και ένα literal της µορφής [[Pred,Args]], βρίσκει τον κόµβο του Pred από το SBT,αλλάζει την τιµή του flag OnOffFlag από on σε off και βάζει το καινούργιο κόµβο στο δέντρο δηµιουργώντας το νέο δέντρο NewSBT. Σηµείωση: Λεπτοµέρειες για αυτή τη διαδικασία στο κώδικα SBT : DnewBody : [[p1,v(7),v(8)]] NewSBT : διαδικασία mark_offflag(sbt, DnewBody, FinalSBT) 4.2.3. Αλγόριθµος υλοποίησης της πράξης της Πτύξης Η διαδικασία αυτή δέχεται σαν είσοδο ένα ταξινοµηµένο δυαδικό δέντρο SBT και ένα σύνολο προτάσεων Dnew, εφαρµόζει τον µετασχηµατισµό της πτύξης στο πρόγραµµα που παριστάνεται από το SBT, και επιστρέφει ένα νέο δυαδικό δέντρο FinalSBT. SBT : Το ταξινοµηµένο δυαδικό δέντρο e.g bt(sum, [[[sum,v(1),v(2)],[p0,v(1)],[p1,v(1),v(2)]],[[sum,v(1),v(2)],[not p0,v(1)],[p2,v(1),v(3),v(4)],[sum,v(4),v(5)],[p3,v(1),v(3),v(5),v(2)]]], none,[p1,p0,p2,p3],no,predtype_sum,predmode_sum,onoffflag_sum, Other_Info_sum, bt(p0, [[[p0,v(6)],[empty_seq,v(6)]]], sum,[empty_seq],yes,predtype_p0,predmode_p0,onoffflag_p0, Other_Info_p0,nil, bt(p2, [[[p2,v(9),v(10),v(11)],[p4,v(9),v(10),v(11)],[p5,v(9),v(10),v(11)]]], sum,[p4,p5],no,predtype_p2,predmode_p2,onoffflag_p2, Other_Info_p2,nil, bt(pn1, [[[pn1,v(8)],[neutral_add_subtr_int,v(8)]]], none,[neutral_add_subtr_int],yes,predtype_pn1,predmode_pn1, OnOffFlag_pn1,new_def,nil, bt(pn2, [[[pn2,v(13),v(14),v(15)],[plus_int,v(13),v(14),v(15)]]], none,[plus_int],yes, PredType_pn2,PredMode_pn2,OnOffFlag_pn2, new_def,nil, bt(pn3, [[[pn3,v(16),v(17)],[head,v(16),v(17)]]], none,[head],yes, PredType_pn3,PredMode_pn3,OnOffFlag_pn3, 36