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



Σχετικά έγγραφα
ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ Ο. Τετάρτη 8 Ιουλίου 2015

ΑΠΟΛΥΤΗΡΙΕΣ ΕΞΕΤΑΣΕΙΣ Γ ΤΑΞΗΣ ΕΝΙΑΙΟΥ ΛΥΚΕΙΟΥ ΠΕΜΠΤΗ 23 ΜΑΪΟΥ 2002 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ ΓΕΝΙΚΗΣ ΠΑΙ ΕΙΑΣ: ΝΕΟΕΛΛΗΝΙΚΗ ΓΛΩΣΣΑ

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ Ρ. Τετάρτη 7 Μαρτίου 2012

Oδηγία 94/33/ΕΚ του Συµβουλίου της 22ας Ιουνίου 1994 για την προστασία των νέων κατά την εργασία

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ Ε. Παρασκευή 10 Οκτωβρίου 2014

Κύκλος Σχέσεων Κράτους -Πολίτη. ΠΟΡΙΣΜΑ (Άρθρο 4 6 ν. 3094/2003 «Συνήγορος του Πολίτη και άλλες διατάξεις»)

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕ ΡΙΑΣΗ Ν. Πέµπτη 28 Ιανουαρίου 2010

ΕΡΓΟ: «ΕΦΑΡΜΟΓΕΣ ΕΙΚΟΝΙΚΗΣ ΠΡΑΓΜΑΤΙΚΟΤΗΤΑΣ ΣΤΗ ΒΟΙΩΤΙΑ: ΜΑΝΤΕΙΟ ΤΡΟΦΩΝΙΟΥ ΚΑΙ ΜΥΚΗΝΑΪΚΗ ΘΗΒΑ»

Όμιλος Λογοτεχνίας. Δράκογλου Αναστασία, Κιννά Πασχαλίνα

Ακολουθούν όλα τα σχετικά έγγραφα - αποφάσεις για το ωράριο, όπως οµόφωνα ψηφίστηκαν και επικυρώθηκαν από το συνέδριο στο Λουτράκι το 2007

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΤΜΗΜΑ ΔΙΑΚΟΠΗΣ ΕΡΓΑΣΙΩΝ ΤΗΣ ΒΟΥΛΗΣ ΘΕΡΟΥΣ 2013 ΣΥΝΕΔΡΙΑΣΗ Ι Τρίτη 27 Αυγούστου 2013

Η ΕΠΑΓΓΕΛΜΑΤΙΚΗ & ΕΠΙΧΕΙΡΗΜΑΤΙΚΗ ΔΡΑΣΤΗΡΙΟΠΟΙΗΣΗ ΤΩΝ ΕΛΛΗΝΩΝ ΤΗΣ ΔΙΑΣΠΟΡΑΣ ΜΕΤΑ ΤΟΝ Β ΠΑΓΚΟΣΜΙΟ ΠΟΛΕΜΟ ΚΑΙ Η ΕΠΙΔΡΑΣΗ ΤΗΣ ΣΤΟ ΕΘΝΙΚΟ ΚΕΝΤΡΟ

ΙΣΤΟΡΙΑ ΘΕΩΡΗΤΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ ΟΜΑΔΑ Α

ΜΕΛΕΤΗ ΠΡΟΜΗΘΕΙΑ ΕΙ ΩΝ ΙΜΑΤΙΣΜΟΥ ΚΑΙ ΥΠΟ ΗΣΗΣ ΠΡΟΣΩΠΙΚΟΥ ΕΥΑΛ ΕΤΟΥΣ 2013

Θ Ε Μ Α «Έγκριση Αγροτικού και Αρδευτικού Κανονισµού ήµου Καβάλας» Αριθ. Αποφάσεως 891/2011

Υ π ά ρ χ ο υ ν α ν τ ι κ ε ι μ ε ν ι κ έ ς η θ ι κ έ ς α ξ ί ε ς ;

ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΝΟΜΟΣ ΘΕΣΣΑΛΟΝΙΚΗΣ Ο ΗΜΑΡΧΟΣ ΘΕΣΣΑΛΟΝΙΚΗΣ /ΝΣΗ ΟΙΚΟΝΟΜΙΚΗΣ & ΤΑΜΕΙΑΚΗΣ ΙΑΧΕΙΡΙΣΗΣ ΤΜΗΜΑ ΠΡΟΚΗΡΥΞΕΩΝ & ΗΜΟΠΡΑΣΙΩΝ

Σέρρες Αριθ. Πρωτ.: 1387

ΕΠΕΣΤΡΕΨΕ ΣΤΟΝ ΔΗΜΙΟΥΡΓΟ

Ταχ. Δ/νση : Τέρμα οδού Υγείας & Μεσογείων ΠΡΟΧΕΙΡΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΣΕ ΕΥΡΩ-ΕΛΕΥΘΕΡΟ ΓΙΑ ΤΟ ΕΚΑΒ-Ν.Π.Δ.Δ.

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ]Β. Πέµπτη 20 Φεβρουαρίου 2014

ΟΡΓΑΝΙΣΜΟΣ ΕΛΛΗΝΙΚΩΝ. Αθήνα, 28/11/01 Αριθ. Πρωτ. : ΑΣΦΑΛΙΣΕΩΝ

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

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΤΜΗΜΑ ΔΙΑΚΟΠΗΣ ΕΡΓΑΣΙΩΝ ΤΗΣ ΒΟΥΛΗΣ ΘΕΡΟΣ 2014 ΣΥΝΕΔΡΙΑΣΗ ΛΒ Πέµπτη 4 Σεπτεµβρίου 2014

Έφη Κατσαδήµα, Αθηνά Νέγρη, Χρυσάνθη Παλαµά

Παρασκευή 7 Μάιου 2004

στο σχέδιο νόµου «Ρύθµιση συνταξιοδοτικών θεµάτων του Δηµοσίου και άλλες διατάξεις» Επί του άρθρου 1 ΑΙΤΙΟΛΟΓΙΚΗ ΕΚΘΕΣΗ

Τ.Ε.Ι. ΛΑΜΙΑΣ ΚΑΝΟΝΙΣΜΟΣ ΠΡΑΚΤΙΚΗΣ ΑΣΚΗΣΗΣ Ο ΗΓΟΣ ΠΡΑΚΤΙΚΗΣ ΑΣΚΗΣΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ

Οι υπεύθυνοι καθηγητές/τριες Τζιούφας Βασίλειος ΠΕ11 Φλόκας Αθανάσιος ΠΕ03 Κροµµύδα έσποινα ΠΕ09 Σωτήρη Χρυσούλα ΠΕ15 Νασιόπουλος Απόστολος ΠΕ02

Α Π Ο Φ Α Σ Η 4/459/ του ιοικητικού Συµβουλίου

15PROC

ΠΕΡΙΛΗΨΗ Λήψη απόφασης σχετικά με το υπ' αριθμ. 5016/ αίτημα της Ευαγγελίας Σκουντζούρη κλπ που αφορά στο ΟΤ 823.


ΑΔΑ: 64Υ9ΩΗΜ-ΑΗΙ ΑΔΑΜ: 15PROC

ΑΔΑ: Β4Λ3ΩΗΑ-5ΕΝ ΑΝΑΡΤΗΤΕΑ ΣΤΟ ΙΑ ΙΚΤΥΟ

ΙΣΤΟΡΙΑ ΘΕΩΡΗΤΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ

Ερµού & Κορνάρου 2 ΤΗΛ: FAX: olme@otenet.gr Αθήνα, 3/3/08 Α.Π.: 656

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕ ΡΙΑΣΗ ΡΝΣΤ. Παρασκευή 2 Ιουλίου 2010

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΝΟΜΟΣ ΕΥΒΟΙΑΣ ΣΧΟΛΙΚΗ ΕΠΙΤΡΟΠΗ ΜΟΝΑΔΩΝ Α ΒΑΘΜΙΑΣ ΕΚΠ/ΣΗΣ ΕΡΓΑΣΙΑ:

ΣΥΛΛΟΓΙΚΗ ΣΥΜΒΑΣΗ ΕΡΓΑΣΙΑΣ. Για τους όρους αµοιβής και εργασίας των Εργαζοµένων στις Ξενοδοχειακές Επιχειρήσεις Νοµού Χανίων

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΟΖ. Δευτέρα 20 Ιουλίου 2015

Α Π Ο Σ Π Α Σ Μ Α Από το Πρακτικό της 03ης Τακτικής Συνεδρίασης του ηµοτικού Συµβουλίου Σκοπέλου

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

Το 1 ο φύλλο της εφηµερίδας µας, που κυκλοφόρησε τον Οκτώβριο του 1996 και ήταν χειρόγραφο

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕ ΡΙΑΣΗ ΡΙΣΤ. Παρασκευή 7 Μαΐου 2010

ΙΑΚΗΡΥΞΗ Νο 11/2012 ΗΜΟΣΙΕΥΣΕΙΣ

γ ρ α π τ ή ε ξ έ τ α σ η σ τ o μ ά θ η μ α Ν Ε Ο Ε Λ Λ Η Ν Ι Κ Η Γ Λ Ω Σ Σ Α Α Λ Υ Κ Ε Ι Ο Υ Τάξη: Α Λυκείου Τμήμα: Βαθμός: Ονοματεπώνυμο: Καθηγητές:

Τμήμα Ζωικής Παραγωγής ΤΕΙ Δ. Μακεδονίας, Παράρτημα Φλώρινας

Ταχ. /νση: Ερµού ΠΡΟΣ: Ως Πίνακας Αποδεκτών Ταχ. Κώδικας: Αθήνα Τηλέφωνο:

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΠΣΤ. Πέµπτη 16 Φεβρουαρίου 2012

Οι στρατηγικές πολιτικές (διπλωµατικές) αρετές του Αγησιλάου (3 διδακτικές ώρες)

H προστασία της ιδιωτικής ζωής των παιδιών που ζουν σε ιδρύµατα

ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΥΠΟΥΡΓΕΙΟ ΕΡΓΑΣΙΑΣ & ΚΟΙΝΩΝΙΚΩΝ ΑΣΦΑΛΙΣΕΩΝ Αθήνα,

Διοικητικό Συμβούλιο. Οργανωτική Επιτροπή

ΙΙ, 3-4. Α. Ερωτήσεις ανοικτού τύπου ή ελεύθερης ανάπτυξης

«Βαλκανικοί πόλεμοι Ανάπτυξη project στη Γ Λυκείου με τη χρήση του διαδικτύου και λογισμικού»

ΣΥΝΕΔΡΙΑΣΗ ΟΛΟΜΕΛΕΙΑΣ (ΑΠΟΓΕΥΜΑ)

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΡΜ. Πέµπτη 7 Μαρτίου 2013

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΞΖ. Τρίτη 30 Ιουνίου 2015

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΝΟΜΟΣ ΒΟΙΩΤΙΑΣ ΔΗΜΟΣ ΟΡΧΟΜΕΝΟΥ Αρ.Πρωτ.: 10829/ Α Π Ο Σ Π Α Σ Μ Α

Προς κάθε ενδιαφερόµενο

στο σχέδιο νόµου «Ανασυγκρότηση του Υπουργείου Ναυτιλίας και Αιγαίου και άλλες διατάξεις» Ι. Εισαγωγικές επισηµάνσεις II. Οι επιµέρους ρυθµίσεις:

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

Π Ρ Α Κ Τ Ι Κ Α Β Ο Υ Λ Η Σ

Συµβουλεύοµαι το κρυπτογραφικό αλφάβητο της Φιλικής Εταιρείας και. Ελευθερία ή Θάνατος. γ35343 ωβη3οω3η

Κατά την έναρξη της συνεδρίασης ο Πρόεδρος διαπίστωσε ότι σε σύνολο 27 δημοτικών συμβούλων ήταν:

ΕΝ ΕΙΚΤΙΚΕΣ ΑΠΑΝΤΗΣΕΙΣ

Ο κοινωνικός αποκλεισµός στους Ροµ και οι προοπτικές απασχόλησης σε επαγγέλµατα που σχετίζονται µε το περιβάλλον

ΓΕΩΡΓΙΟΣ κ ΝΙΚΟΛΑΟΣ ΑΣΚΟΥΝΗΣ Ο.Ε. ΡΗΓΑ ΦΕΡΑΙΟΥ , ΠΑΤΡΑ, ΤΗΛ. -FAX: , Αρ. Πρωτ.Askounis:2246.

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΡΚΣΤ. Τετάρτη 4 Μαΐου 2011

Θ Ε Μ Α «Έγκριση σύναψης τροποποιηµένης προγραµµατικής σύµβασης (Γεωτεχνική έρευνα Ευστάθειας Βραχωδών Πρανών στο.. Καβάλας) µε το Ι.Γ.Μ.Ε.

ΣΧΕ ΙΑΣΜΟΣ ΖΩΝΩΝ ΧΡΗΣΕΩΝ ΓΗΣ ΣΕ ΠΕΡΙΟΧΕΣ Γ.Π.Σ.

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

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΤΜΗΜΑ ΔΙΑΚΟΠΗΣ ΕΡΓΑΣΙΩΝ ΤΗΣ ΒΟΥΛΗΣ ΘΕΡΟΥΣ 2014 ΣΥΝΕΔΡΙΑΣΗ ΛZ Τρίτη 16 Σεπτεµβριου 2014

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

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΚΘ. Τρίτη 18 Σεπτεµβρίου 2012

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΜΓ. Δευτέρα 8 Οκτωβρίου 2012

Επί συνόλου πενήντα (50) μελών (συμπεριλαμβανομένου του Προέδρου) ήταν παρόντα τριάντα ένα (31), ήτοι:

I.Επί της Αρχής του σχεδίου Νόµου: ΙΙ. Επί των άρθρων του σχεδίου Νόµου: ΕΙΣΗΓΗΤΙΚΗ ΕΚΘΕΣΗ


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

ΑΣΦΑΛΙΣΗ ΣΚΑΦΩΝ ΑΝΑΨΥΧΗΣ ΣΤΑΤΙΣΤΙΚΑ ΣΤΟΙΧΕΙΑ ΕΤΟΥΣ

ΠΤΤΧΙΑΚΗ ΕΡΓΑΣΙΑ ΜΕ ΘΕΜΑ

ΠΡΟΣΚΛΗΣΗ ΕΚΔΗΛΩΣΗΣ ΕΝΔΙΑΦΕΡΟΝΤΟΣ ΓΙΑ ΤΗΝ ΠΡΟΣΛΗΨΗ ΔΙΔΑΣΚΟΝΤΩΝ ΣΥΜΦΩΝΑ ΜΕ ΤΟ Π.Δ.407/80

Κιοσές Νικόλαος, Παπαντίδης Ιορδάνης, µετά την υπ αριθ. 507/2012 Α Σ.

ΈΚΘΕΣΗ ΤΗΣ ΡΑΕ ΑΘΗΝΑ ΜΑΙΟΣ 2002

ΠΡΟΜΗΘΕΙΑΣ ΣΤΟΛΩΝ ΓΙΑ ΤΟ ΕΙΔΙΚΟ ΕΝΣΤΟΛΟ ΠΡΟΣΩΠΙΚΟ ΤΗΣ ΔΗΜΟΤΙΚΗΣ ΑΣΤΥΝΟΜΙΑΣ ΠΡΟΫΠΟΛΟΓΙΣΜΟΥ : ,00


ΑΔΑ: ΒΟΖΚΟΡ1Π-ΚΟΦ ΠΑΡΑΡΤΗΜΑ Α

Η ευσέβεια, η αξιοπιστία και η ακεραιότητα του Αγησιλάου (1 διδακτική ώρα)

οικισµών του ήµου Φαιστού

Συλλόγου ιπλωµατούχων Νοσηλευτριών και Νοσηλευτών Χειρουργείου

ΑΡ.ΜΕΛ. 80/2013 Κ.Α

ΔΙΑΚΗΡΥΞΗ No 78 ΠΡΟΧΕΙΡΟΥ ΔΙΑΓΩΝΙΣΜΟΥ

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

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΣΥΝΕΔΡΙΑΣΗ ΡΙΣΤ. Πέµπτη 31 Ιανουαρίου 2013

Μέλι, ένας θησαυρός υγείας και δύναμης

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΜΕ ΘΕΜΑ

πτυχιακή εργασία θέαα:

Τρίτη, 23 Μαΐου 2006 Γ ΛΥΚΕΙΟΥ ΓΕΝΙΚΗΣ ΠΑΙ ΕΙΑΣ ΕΚΦΡΑΣΗ - ΕΚΘΕΣΗ ΚΕΙΜΕΝΟ

Transcript:

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

Περιεχόµενα Κατάλογος Προγραµµάτων 3 Κατάλογος Σχηµάτων 3 1. Εισαγωγή 4 2. Εισαγωγικές έννοιες του Λογικού Προγραµµατισµού 5 2.1 Αντικατάσταση 5 2.2 Ταυτοποίηση 6 3. Μετασχηµατισµοί (Transformations) 8 3.2 Κανόνας Εισαγωγής Ορισµού (Definition Introduction Rule) 8 3.3 Κανόνας Ανάπτυξης (Unfolding Rule) 9 3.4 Κανόνας Πτύξης (Folding Rule) 11 3.5 Παράδειγµα διαδοχικής εφαρµογής των κανόνων Εισαγωγής Ορισµού, Ανάπτυξης και Πτύξης 14 4. Κατασκευή Λογικών Προγραµµάτων µε Σχήµατα Προγραµµάτων 17 4.1 Ανάπτυξη Λογικών Προγραµµάτων µε Βήµατα Πολλών Βελτιώσεων. 17 5. Μια Μέθοδος Αυτόµατου Μετασχηµατισµού Λογικών Προγραµµάτων 19 5.1 Περιγραφή Προβλήµατος 19 5.2 Ακολουθία Μετασχηµατισµών 19 5.3 Η Μέθοδος Επίλυσης του Προβλήµατος 21 5.4 Παραδείγµατα 23 5.4.1 Παράδειγµα 1: Άθροιση Στοιχείων Ακολουθίας/Λίστας. 23 5.4.2 Παράδειγµα 2: Εύρεση του Μέγιστου Στοιχείου Ακολουθίας/Λίστας. 25 6. Συµπεράσµατα και µελλοντικές βελτιώσεις και επεκτάσεις 36 Βιβλιογραφία 36 2

Κατάλογος Προγραµµάτων ΠΡΟΓΡΑΜΜΑ 3.1 : ΠΑΡΑ ΕΙΓΜΑ ΝΕΟΥ ΟΡΙΣΜΟΥ, ΠΡΟΓΡΑΜΜΑ P 0 9 ΠΡΟΓΡΑΜΜΑ 3.2 : ΠΡΟΓΡΑΜΜΑ P 1 10 ΠΡΟΓΡΑΜΜΑ 3.3 : ΠΑΡΑ ΕΙΓΜΑ ΠΤΥΞΗΣ, P={C1, C2}, D={D1, D2} 13 ΠΡΟΓΡΑΜΜΑ 3.4 : ΠΑΡΑ ΕΙΓΜΑ ΠΤΥΞΗΣ ΣΤΟ ΠΡΟΓΡΑΜΜΑ P 2 14 ΠΡΟΓΡΑΜΜΑ 3.5 : ΠΑΡΑ ΕΙΓΜΑ ΕΙΣΑΓΩΓΗΣ ΟΡΙΣΜΟΥ 14 ΠΡΟΓΡΑΜΜΑ 3.6 : ΠΡΟΓΡΑΜΜΑ P 1 15 ΠΡΟΓΡΑΜΜΑ 3.7 : ΠΡΟΓΡΑΜΜΑ P 2 16 ΠΡΟΓΡΑΜΜΑ 5.1 : ΑΡΧΙΚΟ ΠΡΟΓΡΑΜΜΑ SUM(X,Y) 23 ΠΡΟΓΡΑΜΜΑ 5.2 : ΤΕΛΙΚΟ ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟ ΠΡΟΓΡΑΜΜΑ SUM(X,Y) 25 ΠΡΟΓΡΑΜΜΑ 5.3 : ΑΡΧΙΚΟ ΠΡΟΓΡΑΜΜΑ MAX_SEQ(X,Y) 26 ΠΡΟΓΡΑΜΜΑ 5.4 : ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟ ΠΡΟΓΡΑΜΜΑ MAX_SEQ(X,Y) ΜΕΤΑ ΤΗΝ ΠΡΩΤΗ ΕΠΑΝΑΛΗΨΗ 30 ΠΡΟΓΡΑΜΜΑ 5.5 : ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟ ΠΡΟΓΡΑΜΜΑ MAX_SEQ(X,Y) ΜΕΤΑ ΤΗΝ ΕΥΤΕΡΗ ΕΠΑΝΑΛΗΨΗ 32 ΠΡΟΓΡΑΜΜΑ 5.6 : ΤΕΛΙΚΟ ΜΕΤΑΣΧΗΜΑΤΙΣΜΕΝΟ ΠΡΟΓΡΑΜΜΑ MAX_SEQ(X,Y) 35 Κατάλογος Σχηµάτων ΣΧΗΜΑ 3.1 : ΣΧΗΜΑΤΙΚΗ ΠΑΡΑΣΤΑΣΗ ΚΑΝΟΝΑ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΥ ΑΝΑΠΤΥΞΗΣ 10 ΣΧΗΜΑ 3.2 : ΣΧΗΜΑΤΙΚΗ ΠΑΡΑΣΤΑΣΗ ΚΑΝΟΝΑ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΥ ΠΤΥΞΗΣ 12 3

1. Εισαγωγή Ο στόχος αυτής της ερευνητικής µελέτης είναι η ανάλυση και ο σχεδιασµός ενός συστήµατος το οποίο θα βελτιώνει λογικά προγράµµατα µετασχηµατίζοντάς τα σε ισοδύναµα προγράµµατα µικρότερου µεγέθους (µικρότερο πλήθος προτάσεων και αποµάκρυνση αχρησιµοποίητων ορισµάτων) και πιθανόν περισσότερο αποτελεσµατικά. Η δοµή των προγραµµάτων που θα βελτιώνονται εµπεριέχει τις σχεδιαστικές αποφάσεις που πάρθηκαν κατά την κατασκευή τους [Marakakis and Gallagher, 1994], [Marakakis, 1997]. Το πλεονέκτηµα τους είναι η ευκρινής δοµή τους η οποία δηµιουργείται µε ηµι-αυτόµατο τρόπο. Η ευκρίνεια της δοµής τους είναι χρήσιµη για την κατασκευή τους και για την συντήρηση τους. Τα µειονέκτηµα τους τα οποία δηµιουργούνται λόγω του ηµι-αυτόµατου τρόπου κατασκευής τους είναι το µεγάλο πλήθος προτάσεων που περιέχουν καθώς και οι αχρησιµοποίητες µεταβλητές στα κατηγορήµατα. Αυτά τα µειονεκτήµατα τα οποία µπορεί να έχουν συνέπεια στην αποτελεσµατικότητα τους λύνονται µε µετασχηµατισµό τους σε ισοδύναµα προγράµµατα. Οι µετασχηµατισµοί οι οποίοι θα χρησιµοποιηθούν είναι οι εξής: New definitions Νέοι ορισµοί Unfold - Ανάπτυξη Fold Πτύξη Η ηµιαυτόµατη µεθοδολογία κατασκευής τους στηρίζεται σε σχήµατα προγραµµάτων όπου το κάθε σχήµα παριστά και µια σχεδιαστική απόφαση [Marakakis and Gallagher, 1994], [Marakakis, 1997]. Τα υπόλοιπα κεφάλαια αυτής της ερευνητικής µελέτης έχουν ως εξής: Στο δεύτερο κεφάλαιο ορίζονται βασικές έννοιες του Λογικού Προγραµµατισµού οι οποίες χρησιµοποιούνται στα επόµενα κεφάλαια. Στο τρίτο κεφάλαιο αναλύονται οι µετασχηµατισµοί Εισαγωγής Ορισµού (Definitions Introduction), Ανάπτυξης (Unfold) και Πτύξης (Fold). Στο τέταρτο κεφάλαιο γίνεται σύντοµη αναφορά στη µέθοδο κατασκευής προγραµµάτων µε σχήµατα [Marakakis and Gallagher, 1994], [Marakakis, 1997]. Στο πέµπτο κεφάλαιο παρουσιάζεται η προτεινόµενη µέθοδος µετασχηµατισµού των δοµηµένων προγραµµάτων τα οποία κατασκευάζονται µε την µεθοδολογία η οποία παρουσιάζεται στις δηµοσιεύσεις [Marakakis and Gallagher, 1994] και [Marakakis, 1997]. Στο πέµπτο κεφάλαιο αναφέρονται τα συµπεράσµατα, οι δυνατές επεκτάσεις και οι τυχόν αδυναµίες της προταθείσας µεθόδου. 4

2. Εισαγωγικές έννοιες του Λογικού Προγραµµατισµού Σ αυτό το κεφάλαιο δίνονται βασικοί ορισµοί του Λογικού Προγραµµατισµού οι χρησιµοποιούνται στα επόµενα κεφάλαια [Μαρακάκης, 2003]. 2.1 Αντικατάσταση Ορισµός 2.1 Αντικατάσταση (substitution ) είναι ένα σύνολο της µορφής {Χ 1 /t 1,, Χ k /t k } όπου κάθε Χ i (1 i k) είναι µια µεταβλητή διαφορετική από τις υπόλοιπες και κάθε t i είναι ένας όρος διαφορετικός από την µεταβλητή Χ i. Κάθε στοιχείο της µορφής Χ i /t i ονοµάζεται δέσµευση του Χ i. Ορισµός 2.2 Έστω η αντικατάσταση θ = {Χ 1 /t 1,, Χ k /t k }. Η αντικατάσταση θ ονοµάζεται βασική αντικατάσταση (ground substitution) εάν όλα τα t i (1 i k) είναι βασικοί όροι. Η αντικατάσταση θ ονοµάζεται αντικατάσταση µετονοµασίας (renaming substitution) εάν όλα τα t i (1 i k) είναι µεταβλητές. Η αντικατάσταση θ = { } ονοµάζεται κενή ή ταυτοτική αντικατάσταση και συµβολίζεται µε. Παράδειγµα Εάν a, b είναι σταθερές, X, Y, Z, W είναι µεταβλητές και f/1, g/2 είναι συναρτήσεις τότε η αντικατάσταση θ 1 = {Χ/f(a), Y/g(a,f(b))} είναι βασική αντικατάσταση ενώ η αντικατάσταση θ 2 = {Χ/Z, Y/W} είναι αντικατάσταση µετονοµασίας. Ορισµός 2.3 Μια παράσταση (έκφραση) είναι είτε όρος, ή ένας στοιχειώδης τύπος, ή µια σύζευξη ή διάζευξη στοιχειωδών τύπων. Μια απλή παράσταση είναι είτε ένας όρος ή ένας ατοµικός τύπος. Ορισµός 2.4 Έστω Ε µια πρόταση και θ = {X 1 /t 1,,X k /t k } µια αντικατάσταση. Ένα στιγµιότυπο (instance) Εθ του Ε λαµβάνεται εάν ταυτόχρονα αντικατασταθεί κάθε εµφάνιση του X i στην Ε µε t i όπου (1 i k). Η διαδικασία αυτή ονοµάζεται εφαρµογή αντικατάστασης. Παράδειγµα Έστω η έκφραση E = p(x) q(g(x, Y)) και θ = {X/a, Y/f(b)}. Το στιγµιότυπο Εθ είναι η παράσταση Εθ = p(a) q(g(a, f(b))) Ορισµός 2.5 Έστω ότι θ = {X 1 /t 1,,X k /t k } και σ = {Y 1 /s 1,,Y ν /s ν } είναι δύο αντικαταστάσεις. Η σύνθεση θ σ των θ και σ είναι η αντικατάσταση η οποία λαµβάνεται ως εξής: {X 1 /t 1 σ,, X k /t k σ, Y 1 /s 1,..., Y ν /s ν } όπου διαγράφονται δεσµεύσεις X i /t i σ για τις οποίες ισχύει X i =t i σ (1 i k). Επίσης διαγράφονται δεσµεύσεις Y j /s j (1 j ν) για τις οποίες ισχύει Υ j {Χ 1,,Χ κ }. 5

Παραδείγµατα 1. Έστω θ = {X/a, Y/g(b,Z)} και σ = {Z/b, W/f(a)}, η σύνθεση τους είναι θ σ = {X/a, Y/g(b,b), Z/b, W/f(a)} 2. Έστω θ = {X/f(Y), Y/a, Z/W} και σ = {Y/f(a),W/Z, V/g(a,f(b))}, η σύνθεση τους είναι θ σ = {X/f(f(a)), Y/a, Y/f(a), W/Z, V/g(a,f(b))} Ορισµός 2.6 Μια αντικατάσταση θ είναι αυτοαπορροφητική (indempotent) εάν κατά την εφαρµογή της θ στον «εαυτό» της, προκύψει η ίδια θ (θ=θ θ). ηλαδή, για την αντικατάσταση θ = {X 1 /t 1,,X k /t k } καµία µεταβλητή X i (1 i k) δεν θα πρέπει να υπάρχει σε κάποιον από τους όρους {t 1,,t k }. Κάθε νόµιµη αντικατάσταση θα πρέπει να ικανοποιεί την ιδιότητα της αυτοαπορρόφησης. Για παράδειγµα, η αντικατάσταση θ = {X/Y, Y/a} δεν είναι αυτοαπορροφητική, καθώς η εφαρµογή της θ στην θ είναι θ θ = {X/a, Y/a} θ. Το κριτήριο της αυτοαπορρόφησης δεν είναι το µοναδικό χαρακτηριστικό των αντικαταστάσεων. Θεωρούµε τις αντικαταστάσεις θ 1, θ 2, θ 3, την έκφραση Ε και τη κενή αντικατάσταση є. Όλες οι αντικαταστάσεις πρέπει να ικανοποιούν τις ακόλουθες ιδιότητες: θ 1 є = є θ 1 =θ 1. (Εθ 1 ) θ 2 =Ε(θ 1 θ 2 ). (θ 1 θ 2 ) θ 3 =θ 1 (θ 2 θ 3 ). Προσεταιριστική ιδιότητα της Ε θ 1 θ 2 Ε θ 2 θ 1. Η σύνθεση αντικαταστάσεων δεν ικανοποιεί την µεταθετική ιδιότητα. 2.2 Ταυτοποίηση Ορισµός 2.7 Μια αντικατάσταση θ 1 είναι περισσότερο γενική από µια αντικατάσταση θ 2, συµβολίζεται θ 2 θ 1, εάν υπάρχει αντικατάσταση θ 3 ώστε να ισχύει θ 2 = θ 1 θ 3. Παράδειγµα Η αντικατάσταση θ 1 = {Χ/f(Z),Y/b} είναι περισσότερο γενική από την αντικατάσταση θ 2 = {X/f(a),Y/b} γιατί εάν θ 3 = {Z/a} τότε θ 2 = θ 1 θ 3. Ορισµός 2.8 Έστω Ε 1 και Ε 2 δυο απλές εκφράσεις. Ένας ταυτοποιητής των Ε 1 και Ε 2 είναι µια αντικατάσταση θ τέτοια ώστε Ε 1 θ=ε 2 θ. Παράδειγµα Εάν Ε 1 = p(x,y) και Ε 2 = p(z,a) είναι δυο εκφράσεις τότε ένας ταυτοποιητής θ 1 των Ε 1 και Ε 2 είναι ο θ 1 = {Χ/b, Y/a, Z/b} έτσι ώστε Ε 1 θ 1 = Ε 2 θ 1 = p(b,a). Ένας άλλος ταυτοποιητής θα ήταν ο θ 2 = {Χ/a, Y/a, Z/a} τέτοιος ώστε Ε 1 θ 2 = Ε 2 θ 2 = p(a,a). Οµοίως, ταυτοποιητής είναι και ο θ 3 = {Χ/Z, Y/a} για τον οποίο έχουµε Ε 1 θ 3 = Ε 2 θ 3 = p(z,a). Τέλος, ταυτοποιητής των Ε 1 και Ε 2 είναι και ο θ 4 = {Χ/f(W), Y/a, Z/f(W)} για τον οποίο προκύπτει Ε 1 θ 4 = Ε 2 θ 4 = p(f(w), a). Ορισµός 2.9 Ένας ταυτοποιητής θ 1 των απλών εκφράσεων Ε 1 και Ε 2 ονοµάζεται ο πλέον γενικός ταυτοποιητής (πγτ) ή most general unifier (mgu) εάν για κάθε άλλο ταυτοποιητή θ 2 των Ε 1 και Ε 2 υπάρχει µια αντικατάσταση θ 3 τέτοια ώστε να ισχύει θ 2 = θ 1 θ 3. Παράδειγµα 6

Από τους παραπάνω ταυτοποιητές, θ 1, θ 2, θ 3, θ 4 ο ταυτοποιητής θ 3 είναι ο πλέον γενικός ταυτοποιητής των εκφράσεων Ε 1 και Ε 2 καθώς ισχύει: α) θ 3 {Z/b} = {X/b, Y/a, Z/b} = θ 1. β) θ 3 {Z/a} = {X/a, Y/a, Z/a} = θ 2. γ) θ 3 {Z/f(W)} = {X/f(W), Y/a, Z/f(W)} = θ 4. 7

3. Μετασχηµατισµοί (Transformations) Οι τεχνικές µετασχηµατισµού πτύξης και ανάπτυξης έχουν χρησιµοποιηθεί για ανάλυση, σύνθεση, εξειδίκευση και επαλήθευση προγραµµάτων. Οι µετασχηµατισµοί αυτοί θα χρησιµοποιηθούν σ αυτή την έρευνα για το µετασχηµατισµό δοµηµένων λογικών προγραµµάτων σε αντίστοιχα περισσότερο αποτελεσµατικά και τα οποία δεν θα περιέχουν «αποµονωµένα» ορίσµατα και προτάσεις που δεν συνεισφέρουν στον υπολογισµό του κορυφαίου στόχου. Η µετονοµασία µεταβλητών είναι µια διαδικασία απαραίτητη για τον έγκυρο µετασχηµατισµό ενός προγράµµατος. Η µετονοµασία προηγήται της εφαρµογής κάθε κανόνα µετασχηµατισµού και είναι καθοριστική για την ορθότητα του αποτελέσµατος. Σε κάθε πράξη µετασχηµατισµού τα ονόµατα των µεταβλητών της πρότασης στην οποία εφαρµόζεται ο µετασχηµατισµός δεν πρέπει να είναι ίδια µε τα ονόµατα των µεταβλητών της πρότασης που χρησιµοποιείται για την εφαρµογή του µετασχηµατισµού. Έτσι, πριν την εφαρµογή του µετασχηµατισµού ανάπτυξης καθώς επίσης και πριν την εφαρµογή του µετασχηµατισµού πτύξης, µετονοµάζονται οι µεταβλητές µόνο της πρότασης στην οποία θα γίνει η εφαρµογή του µετασχηµατισµού ώστε να µην υπάρχει σύγκρουση ίδιων ονοµάτων. Σε αυτό το κεφάλαιο θα παρουσιάσουµε τους ορισµούς των µετασχηµατισµών πτύξης (fold), ανάπτυξης (unfold) και εισαγωγής ορισµού (definition introduction) [Tamaki and Sato, 1984], [Pettorossi and Proietti, 1998], [Pettorossi and Proietti, 1999]. Κάθε ορισµός ακολουθείται από ένα ή περισσότερα παραδείγµατα. 3.2 Κανόνας Εισαγωγής Ορισµού (Definition Introduction Rule) Θεωρούµε ένα πρόγραµµα P, το οποίο περιγράφει µια διαδικασία επίλυσης κάποιου προβλήµατος. Για κάποιο λόγο, υποθέτουµε ότι στο αρχικό πρόγραµµα πρέπει να προστεθεί ένας επιπλέον ορισµός που συµµετέχει στην επίλυση του προβλήµατος. Η ανάγκη προσθήκης νέου ορισµού, µας οδηγεί στην διαδικασία µετασχηµατισµού του αρχικού προγράµµατος P µε την βοήθεια του νέου κανόνα και των κατηγορηµάτων του. Έστω P k το πρόγραµµα µας και D k το σύνολο των νέων ορισµών. Ο κανόνας εισαγωγής ορισµού εισάγει τις εξής n (όπου n 1) προτάσεις οι οποίες ονοµάζονται νέοι ορισµοί. Έστω S οι n νέες προτάσεις S 1 : newp(x 1,...,X h ) Body 1... S n : newp(x 1,...,X h ) Body n Γι αυτές τις προτάσεις πρέπει να ισχύουν τα εξής : 1. newp είναι ένα νέο σύµβολο κατηγορήµατος το οποίο δεν υπάρχει στο P 0, P 1,..., P k. 2. Κάθε µεταβλητή X i (1 i h) πρέπει να υπάρχει στο Body j για κάποιο j τέτοιο ώστε 1 j n. 3. Όλα τα κατηγορήµατα που υπάρχουν στο Body j (1 j n) υπάρχουν επίσης στο αρχικό πρόγραµµα P 0. Σηµείωση : Μια µεταβλητή π.χ η οποία υπάρχει στο Body j (1 j n) δεν είναι αναγκαίο να υπάρχει και στο σύνολο { X 1,...,X h }. 8

Με τον µετασχηµατισµό εισαγωγής ορισµού παράγεται το νέο ζεύγος (P k+1, D k+1 ) της ακολουθίας µετασχηµατισµών ως εξής : Το P k+1 παράγεται από το P k εάν προσθέσουµε τις προτάσεις S. P k+1 = P k S Το D k+1 παράγεται από το D k εάν προσθέσουµε τις προτάσεις S. D k+1 = D k S Παράδειγµα Έστω το αρχικό πρόγραµµα P 0 ={C1, C2, C3} και D 0 =. C1: subseq( [], X S ). C2: subseq( [X X S ], [Χ Y S ] ) subseq( X S, Y S ). C3: subseq( [X X S ], [Y Y S ] ) subseq( [X X S ], Y S ). Πρόγραµµα 3.1 : Παράδειγµα νέου ορισµού, Πρόγραµµα P 0 Το κατηγόρηµα subseq(l1,l2) είναι αληθές εάν τα στοιχεία της λίστας L1 υπάρχουν µε την ίδια σειρά στη λίστα L2, όχι κατ ανάγκη σε διαδοχικές θέσεις. Συγκεκριµένα, στους στόχους που ακολουθούν λαµβάνουµε τις εξής απαντήσεις: 1. "?- subseq( [a,b,c], [d,a,b,c] ). " η Prolog επιστρέφει yes. 2. "?- subseq( [d,e,f], [a,b,c] )." η Prolog επιστρέφει no. 3. "?- subseq( [d,a,b,c], [a,b,c] ). " η Prolog επιστρέφει no. Η εφαρµογή του κανόνα εισαγωγής ορισµού πραγµατοποιείται όταν στο παραπάνω πρόγραµµα προστεθεί η πρόταση : C4: csub(x S, Y S, Z S ) subseq(x S, Y S ), subseq(x S, Z S ). Το κατηγόρηµα csub(x S,Y S,Z S ) είναι αληθές εάν η λίστα (ακολουθία) X S είναι υπολίστα (υποακολουθία) της λίστας (ακολουθίας) Y S και της λίστας (ακολουθίας) Z S. Από τον µετασχηµατισµό αυτό προκύπτει το πρόγραµµα P 1 και ο νέος ορισµός D 1 : P 1 = {C1, C2, C3, C4}, D 1 ={C4} Η προσθήκη νέου ορισµού εµπλουτίζει την διαδικασία επίλυσης του προβλήµατος για το οποίο έχει σχεδιαστεί το πρόγραµµα. Είναι προφανές ότι η κεφαλή της πρότασης του νέου ορισµού δεν πρέπει να υπάρχει ήδη στο αρχικό πρόγραµµα, καθώς ο νέος ορισµός θα πρέπει να περιγράφει µια πραγµατικά νέα σχέση. Αντίθετα, το σώµα του πρέπει να αποτελείται από κατηγορήµατα που έχουν ήδη οριστεί στο πρόγραµµα, ώστε να επιτυγχάνεται η λογική συνοχή του µε το αρχικό πρόγραµµα. 3.3 Κανόνας Ανάπτυξης (Unfolding Rule) Η εφαρµογή του κανόνα µετασχηµατισµού ανάπτυξης αναπτύσσει τις προτάσεις ενός προγράµµατος µε την βοήθεια µιας συγκεκριµένης πρότασης. Η ορθότητα/εγκυρότητα του µετασχηµατισµού ανάπτυξης αποδυκνύεται στα άρθρα [Tamaki and Sato, 1984], [Pettorossi and Proietti, 1998] και [Pettorossi and Proietti, 1999]. Η περιγραφή του µετασχηµατισµού ανάπτυξης είναι η εξής: Έστω C µια µετονοµασµένη πρόταση στο πρόγραµµα P k της µορφής : C: H G 1, A, G 2 9

όπου A είναι ατοµικός τύπος του οποίου το κατηγόρηµα δεν ανήκει στο σύνολο {true,false,=}, G 1 και G 2 είναι (πιθανόν άδειοι) στόχοι. Έστω E 1,..., E n µε n 0 προτάσεις του P k τέτοιες ώστε το A είναι ταυτοποιήσιµο µε την κεφαλή κάθε E i για i = 1,,n µε πλέον γενικό ταυτοποιητή (πγτ) θ i. Έστω C i η πρόταση (H G 1, bd(e i ), G 2 )θ i για i = 1,...,n όπου bd(e i ) παριστά το σώµα της πρότασης E i : C i : (H G 1, bd(e i ), G 2 )θ i Η ανάπτυξη (unfolding) της πρότασης C στον ατοµικό τύπο A χρησιµοποιώντας τις προτάσεις E 1,...,E n παράγει τις προτάσεις C 1,..., C n και για i=1,..,n έχουµε ότι C C i. Το πρόγραµµα P k+1 παράγεται εάν αντικαταστήσουµε την πρόταση C στο πρόγραµµα P k µε τις προτάσεις C 1,...,C n. ηλαδή, P k+1 = { P k - {C} } { C 1,..., C n } Σηµείωση : Η εφαρµογή του κανόνα ανάπτυξης στην πρόταση C του προγράµµατος P k διαγράφει την πρόταση C από το P k. Μερικές φορές στην βιβλιογραφία αυτό αντιµετωπίζεται σαν ένας επιπλέον κανόνας. Σχηµατικά, ο µετασχηµατισµός ανάπτυξης µπορεί να παρασταθεί ως: C: H G 1,A,G 2 Η 1 R 1,,H n R n...... A=θ 1 Η 1,..., A=θ n Η n...... {(H G 1,R 1,G 2 ) θ 1,...,( H G 1,R n,g 2 ) θ n } Σχήµα 3.1 : Σχηµατική παράσταση κανόνα µετασχηµατισµού ανάπτυξης Παράδειγµα Σε συνέχεια του προγράµµατος P 1, εφαρµόζουµε τον κανόνα µετασχηµατισµού ανάπτυξης, αναπτύσσοντας την πρόταση C4 στις προτάσεις του προγράµµατος P 1 ={C1, C2, C3, C4}, D 1 ={C4}. C1: subseq( [], X S ). C2: subseq( [X X S ], [Χ Y S ] ) subseq( X S, Y S ). C3: subseq( [X X S ], [Y Y S ] ) subseq( [X X S ], Y S ). C4: csub(x S, Y S, Z S ) subseq(x S, Y S ), subseq(x S, Z S ). Πρόγραµµα 3.2 : Πρόγραµµα P 1 10

Η ταυτοποίηση του όρου subseq(x S, Y S ) της πρότασης C4 µε κάθε ένα από τα κεφάλια των προτάσεων C1, C2, C3, επιστρέφει τα εξής: θ 0 1 = unify( subseq(x S,Y S ), subseq([],x S 1 ) = { X S /[], Y S /X S 1 } θ 0 2 = unify( subseq(x S,Y S ), subseq([x 2 X S 2 ] [X 2 Y S 2 ]) = { X S /[X 2 X S 2 ], Y S /[X 2 Y S 2 ] } θ 0 3 = unify( subseq(x S,Y S ), subseq([x 3 X S 3 ],[Y 3 Y S 3 ]) = { X S /[X 3 X S 3 ], Y S /[Y 3 Y S 3 ] } Αντικαθίσταται ο στοιχειώδης τύπος subseq(x S, Y S ) στην πρόταση C4 µε τα σώµατα των προτάσεων C1, C2 και C3 διαδοχικά. ηµιουργούνται οι προτάσεις C5, C6 και C7 αντίστοιχα. Οι τελικές προτάσεις προκύπτουν µετά την εφαρµογή των αντικαταστάσεων θ 0 1, θ 0 2 και θ 0 3. C5: ( csub(x S, Y S, Z S ) subseq(x S, Z S ) ) θ 0 1 ή ισοδύναµα C5: csub([ ], Y S, Z S ) subseq([ ], Z S ). C6: ( csub(x S, Y S, Z S ) subseq(x S 2, Y S 2 ), subseq(x S, Z S ) ) θ 0 2 ή ισοδύναµα C6: csub([x X S ], [X Y S ], Z S ) subseq(x S, Y S ), subseq([x X S ], Z S ). C7: (csub(x S, Y S, Z S ) subseq([x 3 X S 3 ], Y S 3 ), subseq(x S, Z S ) ) θ 0 3 ή ισοδύναµα C7: csub([x X S ], [Y Y S ], Z S ) subseq([x X S ], Y S ), subseq([x X S ], Z S ). Το νέο πρόγραµµα τελικά είναι P 2 ={C1, C2, C3, C5, C6, C7} και το σύνολο νέων ορισµών D 2 ={C4}. 3.4 Κανόνας Πτύξης (Folding Rule) Πτύξη (folding) είναι µια τεχνική µετασχηµατισµού προγραµµάτων η οποία είναι βασικά η αντίστροφη της ανάπτυξης (unfolding). Το αποτέλεσµα κάθε απλού βήµατος πτύξης είναι η εξαγωγή ενός νέου κανόνα από τους υπάρχοντες κανόνες. Ο παραγόµενος κανόνας αντικαθιστά στο καινούργιο πρόγραµµα τους κανόνες από τους οποίους παράχθηκε. Η ορθότητα του µετασχηµατισµού πτύξης αποδυκνύεται στα άρθρα [Tamaki and Sato, 1984], [Pettorossi and Proietti, 1998], [Pettorossi and Proietti, 1999]. Ο ορισµός της πτύξης περιγράφεται ως εξής: Έστω C 1,...,C n προτάσεις στο πρόγραµµα P k. Έστω D 1,...,D n προτάσεις στο D k της εξής µορφής αντίστοιχα: D 1 : newp(x 1,...,X h ) Body 1... D n : newp(x 1,...,X h ) Body n Έστω D 1,...,D n ο ορισµός του newp στο D k. Υποθέτουµε ότι υπάρχουν δυο στόχοι G 1 και G 2 και µια αντικατάσταση θ τέτοια ώστε για i=1,...,n οι εξής δυο συνθήκες ισχύουν: 11

1. Κάθε πρόταση C i (1 i n) είναι παραλλαγή (variant) της πρότασης H G 1, Body i θ, G 2 2. Για κάθε µεταβλητή X της πρότασης D i (1 i n) για την οποία ισχύει X {X 1,..., X h }, έχουµε τα εξής : a. Xθ είναι µια µεταβλητή η οποία δεν υπάρχει στα H, G 1, G 2 b. Xθ δεν υπάρχει στο Yθ, για κάθε µεταβλητή Y η οποία υπάρχει στο Body i και η οποία είναι διαφορετική από την X (X Y). Η πτύξη (folding) των προτάσεων C 1,...,C n χρησιµοποιώντας τις προτάσεις D 1,...,D n παράγει την πρόταση E όπου E : H G 1, newp(x 1,..., X h )θ, G 2 Για i = 1,...,n έχουµε C i E. Το πρόγραµµα P k+1 παράγεται από το πρόγραµµα P k εάν αντικαταστήσουµε τις προτάσεις C 1,...,C n στο P k µε την πρόταση E. ηλαδή P k+1 = { P k - {C 1,...,C n } } {E} Σχηµατικά ο κανόνας µετασχηµατισµού πτύξης θα µπορούσε να παρασταθεί ως: Προτάσεις του P k C 1 : H G 1, Body 1 θ, G 2...... C n : H G 1, Body n θ, G 2 Προτάσεις του D k D 1 : newp(x 1,...,X h ) Body 1...... D n : newp(x 1,...,X h ) Body n Πτύξη E: H G1, newp(x 1,...,X n )θ, G2 Σχήµα 3.2 : Σχηµατική παράσταση κανόνα µετασχηµατισµού πτύξης Παράδειγµα Έστω το αρχικό πρόγραµµα P = {C1, C2} και D = {D1, D2} [Pettorossi and Proietti, 2000]: C1: p(x) q(t(x),y), r(y). C2: p(x) s(x,y), r(y). D1: a(u,v) q(t(u),v). D2: a(u,v) s(u,v). 12

Πρόγραµµα 3.3 : Παράδειγµα πτύξης, P={C1, C2}, D={D1, D2} Στο παραπάνω πρόγραµµα µετασχηµατίζουµε τις προτάσεις γ1 = {C1, C2} του προγράµµατος P, χρησιµοποιώντας τις προτάσεις γ = {D1, D2}από το σύνολο D των νέων ορισµών, παράγοντας το σύνολο γ2 = {C}. γ 1 γ γ 2 Αρχικά µετονοµάζουµε τις προτάσεις του γ : D1 = rename(d1): a(u 1,V 1 ) q(t(u 1 ),V 1 ). D2 = rename(d2): a(u 2,V 2 ) s(u 2,V 2 ). Ταυτοποιούµε τις προτάσεις του γ1 µε τις µετονοµασµένες προτάσεις του γ : θ 1 = unify(q(t(u 1 ),V 1 ), q(t(x),y)) = {U 1 /X, V 1 /Y} θ 2 = unify(s(u 2,V 2 ), s(x,y)) = {U 2 /X, V 2 /Y} Εφαρµόζουµε τον µετασχηµατισµό πτύξης : fold C1: p(x) a(u 1,V 1 ) θ 1, r(y). ή C1: p(x) a(x,y), r(y). fold C2: p(x) a(u 2,V 2 ) θ 2, r(y). ή C2: p(x) a(x,y), r(y). Οι προτάσεις C1 και C2 είναι variants. ηλαδή ισχύει, σ1,σ2 C1 = C2 σ1 και C2 = C1 σ2. Αντικαθιστούµε τις προτάσεις C1 και C2 µε την πρόταση C. C : p(x) a(x,y), r(y). Σηµείωση1 : a(u 1,V 1 ) θ = a(u 2,V 2 ) θ =a(x,y) Σηµείωση2 : Εάν εφαρµόσουµε τον µετασχηµατισµό ανάπτυξης στην πρόταση C χρησιµοποιώντας τις προτάσεις D1, D2 θα πρέπει να πάρουµε τις αρχικές προτάσεις C1, C2. Παράδειγµα Το πρόγραµµα µας P 2 µετά την εφαρµογή του κανόνα µετασχηµατισµού ανάπτυξης είναι όπως φαίνεται στο πρόγραµµα 4.4 : C1: subseq([], X S ). C2: subseq([x X S ], [Y Y S ]) subseq(x S, Y S ). C3: subseq([x X S ], [Y Y S ]) subseq([x X S ], Y S ). C5: csub([ ], Y S, Z S ) subseq([ ], Z S ). C6: csub([x X S ], [X Y S ], Z S ) subseq(x S, Y S ), subseq([x X S ], Z S ) C7: csub([x X S ], [Y Y S ], Z S ) subseq([x X S ], Y S ), subseq([x X S ], Z S ). 13

Πρόγραµµα 3.4 : Παράδειγµα πτύξης στο πρόγραµµα P 2 Ένα παράδειγµα εφαρµογής του κανόνα µετασχηµατισµού πτύξης στο παραπάνω πρόγραµµα είναι η πτύξη της πρότασης C7 χρησιµοποιώντας την πρόταση C4 από το D2. C4: csub(x S, Y S, Z S ) subseq(x S, Y S ), subseq(x S, Z S ). Από τις ταυτοποιήσεις των δύο προτάσεων, προκύπτουν τα εξής: θ 1 1 = unify( subseq([x X S ], Y S ), subseq(x S 1, Y S 1 )) = { X S 1 /[X X S ], Y S /Y S 1 } θ 1 2 = unify( subseq([x X S ], Z S ), subseq(x S 1, Z S 1 )) = { X S 1 /[X X S ], Z S /Z S 1 } Η σύνθεσή των θ 1 1 και θ 1 2 µας δίνει: θ 1 1 θ 1 2 = θ = { X S 1 /[X X S ], Y/Y S 1, Z S /Z S 1 } Η εφαρµογή της αντικατάστασης θ στο csub(x S 1, Y S 1, Z S 1 ) έχει ως αποτέλεσµα την καινούργια πρόταση C8: C8: csub( [X X S ], [Y Y S ], Z S ) csub(x S 1, Y S 1, Z S 1 )θ ή ισοδύναµα C8: csub( [X X S ], [Y Y S ], Z S ) csub([x X S ], Y S, Z S ). Έτσι προκύπτει το νέο πρόγραµµα P 3 = {C1, C2, C3, C5, C6, C8} και το σύνολο των νέων ορισµών D 3 = {C4}. 3.5 Παράδειγµα διαδοχικής εφαρµογής των κανόνων Εισαγωγής Ορισµού, Ανάπτυξης και Πτύξης Έστω το αρχικό πρόγραµµα P 0 = {C1, C2, C3, C4, C5, C6, C7, C8} και D 0 =. C1: sum(x1,x2) p0(x1), p1(x1,x2). C2: sum(x1,x2) not p0(x1), p2(x1,x3,x4), sum(x4,x5), p3(x1,x3,x5,x2). C3: p0(x1) empty_seq(x1). C4: p1(x1,x2) neutral_add_subtr_int(x2). C5: p2(x1,x3,x4) p4(x1,x3,x4), p5(x1,x3,x4). C6: p3(x1,x3,x5,x2) plus_int(x3,x5,x2). C7: p4(x1,x3,x4) head(x1,x3). C8: p5(x1,x3,x4) tail(x1,x4). Πρόγραµµα 3.5 : Παράδειγµα Εισαγωγής Ορισµού Το κατηγόρηµα sum(x1,x2) είναι αληθές εάν X1 είναι µια λίστα από αριθµούς και X2 είναι το άθροισµά τους. Συγκεκριµένα, στους στόχους που ακολουθούν λαµβάνουµε τις εξής απαντήσεις: 1.?- sum([5, 0, 3, -7, 10],X2). η Prolog επιστρέφει X2 = 5. 2.?- sum([30, -20, 105, 33],X2). η Prolog επιστρέφει X2 = 148. 14

Εφαρµογή του Κανόνα Εισαγωγής Ορισµού Η εφαρµογή του κανόνα µετασχηµατισµού του νέου ορισµού πραγµατοποιείται όταν στο παραπάνω πρόγραµµα προστεθούν οι προτάσεις : C9: p1n1(x2) p1(x1,x2). C10: p3n1(x3,x5,x2) p3(x1,x3,x5,x2). C11: p4n1(x1,x3) p4(x1,x3,x4). C12: p5n1(x1,x4) p5(x1,x3,x4). Από τον µετασχηµατισµό αυτό προκύπτει το πρόγραµµα P 1 και ο νέος ορισµός D 1 : P 1 = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12}, D 1 = {C9, C10, C11, C12} Εφαρµογή του Κανόνα Ανάπτυξης Σε συνέχεια του προγράµµατος P 1, εφαρµόζουµε τον κανόνα µετασχηµατισµού ανάπτυξης, αναπτύσσοντας την πρόταση C9 στις προτάσεις του προγράµµατος P 1 χρησιµοποιώντας τον αντίστοιχο ορισµό του p1/2. C1: sum(x1,x2) p0(x1), p1(x1,x2). C2: sum(x1,x2) not p0(x1), p2(x1,x3,x4), sum(x4,x5), p3(x1,x3,x5,x2). C3: p0(x1) empty_seq(x1). C4: p1(x1,x2) neutral_add_subtr_int(x2). C5: p2(x1,x3,x4) p4(x1,x3,x4), p5(x1,x3,x4). C6: p3(x1,x3,x5,x2) plus_int(x3,x5,x2). C7: p4(x1,x3,x4) head(x1,x3). C8: p5(x1,x3,x4) tail(x1,x4). C9: p1n1(x2) p1(x1,x2). C10: p3n1(x3,x5,x2) p3(x1,x3,x5,x2). C11: p4n1(x1,x3) p4(x1,x3,x4). C12: p5n1(x1,x4) p5(x1,x3,x4). Πρόγραµµα 3.6 : Πρόγραµµα P 1 Η ταυτοποίηση του όρου p1(x1,x2) της πρότασης C9 µε την κεφαλή της µετονοµασµένης πρότασης C4, επιστρέφει τα εξής: C9: p1n1(x2) p1(x1,x2). C4: p1(x3,x4) neutral_add_subtr_int(x4). θ 0 1 = unify( p1(x1,x2), p1(x3,x4) ) = { X1/X3, X2/X4 } Αντικαθίσταται ο στοιχειώδης τύπος p1(x1, Y2) στην πρόταση C9 µε το σώµα της πρότασης C4 δηµιουργώντας την πρόταση C13. Η τελική πρόταση προκύπτει µετά την εφαρµογή της αντικατάστασης θ 0 1. C13: (p1n1(x2) neutral_add_subtr_int(x4)) θ 0 1 ή ισοδύναµα C13: p1n1(x2) neutral_add_subtr_int(x2). 15

Με τον ίδιο τρόπο εφαρµόζουµε τον κανόνα µετασχηµατισµού ανάπτυξης για τις υπόλοιπες προτάσεις του D 1. Το πρόγραµµα µας P 2 µετά την εφαρµογή του κανόνα µετασχηµατισµού ανάπτυξης είναι όπως φαίνεται παρακάτω : C1: sum(x1,x2) p0(x1), p1(x1,x2). C2: sum(x1,x2) not p0(x1), p2(x1,x3,x4), sum(x4,x5), p3(x1,x3,x5,x2). C3: p0(x1) empty_seq(x1). C4: p1(x1,x2) neutral_add_subtr_int(x2). C5: p2(x1,x3,x4) p4(x1,x3,x4), p5(x1,x3,x4). C6: p3(x1,x3,x5,x2) plus_int(x3,x5,x2). C7: p4(x1,x3,x4) head(x1,x3). C8: p5(x1,x3,x4) tail(x1,x4). C13: p1n1(x2) neutral_add_subtr_int(x2). C14: p3n1(x3,x5,x2) plus_int(x3,x5,x2). C15: p4n1(x1,x3) head(x1,x3). C16: p5n1(x1,x4) tail(x1,x4). Πρόγραµµα 3.7 : Πρόγραµµα P 2 Εφαρµογή του Κανόνα Πτυξης Ένα παράδειγµα εφαρµογής του κανόνα µετασχηµατισµού πτύξης στο πρόγραµµα P 2 είναι η πτύξη της πρότασης C1 χρησιµοποιώντας την µετονοµασµένη πρόταση C9 από το D 1. C9: p1n1(x4) p1(x3,x4). Από τη ταυτοποίηση των δύο προτάσεων, παίρνουµε : θ = unify(p1(x1,x2), p1(x3,x4)) = {X1/X3,X2/X4} Η εφαρµογή της αντικατάστασης θ έχει ως αποτέλεσµα την καινούργια πρόταση C17: C17: (sum(x1,x2) p0(x1), p1n1(x4))θ. ή ισοδύναµα : C17: sum(x1,x2) p0(x1), p1n1(x2). 16

4. Κατασκευή Λογικών Προγραµµάτων µε Σχήµατα Προγραµµάτων 4.1 Ανάπτυξη Λογικών Προγραµµάτων µε Βήµατα Πολλών Βελτιώσεων. Μια νέα µέθοδος ανάπτυξης λογικών προγραµµάτων (logic programs) βασισµένη σε σχήµατα τύπων, τρόπων (typed, moded schemata) και τύπους δεδοµένων (data types) προτείνεται στα δηµοσιεύσεις [Marakakis and Gallagher, 1994], [Marakakis, 1997]. Τα κύρια συστατικά αυτής της µεθόδου ανάπτυξης λογικών προγραµµάτων είναι ο σχεδιασµός κορυφή-βάση (top-down design), τα σχήµατα προγραµµάτων (program schemata), οι τύποι δεδοµένων (data types) και οι τρόποι (modes). Ορισµός 4.1: Σχήµα προγραµµάτων ή σχήµα είναι µια στρατηγική σχεδιασµού αλγορίθµων η οποία δεν εξαρτάται από το πρόβληµα. Ένα σχήµα προγραµµάτων περιέχει ένα σταθερό σύνολο από µέρη ή υποστόχους (subgoals) οι οποίοι έχουν διαφορετική δέσµευση (instantiations) για κάθε πρόβληµα στο οποίο εφαρµόζονται. Αυτή η µέθοδος χρησιµοποιεί µόνο πέντε σχήµατα προγραµµάτων. Αυτό το σύνολο σχηµάτων είναι πολύ εκφραστικό. Κάθε σχήµα αποτελείται από ένα σύνολο σχηµάτων προγραµµατικών τύπων (clause schemata) µαζί µε σχήµατα τύπων και σχήµατα τρόπων για κάθε κατηγόρηµα µεταβλητή (predicate variable) το οποίο βρίσκεται σ' αυτά. Ένας τύπος δεδοµένων αποτελείται από ένα σύνολο από τιµές και ένα σύνολο από πράξεις οι οποίες εφαρµόζονται σ' αυτές τις τιµές. Η επιλογή των τύπων δεδοµένων είναι σηµαντική σ' αυτή τη µέθοδο. Ένα σύνολο από προκατασκευασµένους τύπους δεδοµένων προτείνεται το οποίο αποτελεί τον πυρήνα για τον ορισµό και την υλοποίηση από το χρήστη νέων τύπων δεδοµένων. Οι οριζόµενοι από το χρήστη τύποι δεδοµένων µπορούν να προδιαγραφούν µε βάση τους προκατασκευασµένους τύπους δεδοµένων ή µε άλλους τύπους οι οποίοι έχουν οριστεί εκ των προτέρων. Αυτοί οι τύποι δεδοµένων υλοποιούνται χρησιµοποιώντας αυτή τη µέθοδο. Ο τρόπος κλήσης (call mode) ενός κατηγορήµατος δείχνει πώς δεσµεύονται τα ορίσµατα του όταν καλείται αυτό το κατηγόρηµα. Οι τρόποι σ' αυτή τη µέθοδο υποστηρίζουν την εφαρµογή των πράξεων βελτιώσεως (refinement operations). Ορισµός 4.2: Ας θεωρήσουµε ότι Prog είναι ένα κανονικό λογικό πρόγραµµα (normal logic program) και p είναι ένα κατηγόρηµα µε πληθυκότητα n και σύµβολο κατηγορήµατος p. Το κατηγόρηµα p/n ονοµάζεται µη ορισµένο κατηγόρηµα εάν δεν υπάρχουν προγραµµατικοί τύποι η κεφαλή των οποίων να περιέχει το σύµβολο κατηγορήµατος p. Η διαδικασία κατασκευής ενός λογικού προγράµµατος προχωράει από την κορυφή προς τη βάση µε διαδοχικές βελτιώσεις των µη ορισµένων κατηγορηµάτων. Μια βελτίωση (refinement) αποτελείται είτε από την εφαρµογή ενός σχήµατος προγραµάτων ή από την εισαγωγή µιας πράξης τύπων δεδοµένων και ισότητας. Οι βελτιώσεις µε εφαρµογή σχηµάτων εισάγουν νέα µη ορισµένα κατηγορήµατα. 17

Βελτιώσεις µε εισαγωγή πράξεων τύπων δεδοµένων και ισότητας δεν δηµιουργούν νέα κατηγορήµατα. Αυτές οι βελτιώσεις τερµατίζουν τη διαδικασία των βελτιώσεων στα µονοπάτια του δέντρου βελτιώσεων (refinement tree). Αρχικά, το κατηγόρηµα του πιο υψηλού επιπέδου βελτιώνεται. Στη συνέχεια τα µη ορισµένα κατηγορήµατα τα οποία δηµιουργούνται µε εφαρµογή των σχηµάτων βελτιώνονται µέχρι να οριστούν όλα τα κατηγορήµατα. Η διαδικασία κατασκευής είναι ηµιαυτόµατος. ηλαδή, οι βελτιώσεις εκτελούνται αυτόµατα από το σύστηµα. Ο προγραµµατιστής καθορίζει ένα µη ορισµένο κατηγόρηµα και τη βελτίωση η οποία θα το ορίσει. Επιπλέον, σε βελτιώσεις µε πράξεις τύπων δεδοµένων θα πρέπει να καθορίσει τα ορίσµατα που θα ταυτοποιηθούν από το µη ορισµένο κατηγόρηµα και από την πράξη τύπων δεδοµένων ή την ισότητα η οποία θα το βελτιώσει. Τα προγράµµατα τα οποία κατασκευάζονται µ' αυτή την µέθοδο είναι πολύµορφα και πολυειδή προγράµµατα (polymorphic many-sorted programs). Αυτά τα προγράµµατα ικανοποιούν την συνθήκη της κεφαλής (head condition) και την συνθήκη της διαφάνειας (transparency condition) οι οποίες εξασφαλίζουν ότι δεν χρειάζεται έλεγχος τύπων όταν το πρόγραµµα τρέχει. Τέλος, τα κατασκευαζόµενα προγράµµατα ικανοποιούν δηλωµένους τρόπους εισόδου-εξόδου όταν τρέχουν µε τον συνήθη κανόνα υπολογισµών αριστερά-δεξιά, πρώτα-βάθος (left-right depth-first computation rule). 18

5. Μια Μέθοδος Αυτόµατου Μετασχηµατισµού Λογικών Προγραµµάτων 5.1 Περιγραφή Προβλήµατος Σε αυτό το κεφάλαιο παρουσιάζουµε µια µέθοδο αυτόµατων µετασχηµατισµών λογικών προγραµµάτων τα οποία έχουν υλοποιηθεί µε βάση την µέθοδο [Marakakis and Gallagher, 1994] και [Marakakis, 1997]. Τα προγράµµατα αυτά που κατασκευάζονται µε βάση την µέθοδο [Marakakis and Gallagher, 1994] και [Marakakis, 1997] έχουν δοµηµένη µορφή. Η δοµή των προγραµµάτων αναπαριστά τις σχεδιαστικές αποφάσεις που πάρθηκαν κατά την κατασκευή τους. Επιπρόσθετα, αυτά τα προγράµµατα περιέχουν "αποµονωµένα" ("αχρησιµοποίητα") ορίσµατα λόγω του ηµι-αυτόµατου τρόπου κατασκευής τους. Τα αχρησιµοποίητα ορίσµατα δεν χρησιµοποιούνται σε κανένα υπολογισµό στόχων. Έστω P ένα πρόγραµµα κατασκευασµένο µε βάση την µέθοδο [Marakakis, 1997]. Στο κεφάλαιο αυτό θα παρουσιάσουµε µια µέθοδο αυτόµατου µετασχηµατισµού του P σε ένα ισοδύναµο πρόγραµµα P χωρίς "αποµονωµένα"("αχρησιµοποίητα") ορίσµατα. Κατά την διάρκεια των µετασχηµατισµών σχηµατίζονται και στη συνέχεια αποµακρύνονται κάποιες "άχρηστες" προτάσεις. Επίσης, τα ισοδύναµα προγράµµατα που παράγονται πιθανόν να είναι περισσότερο αποτελεσµατικά και να περιέχουν µικρότερο πλήθος προτάσεων σε σχέση µε τα αρχικά. 5.2 Ακολουθία Μετασχηµατισµών Έστω ότι P 0 είναι ένα αρχικό πρόγραµµα και D 0 είναι το σύνολο των νέων ορισµών, για το οποίο αρχικά ισχύει D 0 =. Μια ακολουθία µετασχηµατισµών (P 0, D 0 ),, (P i, D i ),, (P n, D n ) στο σύστηµά µας κατασκευάζεται από ένα αρχικό πρόγραµµα P 0 µε εφαρµογή των κανόνων µετασχηµατισµού πτύξης(fold), ανάπτυξης(unfold) και εισαγωγής ορισµού (Definition Introduction). Αρχικά το D 0 είναι η άδεια σύζευξη true. Ένα πρόγραµµα P k+1 (0 k n-1) παράγεται ως εξής [Pettorossi and Proietti 2000] : 1. Επιλέγεται µια (πιθανόν άδεια) σύζευξη γ 1 προτάσεων του P k. 2. Επιλέγεται µια (πιθανόν άδεια) σύζευξη γ προτάσεων του P 0 D k. 3. Παράγεται µια νέα σύζευξη γ 2 προτάσεων εφαρµόζοντας ένα κανόνα µετασχηµατισµού στις προτάσεις γ 1 χρησιµοποιώντας τις προτάσεις γ. 4. Γίνεται αντικατάσταση των προτάσεων γ 1 µε τις προτάσεις γ 2 στο P k. Οι κανόνες µετασχηµατισµού, εκτός από την εισαγωγή ορισµού, δηµιουργούν µια σχέση παραγωγής µεταξύ των προτάσεων η οποία δηλώνεται µε το σύµβολο. Εάν οι προτάσεις γ 2 παραχθούν µε κάποιο κανόνα µετασχηµατισµού από τις προτάσεις γ 1 χρησιµοποιώντας τις προτάσεις γ, (γ 1 από κάποια πρόταση του γ 1. γ γ 2 ) τότε κάθε πρόταση του γ 2 παράγεται 19

Ορισµός 5.1 Θεωρούµε το κατηγόρηµα p/m ορίζεται από τις προτάσεις {C 1,..,C k } ως εξής : C 1 : p(x 1,..., X j,..., X m ) Body 1... C k : p(x 1,..., X j,..., X m ) Body k όπου X j (1 j m) είναι το j στο όρισµα και είναι µεταβλητή. Ονοµάζουµε το j στο όρισµα X j, τη µεταβλητή X j, "αποµονωµένη" µεταβλητή εάν υπάρχει σε κάθε πρόταση C i (1 i k) µια φορά. Ας θεωρήσουµε ότι το j στο όρισµα X j είναι ένα "αποµονωµένο" όρισµα. Η κλήση του p(t 1,...t j,..., t m ) µε t j ένα "αποµονωµένο" όρισµα επιτυγχάνει για κάθε t j. "Άχρηστες" προτάσεις είναι προτάσεις που δεν χρησιµοποιούνται όταν τρέχουµε το πρόγραµµα. Η σηµασία τους ορίζεται στο [dewaal and Galagher, 1993] ως εξής: Έστω P ένα αρχικό πρόγραµµα και C P µια πρόταση. Τότε η πρόταση C είναι άχρηστη, εάν για όλους τους στόχους G, η C δεν χρησιµοποιείται σε καµιά απόρριψη του P {G}. Η έννοια της "άχρηστης" πρότασης στη δικιά µας προσέγγιση της µεθόδου µετασχηµατισµού περιγράφεται στον Ορισµό 5.2. ιαφέρει βέβαια πολύ λίγο από τον ορισµό στο [dewaal and Galagher, 1993]. Ορισµός 5.2 Έστω P ένα κανονικό πρόγραµµα κατασκευασµένο µε βάση τη µέθοδο που παρουσιάζεται στο [Marakakis 1997] µε κορυφαίο κατηγόρηµα το p/n. Έστω G ένα σύνολο όλων των κλήσεων του κατηγορήµατος p/n. Έστω C µια πρόταση τέτοια ώστε C P. Η πρόταση C είναι "άχρηστη" πρόταση εάν δεν χρησιµοποιείται σε καµιά απόρριψη P {g} όπου g G. Σ αυτή τη µέθοδο η ακολουθία µετασχηµατισµών δηµιουργείται ως εξής. Έστω ότι το πρόγραµµα P 0 είναι ένα πρόγραµµα που κατασκευάστηκε µε την µέθοδο [Marakakis and Gallagher, 1994] και [Marakakis, 1997]. Το σύνολο των νέων ορισµών D 0 είναι αρχικά άδειο. Η διαδικασία µετασχηµατισµού του προγράµµατος P 0 ξεκινά από τις προτάσεις που περιέχουν κλήσεις σε τύπους δεδοµένων. Οι τύποι δεδοµένων έχουν τα εξής χαρακτηριστικά: 1. Βρίσκονται στο χαµηλότερο επίπεδο της µεθόδου κατασκευής λογικών προγραµµάτων. 2. Είναι τα πιο βασικά δοµικά στοιχεία της µεθόδου κατασκευής λογικών προγραµµάτων [Marakakis, 1997]. 3. Είναι καλά κατασκευασµένα δοµικά στοιχεία. ηλαδή, οι πράξεις των τύπων δεδοµένων έχουν αποτελεσµατική υλοποίηση και δεν περιέχουν «αχρησιµοποίητα» ορίσµατα και «άχρηστες» προτάσεις. ιακρίνουµε τα εξής δύο γενικά βήµατα για την αποµάκρυνση των «αχρησιµοποίητων» ορισµάτων. Βήµα 1 Αρχικά εντοπίζονται οι «αποµονωµένες» µεταβλητές στις προτάσεις του πρόγράµµατος P 0 οι οποίες ορίζονται µόνο µε κατηγορήµατα πράξεων τύπων δεδοµένων. Στη συνέχεια εφαρµόζονται µε την ακόλουθη σειρά οι µετασχηµατισµοί 1) εισαγωγής ορισµού, 2) ανάπτυξης και 3) πτύξης. Κάθε µετασχηµατισµός εφαρµόζεται µια ή περισσότερες φορές ανάλογα µε το πλήθος των κατηγορηµάτων που έχουν εντοπιστεί µε «αποµονωµένες» µεταβλητές. 20

Βήµα 2 Έστω P k το παραγόµενο πρόγραµµα από το βήµα 1. Στη συνέχεια γίνεται έλεγχος για «αποµονωµένες» µεταβλητές µόνο στις προτάσεις του προγράµµατος P k οι οποίες έχουν στο σώµα τους κλήσεις σε κατηγορήµατα τα οποία δηµιουργήθηκαν µε το προηγούµενο βήµα µετασχηµατισµών. Εάν δεν υπάρχουν «αποµονωµένες» µεταβλητές τότε ο µετασχηµατισµός του προγράµµατος έχει ολοκληρωθεί. ιαφορετικά το βήµα 1 επαναλαµβάνεται. 5.3 Η Μέθοδος Επίλυσης του Προβλήµατος Θεωρούµε ότι P 0 είναι ένα πρόγραµµα το οποίο κατασκευάζεται µε βάση την µέθοδο [Marakakis and Gallagher, 1994] και [Marakakis, 1997] και D 0 είναι ένα άδειο σύνολο νέων ορισµών. Υποθέτουµε ότι το κατηγόρηµα p/m στο πρόγραµµα P ορίζεται από ένα σύνολο προτάσεων {C 1,..,C k } της µορφής : C 1 : p(x 1,..., X j,..., X m ) Body 1... C k : p(x 1,..., X j,...,x m ) Body k όπου X j (1 j m) είναι ένα "αποµονωµένο" όρισµα. Σηµείωση: Έστω C µια πρόταση, τότε hd(c) και bd(c) αντιπροσωπεύουν το κεφάλι και το σώµα της πρότασης C αντίστοιχα. Αρχικά, όλα τα κατηγορήµατα και τα αντίστοιχα "αποµονωµένα" ορίσµατα του προγράµµατος P 0 καθορίζονται. Για κάθε κατηγόρηµα p/m µε "αποµονωµένα" ορίσµατα εκτελούµε τα παρακάτω τρία βήµατα. Βήµα 1: Υποθέτουµε ότι X j είναι ένα αποµονωµένο όρισµα στο κατηγόρηµα p(x 1,, X j,..., X m ). Για το κατηγόρηµα p/m δηµιουργείται µια καινούργια πρόταση, C new, της παρακάτω µορφής. C new : p1(x 1,...X j-1,x j+1,...x m ) p(x 1,...,X j,...x m ) Τότε το πρόγραµµα γίνεται P it1 1 = P 0 {C new }. Το σύνολο των νέων ορισµών γίνεται D it1 1 = D 0 {C new }. Βήµα 2: Στη πρόταση C new εφαρµόζεται ο µετασχηµατισµός ανάπτυξης µε τη χρήση του ορισµού του p, i.e. clauses C 1,.., C k. Οι προτάσεις που παράγονται C new 1, C new 2,, C new k φαίνονται παρακάτω : C 1 new : (p1(x 1,..., X j-1, X j+1,..., X m ) Body 1 ) ϑ 1 C 2 new : (p1(x 1,..., X j-1, X j+1,..., X m ) Body 2 ) ϑ 2 21

C k new : (p1(x 1,..., X j-1, X j+1,..., X m ) Body k ) ϑ k όπου ϑ i = πγτ(bd(c new ), hd(c i )) = πγτ(p(x 1,..., X j,..., X m ), p(x i 1,..., X i j,...,x i m)) µε (1 i k). Το καινούργιο πρόγραµµα γίνεται P it1 2 = { P it1 1 {C new } } {C 1 new, C 2 new,, C k new }. Το σύνολο των νέων ορισµών παραµένει αµετάβλητο D it1 2 = D it1 1. Βήµα 3: Εφαρµόζουµε τον µετασχηµατισµό πτύξης στις κλήσεις του κατηγορήµατος p/m στο πρόγραµµα P it1 2 χρησιµοποιώντας την καινούργια πρόταση C new. Έστω C 1,..,C r οι προτάσεις του προγράµµατος P it1 2 που θα εφαρµοστεί η πτύξη µε χρήση της πρότασης C new. Έστω ότι προκύπτουν οι προτάσεις C 1,..,C r. Έτσι, όλες οι κλήσεις του p(t 1,..., t j,..., t m ) στο σώµα (συµπεριλαµβανοµένου και των αρνητικών κλήσεων) των προτάσεων του P it1 3 αντικαθίστανται από το p1(t 1,..., t j-1, t j+1,..., t m ). ηλαδή, τα "αποµονωµένα" ορίσµατα έχουν αφαιρεθεί. Το καινούργιο πρόγραµµα γίνεται P it1 3 = { P it1 2 {C 1,..,C r } } {C 1,..,C r }. Το σύνολο των νέων ορισµών παραµένει αµετάβλητο D it1 3 = D it1 2. Βήµα 4: Σε αυτό το βήµα αναγνωρίζονται οι "άχρηστες" προτάσεις και αποµακρύνονται. "Άχρηστες" θεωρούνται οι προτάσεις οι οποίες έχουν χρησιµοποιηθεί στο βήµα της ανάπτυξης, π.χ οι προτάσεις C 1,,C k. Κάθε κατηγόρηµα που ορίζεται µε βάση την µέθοδο ανάπτυξης λογικών προγραµµάτων που παρουσιάζεται στο [Marakakis97] καλείται µόνο µια φορά, εκτός από τα αναδροµικά κατηγορήµατα. Μετά την εφαρµογή της ανάπτυξης στη κλήση του κατηγορήµατος, οι προτάσεις που ορίζουν το κατηγόρηµα γίνονται "άχρηστες" επειδή κλήσεις για αυτό το κατηγόρηµα δεν γίνονται από καµιά άλλη πρόταση του προγράµµατος. Τέτοιες προτάσεις δεν προσφέρουν τίποτα κατά τον υπολογισµό του προγράµµατος. Κι αυτό γιατί η επεξεργασία του στόχου του κορυφαίου κατηγορήµατος δεν χρησιµοποιεί αυτές τις προτάσεις. Το πρόγραµµά µας γίνεται P it1 4 = P it1 3 {C 1,,C k }. Το σύνολο των νέων ορισµών παραµένει αµετάβλητο D it1 4 = D it1 3. Τώρα, το πρόγραµµα που προκύπτει µετά το τέταρτο βήµα µπορεί να περιέχει επιπρόσθετα "αποµονωµένα" ορίσµατα. Τα παραπάνω τέσσερα βήµατα πρέπει να επαναληφθούν για να αποµακρυνθούν τα καινούργια "αποµονωµένα" ορίσµατα. Τα τέσσερα αυτά βήµατα επαναλαµβάνονται έως ότου το πρόγραµµα που θα προκύψει να µην περιέχει άλλα "αποµονωµένα" ορίσµατα. Τελικά οι αχρησιµοποίητες µεταβλητές εξαλείφονται από το πρόγραµµα. Η αποµάκρυνση των αποµονωµένων ορισµάτων ακολουθείται από την αποµάκρυνση των "άχρηστων" προτάσεων. Αυτή η προσέγγιση έχει τα παρακάτω πλεονεκτήµατα : 1. εν προϋποθέτει οποιαδήποτε γνώση για το ποια κατηγορήµατα είναι "αποµονωµένα". Απλά βασίζεται στη συντακτική ιδιότητα των "αχρησιµοποίητων" ορισµάτων. Συνεπώς, αποφεύγεται το πρόβληµα της απόφασης σχετικά µε το ποιες κλήσεις θα αναπτυχθούν. 2. Αποµακρίνει τα "αποµονωµένα" ορίσµατα από όλους τους στοιχειώδης τύπους, είτε είναι καταργηµένοι είτε όχι. 22

3. Οι "άχρηστες" προτάσεις εντοπίζονται εύκολα χωρίς επιπλέον υπολογισµούς. ηλαδή, δεν είναι απαραίτητο να εφαρµόσουµε πολύπλοκες τεχνικές µετασχηµατισµών για να τις βρούµε. 5.4 Παραδείγµατα Στα παρακάτω παραδείγµατα, τα "αποµονωµένα" ("αχρησιµοποίητα") ορίσµατα για κάθε πρόγραµµα εµφανίζονται σαν λίστα από ζεύγη. Το πρώτο στοιχείο κάθε ζεύγους αποτελείται από το όνοµα του κατηγορήµατος και την πληθυκότητά του ενώ το δεύτερο στοιχείο αποτελείται από µια λίστα µε τα "αχρησιµοποίητα" ορίσµατα του αντίστοιχου κατηγορήµατος. Με βάση τα παραπάνω κάθε ζεύγος θα έχει την εξής µορφή : [(p 1 /n 1, [unused arguments of predicate p 1 ],,[(p k /n k, [unused arguments of predicate p k ]) 5.4.1 Παράδειγµα 1: Άθροιση Στοιχείων Ακολουθίας/Λίστας. Το κατηγόρηµα sum(x1, X2) είναι αληθές εάν X2 είναι το άθροισµα των στοιχείων της λίστας X1. Το παρακάτω πρόγραµµα P 0 για το κατηγόρηµα sum/2 έχει προκύψει µε την µέθοδο που παρουσιάζεται στις δηµοσιεύσεις [Marakakis and Gallagher, 1994] και [Marakakis, 1997]. Οι ορισµοί για τις πράξεις σε τύπους δεδοµένων (data type operations) δεν συµπεριλαµβάνονται στο πρόγραµµα επειδή δεν χρησιµοποιούνται στους µετασχηµατισµούς. Θεωρούνται όµως σαν µέρος του προγράµµατος. Τα "αποµονωµένα" ("αχρησιµοποίητα") ορίσµατα αφαιρούνται στην πρώτη επανάληψη. C1: sum(x1,x2) p0(x1) p1(x1,x2) C2: sum(x1,x2) \+ p0(x1) p2(x1,x3,x4) sum(x4,x5) p3(x1,x3,x5,x2) C3: p0(x1) empty_seq(x1) C4: p1(x1,x2) neutral_add_subtr_int(x2) C5: p2(x1,x3,x4) p4(x1,x3,x4) p5(x1,x3,x4) C6: p3(x1,x3,x5,x2) plus_int(x3,x5,x2) C7: p4(x1,x3,x4) head(x1,x3) C8: p5(x1,x3,x4) tail(x1,x4) Πρόγραµµα 5.1 : Αρχικό πρόγραµµα sum(x,y) Πρόγραµµα P 0 = {C1, C2, C3, C4, C5, C6, C7, C8}. Νέοι Ορισµοί D 0 = {} 1η Επανάληψη Βήµα 1: Εισαγωγή ορισµών. Βρίσκουµε τα "αποµονωµένα" ορίσµατα για το πρόγραµµα P 0. ηµιουργούµε την παρακάτω λίστα [(p1/2, [X1]), (p3/4, [X1]), (p4/3, [X4]), (p5/3, [X3])]. Ορίζουµε τις προτάσεις νέων ορισµών για κάθε κατηγόρηµα µε "αποµονωµένα" ορίσµατα. C9: pn1(x2) p1(x1,x2) C10: pn2(x3, X5, X2) p3(x1,x3,x5,x2) C11: pn3(x1,x3) p4(x1,x3,x4) C12: pn4(x1,x4) p5(x1,x3,x4) 23

Πρόγραµµα: P it1 1 = P 0 {C9, C10, C11, C12} = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12}. Νέοι Ορισµοί: D it1 1 = D 0 {C9, C10, C11, C12} = {C9, C10, C11, C12}. Βήµα 2: Ανάπτυξη. Αναπτύσσουµε τις προτάσεις C9, C10, C11 και C12 στους στοιχειώδης τύπους p1(x1,x2), p3(x1,x3,x5,x2), p4(x1,x3,x4) και p5(x1,x3,x4) αντίστοιχα, χρησιµοποιώντας τους αντίστοιχους ορισµούς των κατηγορηµάτων p1/2, p3/4, p4/3 και p5/3, π.χ τις προτάσεις C4, C6, C7 και C8. Οι προτάσεις πρέπει να προέρχονται από το P 0 Def k. unfold(c9, C4) C13: pn1(x2 ) neutral_add_subtr_int(x2 ) unfold(c10, C6) C14: pn2(x3,x5,x1 ) plus_int(x3,x5,x2 ) unfold(c11, C7) C15 : pn3(x1,x3 ) head(x1,x3 ) unfold(c12,c8) C16: pn4(x1,x4 ) tail(x1,x4 ) Πρόγραµµα: P it1 2 = P it1 1 {C9, C10, C11, C12} {C13, C14, C15, C16} = {C1, C2, C3, C4, C5, C6, C7, C8, C13, C14, C15, C16} Νέοι Ορισµοί: D it1 2 = D it1 1 Βήµα 3: Πτύξη. Εφαρµόζουµε το µετασχηµατισµό πτύξης στις κλήσεις των p1/2, p3/4, p4/3, p5/3 χρησιµοποιώντας τις προτάσεις των νέων ορισµών C9, C10, C11 και C12 αντίστοιχα. fold(c1, C9) C17: sum(x1, X2) p0(x1) pn1(x2) fold(c2, C10) C18: sum(x1, X2) \+ p0(x1) p2(x1,x3,x4) sum(x4,x5) pn2(x3,x5,x2) fold(c5, C11) C19: p2(x1,x3,x4) pn3(x1,x3) p5(x1,x3,x4) fold(c19, C12) C20: p2(x1,x3,x4) pn3(x1,x3) pn4(x1,x4) Πρόγραµµα: P it1 3 = P it1 2 {C17, C18, C19} - {C1, C2, C5} {C20} {C19 } = {C3, C4, C6, C7, C8, C13, C14, C15, C16, C17, C18, C20} Νέοι Ορισµοί: D it1 3 = D it1 2 Βήµα 4: ιαγραφή "άχρηστων" προτάσεων. Οι άχρηστες προτάσεις είναι αυτές που έχουν χρησιµοποιηθεί στο βήµα της ανάπτυξης, π.χ, {C4, C6, C7, C8}. Οι προτάσεις αυτές δεν καλούνται πουθενά στο πρόγραµµα. C4 : p1(x1,x2) neutral_add_subtr_int(x2) C6: p3(x1,x3,x5,x2) plus_int(x3,x5,x2) C7: p4(x1,x3,x4) head(x1,x3) 24

C8: p5(x1,x3,x4) tail(x1,x4) Πρόγραµµα :P it1 4 = P it1 3 {C4, C6, C7, C8} = {C3, C13, C14, C15, C16, C17, C18, C20} Νέοι Ορισµοί: D it1 4 = D it1 3 Το πρόγραµµα P it1 4 προκύπτει από την πρώτη επανάληψη της διαδικασίας µετασχηµατισµού. Αυτή η επανάληψη είναι και η τελευταία, επειδή το πρόγραµµα P it1 4 που προκύπτει δεν περιέχει "αποµονωµένα" ορίσµατα,. Οπότε P it1 4 = P final. Πρόγραµµα P it1 4 = P final : C3: p0(x1) empty_seq(x1) C13: pn1(x2) neutral_add_subtr_int(x2) C14 : pn2(x3,x5,x2) plus_int(x3,x5,x2). C15 : pn3(x1,x3) head(x1,x3) C16: pn4(x1,x4) tail(x1,x4) C17: sum(x1,x2) p0(x1) pn1(x2) C18: sum(x1,x2) \+ p0(x1) p2(x1,x3,x4) sum(x4,x5) pn2(x3,x5,x2) C20: p2(x1,x3,x4) pn3(x1,x3) pn4(x1,x4) Πρόγραµµα 5.2 : Τελικό µετασχηµατισµένο πρόγραµµα sum(x,y) 5.4.2 Παράδειγµα 2: Εύρεση του Μέγιστου Στοιχείου Ακολουθίας/Λίστας. Το κατηγόρηµα max_seq(x1, X2) είναι αληθές εαν X2 είναι το µεγαλύτερο από τα στοιχεία της λίστας X1. Το παρακάτω πρόγραµµα P 0 για το κατηγόρηµα max_seq/2 έχει προκύψει από τη µέθοδο που περιγράφεται στις δηµοσιεύσεις [Marakakis and Gallagher, 1994] και [Marakakis, 1997]. Οι ορισµοί των πράξεων σε τύπους δεδοµένων (data type operations) δεν συµπεριλαµβάνονται στο πρόγραµµα επειδή δεν χρησιµοποιούνται στους µετασχηµατισµούς. Θεωρούνται όµως σαν µέρος του προγράµµατος. C1: max_seq(x1,x3) p0(x1) p1(x1,x3) C2: max_seq(x1,x3) \+ p0(x1) p2(x1,x4,x5) max_seq(x5,x6) p3(x1,x4,x6,x3) C3: p0(x1) p4(x1,x2) p5(x1,x2) C4: p1(x1,x3) p6(x1,x7,x3) p7(x1,x7,x3) C5: p2(x1,x4,x5) p8(x1,x4,x5) p9(x1,x4,x5) C6: p3(x1,x4,x6,x3) p10(x1,x4,x6,x3) C7: p3(x1,x4,x6,x3) p11(x1,x4,x6,x3) C8: p4(x1,x2) tail(x1,x2) C9: p5(x1,x2) empty_seq(x2) C10: p6(x1,x7,x3) head(x1,x7) C11: p7(x1,x7,x3) eq(x7,x3) C12: p8(x1,x4,x5) head(x1,x4) C13: p9(x1,x4,x5) tail(x1,x5) C14: p10(x1,x4,x6,x3) p12(x1,x4,x6,x3) p13(x1,x4,x6,x3) C15: p11(x1,x4,x6,x3) p14(x1,x4,x6,x3) p15(x1,x4,x6,x3) C16: p12(x1,x4,x6,x3) ge_int(x4,x6) C17: p13(x1,x4,x6,x3) eq(x3,x4) 25

C18: p14(x1,x4,x6,x3) le_int(x4,x6) C19: p15(x1,x4,x6,x3) eq(x3,x6) Πρόγραµµα 5.3 : Αρχικό πρόγραµµα max_seq(x,y) Πρόγραµµα: P 0 = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19}. Νέοι Ορισµοί: D 0 = {} 1η Επανάληψη Βήµα 1: Εισαγωγή ορισµών. Τα "αποµονωµένα" ορίσµατα για το πρόγραµµα P 0 είναι τα παρακάτω. [(p5/2, [X1]), (p6/3, [X3]), (p7/3, [X1]), (p8/3, [X5]), (p9/3, [X4]), (p12/4, [X1,X3]), (p13/4, [X1,X6]), (p14/4, [X1,X3]), (p15/4,[x1,x4])]. Ορίζουµε τις προτάσεις νέων ορισµών για κάθε κατηγόρηµα µε "αποµονωµένα" ορίσµατα. C20: pn5(x2) p5(x1,x2) C21: pn6(x1,x7) p6(x1,x7,x3) C22: pn7(x7,x3) p7(x1,x7,x3) C23: pn8(x1,x4) p8(x1,x4,x5) C24: pn9(x1,x5) p9(x1,x4,x5) C25: pn1(x4,x6) p12(x1,x4,x6,x3) C26: pn2(x4,x3) p13(x1,x4,x6,x3) C27: pn3(x4,x6) p14(x1,x4,x6,x3) C28: pn4(x6,x3) p15(x1,x4,x6,x3) Πρόγραµµα: P it1 1 = P 0 {C20, C21, C22, C23, C24, C25, C26, C27, C28} = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19} {C20, C21, C22, C23, C24, C25, C26, C27, C28} = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26, C27, C28} Νέοι Ορισµοί: D it1 1 = D 0 {C20, C21, C22, C23, C24, C25, C26, C27, C28} = {C20, C21, C22, C23, C24, C25, C26, C27, C28} C1: max_seq(x1,x3) p0(x1) p1(x1,x3) C2: max_seq(x1,x3) \+ p0(x1) p2(x1,x4,x5) max_seq(x5,x6) p3(x1,x4,x6,x3) C3: p0(x1) p4(x1,x2) p5(x1,x2) C4: p1(x1,x3) p6(x1,x7,x3) p7(x1,x7,x3) C5: p2(x1,x4,x5) p8(x1,x4,x5) p9(x1,x4,x5) C6: p3(x1,x4,x6,x3) p10(x1,x4,x6,x3) C7: p3(x1,x4,x6,x3) p11(x1,x4,x6,x3) C8: p4(x1,x2) tail(x1,x2) C9: p5(x1,x2) empty_seq(x2) C10: p6(x1,x7,x3) head(x1,x7) C11: p7(x1,x7,x3) eq(x7,x3) C12: p8(x1,x4,x5) head(x1,x4) C13: p9(x1,x4,x5) tail(x1,x5) C14: p10(x1,x4,x6,x3) p12(x1,x4,x6,x3) p13(x1,x4,x6,x3) 26

C15: p11(x1,x4,x6,x3) p14(x1,x4,x6,x3) p15(x1,x4,x6,x3) C16: p12(x1,x4,x6,x3) ge_int(x4,x6) C17: p13(x1,x4,x6,x3) eq(x3,x4) C18: p14(x1,x4,x6,x3) le_int(x4,x6) C19: p15(x1,x4,x6,x3) eq(x3,x6) C20: pn5(x2) p5(x1,x2) C21: pn6(x1,x7) p6(x1,x7,x3) C22: pn7(x7,x3) p7(x1,x7,x3) C23: pn8(x1,x4) p8(x1,x4,x5) C24: pn9(x1,x5) p9(x1,x4,x5) C25: pn1(x4,x6) p12(x1,x4,x6,x3) C26: pn2(x4,x3) p13(x1,x4,x6,x3) C27: pn3(x4,x6) p14(x1,x4,x6,x3) C28: pn4(x6,x3) p15(x1,x4,x6,x3) Βήµα 2: Ανάπτυξη. Αναπτύσσουµε τις προτάσεις C20, C21, C22, C23, C24, C25, C26, C27 και C28 στους στοιχειώδης τύπους p5(x1,x2), p6(x1,x7,x3), p7(x1,x7,x3), p8(x1,x4,x5), p9(x1,x4,x5), p12(x1,x4,x6,x3), p13(x1,x4,x6,x3), p14(x1,x4,x6,x3) και p15(x1,x4,x6,x3) αντίστοιχα, χρησιµοποιώντας τους αντίστοιχους ορισµούς των κατηγορηµάτων p5/2, p6/3, p7/3, p8/3, p9/3, p12/4, p13/4, p14/4 and p15/4. unfold(c20, C9) C29: pn5(x2) empty_seq(x2) unfold(c21, C10) C30: pn6(x1,x7) head(x1,x7) unfold(c22, C11) C31 : pn7(x7,x3) eq(x7,x3) unfold(c23,c12) C32: pn8(x1,x4) head(x1,x4) unfold(c24,c13) C33: pn9(x1,x5) tail(x1,x5) unfold(c25,c16) C34: pn1(x4,x6) ge_int(x4,x6) unfold(c26,c17) C35: pn2(x4,x3) eq(x3,x4) unfold(c27,c18) C36: pn3(x4,x6) le_int(x4,x6) unfold(c28,c19) C37: pn4(x6,x3) eq(x3,x6) Πρόγραµµα: P it1 2 = P it1 1 {C20, C21, C22, C23, C24, C25, C26, C27, C28} {C29, C30, C31, C32, C33, C34, C35, C36, C37} = C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26, C27, C28} {C20, C21, C22, C23, C24, C25, C26, C27, C28} {C29, C30, C31, C32, C33, C34, C35, C36, C37} = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C29, C30, C31, C32, C33, C34, C35, C36, C37} Νέοι Ορισµοί: D it1 2 = D it1 1 27

C1: max_seq(x1,x3) p0(x1) p1(x1,x3) C2: max_seq(x1,x3) \+ p0(x1) p2(x1,x4,x5) max_seq(x5,x6) p3(x1,x4,x6,x3) C3: p0(x1) p4(x1,x2) p5(x1,x2) C4: p1(x1,x3) p6(x1,x7,x3) p7(x1,x7,x3) C5: p2(x1,x4,x5) p8(x1,x4,x5) p9(x1,x4,x5) C6: p3(x1,x4,x6,x3) p10(x1,x4,x6,x3) C7: p3(x1,x4,x6,x3) p11(x1,x4,x6,x3) C8: p4(x1,x2) tail(x1,x2) C9: p5(x1,x2) empty_seq(x2) C10: p6(x1,x7,x3) head(x1,x7) C11: p7(x1,x7,x3) eq(x7,x3) C12: p8(x1,x4,x5) head(x1,x4) C13: p9(x1,x4,x5) tail(x1,x5) C14: p10(x1,x4,x6,x3) p12(x1,x4,x6,x3) p13(x1,x4,x6,x3) C15: p11(x1,x4,x6,x3) p14(x1,x4,x6,x3) p15(x1,x4,x6,x3) C16: p12(x1,x4,x6,x3) ge_int(x4,x6) C17: p13(x1,x4,x6,x3) eq(x3,x4) C18: p14(x1,x4,x6,x3) le_int(x4,x6) C19: p15(x1,x4,x6,x3) eq(x3,x6) C29: pn5(x2) empty_seq(x2) C30: pn6(x1,x7) head(x1,x7) C31: pn7(x7,x3) eq(x7,x3) C32: pn8(x1,x4) head(x1,x4) C33: pn9(x1,x5) tail(x1,x5) C34: pn1(x4,x6) ge_int(x4,x6) C35: pn2(x4,x3) eq(x3,x4) C36: pn3(x4,x6) le_int(x4,x6) C37: pn4(x6,x3) eq(x3,x6) Βήµα 3: Πτύξη. Εφαρµόζουµε το µετασχηµατισµό πτύξης στις κλήσεις των p5/2, p6/3, p7/3, p8/3, p9/3, p12/4, p13/4, p14/4, p15/4 χρησιµοποιώντας τις προτάσεις των νέων ορισµών C20, C21, C22, C23, C24, C25, C26, C27 και C28 αντίστοιχα. fold(c3, C20) C38: p0(x1) p4(x1,x2) pn5(x2) fold(c4, C21) C39: p1(x1,x3) pn6(x1,x7) p7(x1,x7,x3) fold(c39, C22) C40: p1(x1,x3) pn6(x1,x7) pn7(x7,x3) fold(c5, C23) C41: p2(x1,x4,x5) pn8(x1,x4) p9(x1,x4,x5) fold(c41, C24) C42: p2(x1,x4,x5) pn8(x1,x4) pn9(x1,x5) fold(c14, C25) C43: p10(x1,x4,x6,x3) pn1(x4,x6) p13(x1,x4,x6,x3) fold(c43, C26) 28