ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220...

85
ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗ ΘΕΜΑ: «Η PROLOG ΩΣ ΓΛΩΣΣΑ ΑΝΑΚΤΗΣΗΣ ΠΛΗΡΟΦΟΡΙΩΝ ΑΠΟ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ» ΣΠΟΥΔΑΣΤΗΣ: ΖΑΡΠΑΣ ΝΙΚΟΛΑΟΣ Α.Μ. 220 [email protected] ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ [email protected] Τ. Ε. Ι. ΚΑΒΑΛΑΣ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΠΛΗΡΟΦΟΡΙΩΝ ΚΑΒΑΛΑ 2005

Transcript of ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220...

Page 1: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗ

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

ΣΠΟΥΔΑΣΤΗΣ: ΖΑΡΠΑΣ ΝΙΚΟΛΑΟΣ Α.Μ. 220 [email protected]

ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ [email protected]

Τ. Ε. Ι. ΚΑΒΑΛΑΣ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ

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

ΚΑΒΑΛΑ 2005

Page 2: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΠΕΡΙΕΧΟΜΕΝΑ ΕΝΟΤΗΤΑ 1 ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

1.1 ΙΣΤΟΡΙΚΗ ΑΝΑΔΡΟΜΗ…………………………………………..2 1.2 ΓΕΝΙΚΑ……………………………………….…………………….3 1.3 Η ΠΡΩΤΗ ΕΠΑΦΗ………………………………………………...5

ΕΝΟΤΗΤΑ 2 Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

2.1 ΓΕΓΟΝΟΤΑ (FACTS) …………………………………………...11 2.2 ΚΑΝΟΝΕΣ (RULES)……………………………………………16

2.2.1 ΣΥΝΤΑΞΗ ΕΝΟΣ ΚΑΝΟΝΑ……………………………………………….16 2.2.2 ΠΩΣ ΕΡΜΗΝΕΥΟΝΤΑΙ ΟΙ ΚΑΝΟΝΕΣ……………………………..…...20 2.2.3 ΣΥΝΔΥΑΣΜΟΣ ΓΕΓΟΝΟΤΩΝ ΚΑΙ ΚΑΝΟΝΩΝ……………………..….22 2.2.4 ΣΥΜΠΕΡΑΣΜΑΤΙΚΑ……………………………………………………...23

2.3 ΣΥΝΘΕΤΟΙ ΟΡΟΙ (COMPLEX TERMS)……………………….24

2.4 ΑΝΤΙΚΕΙΜΕΝΑ ΤΗΣ PROLOG………………………………….26 2.4.1 ΟΙ ΣΤΑΘΕΡΕΣ…………………………………………………..…27 2.4.2 ΟΙ ΜΕΤΑΒΛΗΤΕΣ………………………………………………….28 2.5 ΕΝΟΠΟΙΗΣΗ-ΤΑΥΤΟΠΟΙΗΣΗ…………………………………..29 2.6 ΤΕΛΕΣΤΕΣ………………………………………………………...33

ΕΝΟΤΗΤΑ 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

3.1 ΑΝΑΖΗΤΗΣΗ ΠΛΗΡΟΦΟΡΙΩΝ……………………………………43 3.1.1 ΤΥΦΛΗ ΑΝΑΖΗΤΗΣΗ (Blind search)………………………………….44 3.1.1.1 ΠΡΩΤΑ –ΚΑΤΑ- ΒΑΘΟΣ ΑΝΑΖΗΤΗΣΗ (depth first search)………………………….44 3.1.1.1 ΠΡΩΤΑ –ΠΛΑΤΟΣ- ΒΑΘΟΣ ΑΝΑΖΗΤΗΣΗ (depth first search)……………………...45

Page 3: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

3.1.2 ΕΥΡΙΣΤΙΚΗ ΜΕΘΟΔΟΣ ΑΝΑΖΗΤΗΣΗΣ……………………………………45 3.1.2.1 ΠΡΩΤΑ- Ο- ΚΑΛΥΤΕΡΟΣ (Best–first) ……………………………………...…..............47 3.1.2.2 ΑΝΑΡΡΙΧΗΣΗ ΛΟΦΟΥ…………………………………………………..........................48 3.1.2.3 ΠΡΟΣΟΜΕΙΩΜΕΝΗ ΑΝΟΠΤΗΣΗ……………………………………………………..…49 3.1.2.4 Η ΕΥΡΙΣΤΙΚΗ ΜΕΘΟΔΟΣ IDA*………………………………………………………......49

3.1.3 ΟΠΙΣΘΟΔΡΟΜΗΣΗ (Backward chaining) ΚΑΙ ΕΜΠΡΟΣΘΙΟΔΡΟΜΗΣΗ (Forward chaining)…………………………………………………………………...50

3.2 ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ PROLOG………………………..52 3.2.1 ΣΧΕΣΙΑΚΕΣ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ…………………………………….…52 3.2.2 ΚΛΕΙΔΙΑ…………………………………………………………………….…54

3.3 ΤΡΟΠΟΙ ΕΡΩΤΑΠΑΝΤΗΣΕΩΝ…………………………….…..55 3.3.1 SQL ΚΑΙ PROLOG………………………………………………………....55 3.3.2 ΣΧΕΣΙΑΚΗ ΑΛΓΕΒΡΑ……………………………………………………...56 3.3.2.1 ΕΠΙΛΟΓΗ (SELECTION)…………………………………………………………………..57 3.3.2.2 ΠΡΟΒΟΛΗ (PROJECTION)……………………………………………………………….58 3.3.2.3 ΚΑΡΤΕΣΙΑΝΟ ΓΙΝΟΜΕΝΟ (CARTESIAN PRODUCT)………………………………...58 3.3.2.4 ΕΝΩΣΗ (UNION)…………………………………………………………………………...59 3.3.2.5 ΔΙΑΦΟΡΑ (DIFFERENCE)………………………………………………………………...60 3.3.2.6 ΤΟΜΗ (INTERSECTION)………………………………………………………………….61 3.3.2.7 ΣΥΝΔΕΣΗ (JOIN)…………………………………………………………………………..62 3.3.2.8 ΔΙΑΙΡΕΣΗ (DIVISION)……………………………………………………………………...63

3.4 ΜΕΘΟΔΟΙ ΑΝΑΠΑΡΑΣΤΑΣΗΣ ΓΝΩΣΗΣ………………………64 3.4.1 ΛΟΓΙΚΗ…………………………………………………………...…………...64 3.4.2 ΚΑΝΟΝΕΣ ΠΑΡΑΓΩΓΗΣ…………………………………………………….65 3.4.3 ΣΗΜΑΣΙΟΛΟΓΙΚΑ ΔΙΚΤΥΑ………………………………………………….66 3.4.4 ΠΛΑΙΣΙΑ……………………………………………………………………….67

3.5 ΠΛΕΟΝΕΚΤΗΜΑΤΑ ΚΑΙ ΜΕΙΟΝΕΚΤΗΜΑΤΑ………………..67 3.6 ΕΤΟΙΜΑ ΠΡΟΓΡΑΜΜΑΤΑ ΣΕ PROLOG…………………….69 3.6.1 ΜΗΧΑΝΙΣΜΟΣ ΑΝΑΚΤΗΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ………………………...69 3.6.2 ΜΗΧΑΝΙΣΜΟΣ ΕΠΕΞΗΓΗΣΗΣ……………...……………………………71 3.6.3 ΕΡΩΤΗΣΗ ΕΠΙΤΕΥΞΗΣ ΣΤΟΧΟΥ………………………...……………...72 3.6.4 ΔΙΑΔΙΚΑΣΙΑ ΕΞΟΔΟΥ………………………………...……………………73 3.6.5 ΔΙΑΔΙΚΑΣΙΑ ΚΑΘΑΡΙΣΜΟΥ ΜΙΑΣ ΒΑΣΗΣ……………………………….74 3.6.6 ΠΡΟΣΠΕΛΑΣΗ ΔΕΔΟΜΕΝΩΝ ΜΕ ΦΥΣΙΚΗ ΓΛΩΣΣΑ………………….75

Page 4: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

1

ΕΝΟΤΗΤΑ 1

Η PROLOG

ΙΣΤΟΡΙΚΗ ΑΝΑΔΡΟΜΗ…………… ΓΕΝΙΚΑ………………………………. Η ΠΡΩΤΗ ΕΠΑΦΗ………………….

Page 5: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

2

1.1 ΙΣΤΟΡΙΚΗ ΑΝΑΔΡΟΜΗ

Ιστορικά θα πρέπει να ξεκινήσει κανείς από τους χρόνους των αρχαίων Ελλήνων (Αριστοτέλης κ.ά.) όπου είχαν τεθεί φιλοσοφικά ερωτήματα για τη φύση της γνώσης και των διαδικασιών συλλογισμού. Αργότερα η προσπάθεια αυτή συστηματοποιήθηκε και τυποποιήθηκε στα τέλη του 19ου αιώνα και τον 20° αιώνα από επιστήμονες όπως οι Frege, Boole, Russell, Tarski , Quine, Peano, Herbrand κ.α. Στα πλαίσια αυτά σημαντική υπήρξε η προσπάθεια στην κατεύθυνση της αυτόματης εξαγωγής συμπερασμάτων και αυτόματης απόδειξης θεωρημάτων. Στα 1930 ο Herbrand πρότεινε ένα μηχανικό τρόπο στην απόδειξη θεωρημάτων, που όμως ήταν πολύ αργός.

Το όνομα αυτό αποδόθηκε, κατά τη διάρκεια ενός ταξιδιού με το τραίνο Παρίσι-Μασσαλία, από τη γυναίκα τού Philippe Roussel. Ο Ρ. Roussel και ο Michel Van Caneghem δούλεψαν μαζί με τον "πατέρα" της Prolog, τον Alain Colmerauer, στις πρώτες εκδόσεις της γλώσσας. Τα πρώτα βήματα για τη δημιουργία της Prolog έγιναν το 1971 και ο διερμηνευτής (iηterpreter) της Prolog γράφτηκε για πρώτη φορά σε Algol, σε ένα ΙΒΜ 36067. Ακολουθεί, μερικά χρόνια αργότερα, ένας διερμηνευτής γραμμένος σε 1101 TRAN. Την ίδια εποχή βρίσκεται στη Μασσαλία (την πατρίδα της Prolog) () Άγγλος Daνid Warren, με σκοπό τη βελτίωση των επιδόσεων της Prolog. Από αυτή την προσπάθεια θα γεννηθεί, το 1977, ο πρώτος μεταφραστής (compiler) της Prolog, γραμμένος εν μέρει σε FORTRAN και ο υπόλοιπος σε Prolog !

Η σύνταξη της Prolog του Warren που ονομάζεται και Prolog του (Εδιμβούργου) ήταν διαφορετική από την αρχική Prolog της Μασσαλίας. Οι εκδόσεις της Prolog θ' ακολουθήσουν στη συνέχεια γεωμετρική πρόοδο (υπάρχει μάλιστα και μία ελληνική διάλεκτος). Η σύνταξη του Εδιμβούργου, όμως, που είναι και αυτή που υιοθετήσαμε , αρχίζει σιγά-σιγά να επιβάλλεται σαν πρότυπο.

Από Ελληνικής πλευράς η ενασχόληση με την Prolog στο Ινστιτούτο Πληροφορικής και Τηλεπικοινωνιών του Ε.Κ.Ε.Φ.Ε "Δημόκριτος" έχει ιστορία περισσότερο από μια δεκαετία. Στα χρόνια αυτά η ερευνητική ομάδα Τεχνητής Νοημοσύνης τού Ινστιτούτου ήρθε σε επαφή με την Prolog από πολλές οπτικές γωνίες.

Από τη μια μεριά ασχολήθηκε με την τεχνολογία υλοποίησης διερμηνέων της γλώσσας. Καρπός αυτής της δουλειάς υπήρξε η ανάπτυξη διαφόρων πειραματικών διερμηνέων οι οποίοι υλοποιήθηκαν αρχικά σε FORTRAN και ακολούθως σε C και έχουν τρέξει κάτω από λειτουργικά συστήματα MS-DOS, PRIMOS και UΝΙΧ. Η προσπάθεια αυτή συμπυκνώνεται στην ανάπτυξη του διερμηνέα της Δ-Ρrοlοg ο οποίος είναι υλοποιημένος σε γλώσσα C, τρέχει κάτω από MS-DOS και UΝIΧ. Ο διερμηνέας της Δ-Ρrοlοg έχει την επιπλέον δυνατότητα να τρέχει προγράμματα τα οποία είναι γραμμένα με Ελληνικούς χαρακτήρες.

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

Page 6: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

3

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

1.2 ΓΕΝΙΚΑ

Prolog, κατ' αρχήν, σημαίνει Programmer eη Logique. Η Prolog δεν είναι απλά μια ακόμα γλώσσα προγραμματισμού περισσότερο ή λιγότερο αποτελεσματική από τις πολλές άλλες που ήδη υπάρχουν , αλλά είναι η γλώσσα που εισάγει μια νέα αντίληψη στον προγραμματισμό. Είναι μια γλώσσα του Λογικού Προγραμματισμού που βασίζεται στη Λογική και σχεδιάστηκε για την επίλυση προβλημάτων από την περιοχή της Τεχνητής Νοημοσύνης, αλλά επηρεάστηκε σημαντικά τη γενικότερη εξέλιξη της επιστήμης των Υπολογιστών. Η ανάλυση ενός προβλήματος συνίσταται στον ορισμό κάποιων δομών δεδομένων και στην επινόηση ενός αλγορίθμου για την επίλυση του. Η γραφή ενός προγράμματος για την επίλυση ενός προβλήματος στις συμβατικές γλώσσες προγραμματισμού (Pascal, C , FORTRAN κ.λ.π ) είναι η διατύπωση ενός συνόλου εντολών (instructions) της αντίστοιχης γλώσσας οι οποίες εκτελούνται από τον Η/Υ. “Ε” είναι ο όρος «εντολή», που χρησιμοποιήθηκε για να εκφράζει την αντίληψη του προγραμματισμού κατά την οποία δίνεται έμφαση στη ροή του ελέγχου . Από την άλλη μεριά , η γραφή ενός προγράμματος Prolog συνίσταται στην περιγραφή των δεδομένων και των σχέσεων που τα διέπουν με τη βοήθεια προτάσεων ενός υποσυνόλου της λογικής πρώτης τάξης, που ονομάζονται προτάσεις Horn. Η προγραμματιστική αντίληψη που εισάγεται με την Prolog και γενικότερα με το λογικό προγραμματισμό είναι τέτοια ώστε αν θεωρήσουμε ότι (η εξίσωση στον Kowalski)

Αλγόριθμος= λογική +έλεγχος

Τότε ο προγραμματιστής οφείλει να περιγράψει μόνο τη λογική του προβλήματος ενώ ο έλεγχος αφήνετε στο σύστημα του λογικού προγραμματισμού. Ο κυριότερος σταθμός στην αυτόματη απόδειξη θεωρημάτων από προτάσεις της λογικής πρώτης τάξης υπήρξε η εργασία του Robinson (1965) με καρπό την "Αρχή της ανάλυσης" (Resolution principle). Η αρχή της ανάλυσης είναι μια γενίκευση του κανόνα συμπερασματολογίας «τρόπος σκέψης» (modus ponens) και βασίζεται στην ιδέα:

Α Λ(~Α V Γ) ==> Γ Η αρχή αυτή, σε συνδυασμό με τη διαδικασία της ταυτοποίησης ατομικών τύπων, αποτελεί ένα πολύ ισχυρό και απλό στην υλοποίησή του μηχανισμού

Page 7: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

4

αυτόματης εξαγωγής συμπερασμάτων. Το 1969 ο Green χρησιμοποίησε ένα σύστημα εξαγωγής συμπερασμάτων γραμμένο σε Lίsp, σε μία εφαρμογή ερωταπαντήσεων (Question Answering System). Ακολούθησαν διάφορα Συστήματα Παραγωγής (Production Systems) με εφαρμογή στην Απόδειξη Θεωρημάτων (Theorem Proving), όπως των Roger και Moore (1972), του KowaIskl (1970) κ.ά. Με την απομόνωση των προτάσεων Horn που είναι υποσύνολο των προτάσεων της Λογικής Α' τάξης, (προτάσεις που περιλαμβάνουν το πολύ ένα θετικό ατομικό τύπο), η υλοποίηση μιας γλώσσας προγραμματισμού που να δέχεται, να ερμηνεύει και να μπορεί να εξάγει αυτόματα συμπεράσματα από τις προτάσεις αυτές. Με τη βοήθεια της αποδεικτικής διαδικασίας της αρχής της Ανάλυσης, ήταν πλέον μια υπόθεση ολίγου χρόνου. Η γλώσσα αυτή που ονομάστηκε Prolog (PROgrammlng Ιn LOGlc) , αναπτύχθηκε από τη γαλλική ερευνητική ομάδα τεχνητής νοημοσύνης ,του Alan Colmerauer, στο Πανεπιστήμιο Lumιny της Μασσαλίας, Οι πρώτες δημοσιεύσεις. γύρω από την Prolog εμφανίζονται κατά τα έτη 1973-75.

Παράλληλα, η αλματώδης ανάπτυξη της τεχνολογίας των υπολογιστών οδήγησε τη χρήση τους σε νέες εφαρμογές όπως η κατανόηση φυσικής γλώσσας ή τα έμπειρα συστήματα, που απαιτούν "ιδιαίτερη νοημοσύνη". Η Τεχνητή Νοημοσύνη είναι ο κλάδος της επιστήμης των υπολογιστών που ασχολείται με αυτά τα θέματα, καθώς και με τα "εργαλεία" που χρειάζονται για την επίλυση και επεξεργασία των θεμάτων αυτών. Έτσι η Prolog είναι μια γλώσσα της Τεχνητής Νοημοσύνης, επί πλέον όμως δεν παύει να είναι και μια γλώσσα γενικής χρήσης (general purpose) και υπάρχουν αρκετές εφαρμογές σε συνεργασία με Τράπεζες Δεδομένων ακόμα και σε μηχανογραφικά συστήματα. Το βασικό της μειονέκτημα, που είναι ο σχετικά αργός μηχανισμός της συνεπαγωγής, φαίνεται ότι θα ξεπεραστεί από την ανάπτυξη της τεχνολογίας με τα παράλληλα υπολογιστικά συστήματα.

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

Η περιοχή του λογικού προγραμματισμού εξακολουθεί να παραμένει μια εξαιρετικά ενεργός ερευνητικά περιοχή. Σημαντική ερευνητική δραστηριότητα αφορά την ανάπτυξη παράλληλων γλωσσών λογικού προγραμματισμού . Η έρευνα στην κατεύθυνση αυτή έχει δώσει ήδη αρκετά χειροπιαστά αποτελέσματα. Άλλες ερευνητικές κατευθύνσεις αφορούν τη βελτίωση του ελέγχου του μηχανισμού απόδειξης της Prolog (μερικά αποτελέσματα αφορούν τη λεγόμενη έξυπνη οπισθοδρόμηση (intelligent backtracking), την εισαγωγή μηχανισμού καθυστέρησης της εκτέλεσης κάποιων κλήσεων (delay) κ.λ.π.), τη διεύρυνση του υποσυνόλου της λογικής που χρησιμοποιείται σαν γλώσσα προγραμματισμού, τον συνδυασμό του λογικού προγραμματισμού με άλλες προγραμματιστικές φιλοσοφίες όπως συναρτησιακό προγραμματισμό (functional programming), και προγραμματισμό προσανατολισμένο σε αντικείμενα (object-oriented

Page 8: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

5

programmlng) καθώς και η ανάπτυξη ενδιάμεσων για επικοινωνία με αλγοριθμικές γλώσσες προγραμματισμού και με βάσεις δεδομένων. Σημαντική είναι και η προσπάθεια συνδυασμού του λογικού προγραμματισμού με μεθοδολογίες προγραμματισμού με περιορισμούς (constraint programming) όπου παρέχεται στο χρήστη η δυνατότητα να ορίζει, με εξαιρετικά δηλωτικό τρόπο, περιορισμούς (constraints) που πρέπει να ισχύουν μεταξύ μεγεθών του προς επίλυση προβλήματος. Τέλος, σημαντική έρευνα γίνεται ώστε να αναπτυχθούν περιβάλλοντα λογικού προγραμματισμού, αυτόματης απόδειξης ορθότητας προγραμμάτων, μετασχηματισμού προγραμμάτων και αυτόματου προγραμματισμού.

1.3 Η ΠΡΩΤΗ ΕΠΑΦΗ

Επειδή ο καλύτερος τρόπος για να καταλάβει κανένας μια γλώσσα προγραμματισμού είναι να γράψει ένα εύκολο πρόγραμμα. Για να γράψει κάποιος ένα πρόγραμμά στην Prolog δεν είναι απαραίτητο να γνωρίζει πολλά πράγματα από προγραμματισμό διότι δεν θα χρειαστεί να αποστηθίσουμε λέξεις-κλειδιά όπως FOR ,WHILE, IF….. THEN κ.λ.π. Φτάνει μόνο να καταγράψουμε τη γνώση μας χωρίς περίπλοκες εντολές. Όπως για παράδειγμα

ζώο(τίγρης).

Εδώ δεν κάναμε κάτι το ιδιαίτερο απλά καταγράψαμε μια γνώση που έχουμε για την ιδιότητα του σκύλου ότι είναι ζώο. Αυτό ήταν το πρώτο μας πρόγραμμα στην Prolog. Τώρα θα εμπλουτίσουμε το πρόγραμμα μας:

ζώο(τίγρης). ζώο(λεοπάρδαλη). ζώο(λιοντάρι).

"Ωραία, και τώρα τι γίνεται; " , θ' αναρωτηθεί κανείς. "Ποια είναι τ'

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

? Το πρώτο πράγμα που θα ρωτήσουμε την Prolog είναι να μας πει αν ο

τίγρης, είναι. ζώο. Μετά από το ερωτηματικό. Θα γράψουμε :

?ζώο(τίγρης).

Page 9: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

6

Και η Prolog θα μας απαντήσει:

=ναι

Το πρώτο πρόγραμμά μας δουλεύει. Καταφέραμε επιτέλους να πούμε σε έναν ηλεκτρονικό υπολογιστή ότι ο τίγρης, είναι ζώο (και όχι, Π.χ., μάρκα υπολογιστών), Τώρα θα τον ρωτήσουμε και πιο πολύπλοκο "Θέλω να μου δώσεις όλα τα ζώα που γνωρίζεις". Πώς, όμως, θα εκφράσουμε την έννοια του όλα; Θα χρησιμοποιήσουμε γι' αυτό μία μεταβλητή Χ. Θα ρωτήσουμε τον ηλεκτρονικό υπολογιστή

?ζώο(Χ)

Και ο υπολογιστής μέσω της Prolog θα μας απαντήσει: Χ= τίγρης Χ= λεοπάρδαλη Χ= λιοντάρι Με την απάντηση του αυτή θα μας δώσει όλες τις "τιμές" του Χ, για τις οποίες η σχέση ζώο(Χ)

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

η Prolog στην ερώτηση, ? ζώο(βιβλίο)

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

Page 10: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

7

φίλος ( σπύρου, κώστας ). αγαπάει ( γιάvνης, μαρία ). κοστίζει ( χρυσαφί, πολύ ). είναι ( ομάδα, ολυμπιακός ). αγαπάει (σπύρος, αλέξανδρο ). κωδικός( πελάτη, 12123). ημερομηνία ( λήξης, 12, σεπτεμβρίου, 1989). δίνει( βιβλιοπώλης, βιβλίο, πελάτη). βρέχει. Ένα γεγονός στην Prolog , λοιπόν, έχει ένα όνομα και διάφορα αντικείμενα. Έτσι όταν γράφουμε :

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

Όταν, για να εκφράσουμε τη γνώση ότι το ποτήρι είναι ασημένιο, κατα-γράφουμε στο πρόγραμμά μας το γεγονός, Π.χ. ασήμι ( ποτήρι) .αναφερόμαστε σ' ένα συγκεκριμένο αντικείμενο. Δηλαδή σ' ένα συγκεκριμένο ποτήρι ή μία συγκεκριμένη κατηγορία ποτηριών. Έχουμε να κάνουμε με μια σταθερά (γι' αυτό και χρησιμοποιήσαμε σαν πρώτο γράμμα της λέξης το μικρό 'π'). Αν όμως, γράφαμε ασήμι(Ποτήρι) Θα σήμαινε ότι οτιδήποτε αντικείμενο (ακόμα κι ένα δέντρο) είναι φτιαγμένο από ασήμι. Αυτό οφείλεται στο ότι χρησιμοποιήσαμε μία. μεταβλητή (κεφαλαίο «Π»). 'Έτσι, αν ρωτούσαμε ? ασήμι(δέντρο),

Page 11: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

8

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

Στη συνέχεια θα δούμε μερικούς κανόνες για την σύνταξη των διαφόρων γεγονότων στη Prolog:

Το όνομα του κατηγορήματος, όπως και το όνομα των αντικειμένων του πρέπει να αρχίζει πάντα από μικρό γράμμα (να είναι, δηλαδή, σταθερά). Στο εσωτερικό ενός ονόματος επιτρέπεται να τοποθετούμε το σύμβολο “_” (κάτω παύλα = underscore) για να ενώνουμε δύο διαφορετικές λέξεις (τηλέφωνο_ φίλου, έχει_ μόνο κλπ.).

Οι όροι του γεγονότος (όταν υπάρχουν) τοποθετούνται μέσα σε παρένθεση και διαχωρίζονται (όταν είναι περισσότεροι του ενός) με κόμματα.

Η εκφώνηση ενός γεγονότος τελειώνει πάντοτε με τελεία.

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

Ας εξετάσουμε κι ένα δείγμα συντακτικών λαθών που θα μπορούσαμε να εί-

χαμε κάνει κατά τη γραφή των γεγονότων

Φρούτο (μήλο) Λείπει η τελεία. Φρούτο (μήλο) Το όνομα του κατηγορήματος δεν αρχίζει με κεφαλαίο. Φρούτο (μήλο αχλάδι ) Λείπει το κόμμα μεταξύ των αντικειμένων. 1821(επανάσταση) Το όνομα δεν αρχίζει με γράμμα. έχει πάρει (βιβλίο) Το όνομα του κατηγορήματος αποτελείται από δύο

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

Page 12: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 1 - ΓΝΩΡΙΜΙΑ ΜΕ ΤΗΝ PROLOG

9

Page 13: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

10

ΕΝΟΤΗΤΑ 2

Η PROLOG ΩΣ ΓΛΩΣΣΑ

ΓΕΓΟΝΟΤΑ (FACTS) ………………….... ΚΑΝΟΝΕΣ (RULES)…………………..... ΣΥΝΘΕΤΟΙ ΟΡΟΙ (COMPLEX TERMS).. ΑΝΤΙΚΕΙΜΕΝΑ ΤΗΣ PROLOG…………. ΕΝΟΠΟΙΗΣΗ-ΤΑΥΤΟΠΟΙΗΣΗ………….. ΤΕΛΕΣΤΕΣ…………………………………

Page 14: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

11

2.1 Γεγονότα (facts)

Η απλούστερη μορφή πρότασης (clause) στην Prolog είναι το γεγονός

(fact) κωδικοποιούμε πρωταρχικές γνώσεις γύρω από το πρόβλημα που θέλουμε να επιλύσουμε, τις γνώσεις δηλαδή που δεν παράγονται από άλλες. Για παράδειγμα, με ένα γεγονός μπορούμε να δηλώσουμε στην Prolog ότι δύο αντικείμενα συνδέονται μεταξύ τους με σχέση (relationship).

Ας πάρουμε ένα παράδειγμα για να κατανοήσουμε καλύτερα τις τεράστιες δυνατότητες της Prolog. Είναι Κυριακή βράδυ και θέλουμε να καταγράψουμε τα αποτελέσματα των ποδοσφαιρικών αγώνων του τελευταίου μήνα : ποιος έπαιξε εναντίον ποιού, ποιο είναι το αποτέλεσμα του αγώνα κλπ. Είναι πρωταρχικό στην Prolog, πριν αρχίσουμε το γράψιμο οποιουδήποτε προγράμματος , να βρούμε ποιο είναι το όνομα του γεγονότος που επιθυμούμε να εκφράσουμε . Το γεγονός σ' αυτή την περίπτωση είναι ότι η ομάδα α έπαιξε εναντίον της ομάδας β και έφερε το αποτέλεσμα γ. Αν Π.χ. ο Παναθηναϊκός κέρδισε εκτός έδρας τον Ολυμπιακό με 2-0, θα μπορούσαμε να γράψουμε το εξής γεγονός:

έπαιξε(ολυμπιακός, παναθηναϊκός, 0, 2).

Το έπαιξε ονομάζεται κατηγόρημα (predicate) ενώ τα ολυμπιακός και παναθηναϊκός αποτελούν τα ορίσματα (arguments). Ο αριθμός των oρισμάτων που αντιστοιχεί σε κάποιο κατηγόρημα ονομάζεται τάξη (arity) του κατηγορήματος αυτού. Η συγκεκριμένη διάταξη των oρισμάτων δεν παίζει κανένα ρόλο αρκεί να ακολουθείται με συνέπεια για όλες τις σχέσεις με το ίδιο κατηγόρημα. Το κατηγόρημα μαζί με τα ορίσματα που περιλαμβάνει ονομάζεται ατομικός τύπος (atomic formula). Στην πρόταση ομάδα (ολυμπιακός) ο ολυμπιακός έχει την ιδιότητα (property) ομάδα

Υπάρχουν , όμως, χίλιοι-δύο άλλοι τρόποι στην Prolog για να εκφράσουμε το ίδιο γεγονός που περιγράψαμε πιο πάνω

αγώνας (ολυμπιακός, παναθηναϊκός, 0, 2)

ή κέρδισε (παναθηναϊκός, ολυμπιακός, 2, 0) ή παναθηναϊκός (ολυμπιακός, 2, 0) ή ολυμπιακός (έχασε, 2, Ο, παναθηναϊκός) ή νίκη (εκτός έδρας, παναθηναϊκός, 2, 0, ολυμπιακός). κλπ.

Άρα καταλήγουμε στα εξής συμπεράσματα:

Ένα σύνολο από γεγονότα είναι ένα πρόγραμμα Prolog.

Ένα γεγονός περιλαμβάνει έναν και μόνο ατομικό τύπο .

Ένας ατομικός τύπος αποτελείται από ένα κατηγόρημα τάξης και μεγαλύτερο ή ίσο του μηδενός και από κ ορίσματα.

Ένα όρισμα μπορεί να είναι ένα άτομο.

Page 15: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

12

Η Prolog δεν μας επιβάλλει κανέναν από τους παραπάνω ή τους υπόλοιπους δυνατούς τρόπους. Εμείς Θα πρέπει να διαλέξουμε τον τρόπο που μας αρέσει και που αντιπροσωπεύει καλύτερα το γεγονός. Ας μην ξεχνάμε, όμως, ότι οι απαντήσεις της Prolog αποτελούνται από τα αντικείμενα, με τα οποία κατασκευάσαμε τα γεγονότα μας. Αν είχαμε δηλαδή ένα γεγονός του τύπου:

κέρδισε(παναθηναϊκός, 2). Δεν θα είμαστε, στη συνέχεια, σε θέση να μάθουμε ούτε ποιόν κέρδισε ο παναθηναϊκός, ούτε το ακριβές σκορ του αγώνα. Ας διαλέξουμε, λοιπόν, το συμβολισμό: αγώνας(ολυμπιακός, παναθηναϊκός, 0, 2). Αξίζει να παρατηρήσουμε ότι αυτό το γεγονός δεν είναι το ίδιο με : αγώνας (παναθηναϊκός , ολυμπιακός:, 2 , 0), γιατί, ενώ το πρώτο εκφράζει ότι ο παναθηναϊκός κέρδισε τον ολυμπιακός εκτός έδρας , το δεύτερο εκφράζει ότι ο παναθηναϊκός έπαιξε στο γήπεδό του .Ας καταγράψουμε, λοιπόν, μερικά από τα ποδοσφαιρικά αποτελέσματα του τελευταίου μήνα: αγώνας(ολυμπιακός, παναθηναϊκός, 0, 2). αγώνας(ολυμπιακός, αεκ, 3, 3). αγώνας (ολυμπιακός , άρης, 0,0 ). αγώνας(παναθηναϊκός, ολυμπιακός, 1, 1). αγώνας(παναθηναϊκός, άρης, 5, 0). αγώνας(άρης, αεκ, 1, 0). αγώνας(αεκ, παναθηναϊκός, 0, 0). αγώνας(αεκ, ολυμπιακός, 2, 1).

Είμαστε τώρα σε θέση να ρωτήσουμε την Prolog. Στην πρώτη ερώτηση που Θα υποβάλουμε, θα επαληθεύσουμε το αποτέλεσμα ενός αγώνα:

? αγώνας(άρης, αεκ, 1, Ο). =ναι και συνεχίζουμε: ? αγώνας(αεκ, άρης, Ο, Ο). =όχι

Page 16: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

13

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

Επιθυμούμε, ακόμα, να μάθουμε το αποτέλεσμα του κάθε αγώνα της αεκ με τους διαφόρους αντιπάλους της. Θα χρησιμοποιήσουμε γι' αυτό το σκοπό δύο άλλες μεταβλητές : Σκορ_αεκ και Σκορ-αντιπάλου και θα ρωτήσουμε

? αγώνας(αεκ, Αντίπαλος, Σκορ_αεκ, Σκορ-αντιπάλου).

Μ' άλλα λόγια: "Ποια είναι τα γεγονότα που συμπεριλαμβάνουν το

αντικείμενο αεκ και ποια είναι τα άλλα τρία αντικείμενο που το ακολουθούν ;" Η Prolog Θα μας απαντήσει:

Αντίπαλος = παναθηναϊκός Σκορ_αεκ=0 Σκορ-αντιπάλου=0 Αντίπαλος= ολυμπιακός Σκορ_αεκ=2 Σκορ-αντιπάλου=1 Μας παρουσιάζει, δηλαδή ,τα αποτελέσματα όλων των αγώνων της αεκ στην έδρα της .Αν, τώρα ,θέλουμε να μάθουμε τα αποτελέσματα όλων των αγώνων εκτός έδρας της αεκ θα ρωτήσουμε : ? αγώνας(Αντίπαλος, αεκ, Σκορ-αντιπάλου, Σκορ_αεκ ). και θα πάρουμε Αντίπαλος= ολυμπιακός Σκορ-αντιπάλου=3 Σκορ_αεκ=3 Αντίπαλος= άρης Σκορ-αντιπάλου=1 Σκορ_αεκ=0 Ας υποθέσουμε τώρα ότι θέλουμε να μάθουμε όλες τις ισοπαλίες. Μια ισοπαλία χαρακτηρίζεται από το ίδιο σκορ των δυο αντιπάλων .Επειδή ,όμως δεν γνωρίζουμε εκ των προτέρων ποιο μπορεί να είναι το σκορ της κάθε ισοπαλίας ,θα χρησιμοποιούμε την ίδια και μόνο μεταβλητή (την οποία θα ονομάσουμε , π.χ. ,Χ)και θα ρωτήσουμε : ?αγώνας (ομάδα1, ομάδα2, Χ, Χ).

Page 17: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

14

Δηλαδή : «Πες μου ποιες είναι οι ομάδες (ομάδα1 και ομάδα2 ), για τις οποίες το σκορ (Χ) είναι το ίδιο». Χρησιμοποιήσαμε δυο μεταβλητές για τις ομάδες ,γιατί θέλουμε να μάθουμε όλες τις ομάδες που έφεραν ισοπαλία .Δεν γνωρίζουμε , δηλαδή ,εκ, των προτέρων τα ονόματα αυτών των ομάδων .Η Prolog θα μας απαντήσει με τέσσερις λύσεις : ομάδα1=ολυμπιακός ομάδα2=αεκ Χ=3 ομάδα1=ολυμπιακός ομάδα2=άρης Χ=0 ομάδα1=παναθηναικός ομάδα2=ολυμπιακός Χ=1 ομάδα1=αεκ ομάδα2= παναθηναϊκός Χ=0

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

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

? αγώνας(Υ, άρης, Χ, Χ).

Με άλλα λόγια, "Δώσε μου το όνομα της ομάδας Υ που έπαιξε στην έδρα της (πρώτη παράμετρος του γεγονότος) εναντίον του άρη και που έφερε το ίδιο σκορ με τον άρη (Χ)". Η Prolog θα μας απαντήσει με μία μόνο λύση:

Υ =ολυμπιακός Χ =0

Page 18: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

15

Μήπως ο άρης έχει φέρει ισοπαλία στην έδρα του;

? αγώνας(άρης, ομάδα, Χ, Χ). =όχι Υπάρχει κανένας αγώνας όπου η αεκ να μην έχει καταφέρει να βάλει κανένα, τέρμα παίζοντας στην έδρα της; ? αγώνας( άεκ, ομάδα, 0, Χ).

Εδώ ζητάμε από την Prolog να μας βρει μία ομάδα (που αντιπροσωπεύεται από τη μεταβλητή ομάδα) που να έχει παίξει εκτός έδρας εναντίον τής άεκ και να έχει φέρει το σκορ Χ. Το σκορ της άεκ δεν είναι μεταβλητή, δεδομένου ότι το γνωρίζουμε (0). Η Prolog θα μας απαντήσει: ομάδα= παναθηναϊκός Χ=0 Πράγματι , στον αγώνα της εναντίον του παναθηναϊκού η αεκ είχε φέρει ισοπαλία (0-0) ,χωρίς να έχει πετύχει κανένα τέρμα. Πέρα από όσα είδαμε ως εδώ ,όμως η Prolog μας δίνει τη δυνατότητα να διατυπώνουμε και σύνθετες ερωτήσεις .π.χ. «Ποια είναι η ομάδα που κέρδισε με 1-0 στην έδρα της την αεκ και ηττήθηκε με 5-0 εκτός έδρας από τον παναθηναϊκό» .Για να εκφράσουμε το και στην Prolog ,χρησιμοποιούμε το σύμβολο (,) .’Έτσι θα γράψουμε: ?αγώνας (Χ, αεκ, 1, 0), αγώνας (παναθηναϊκός, Χ,5,0) η Prolog θα συμβουλευτεί το πρόγραμμα μας και θα προσπαθήσει να εντοπίσει τα δυο γεγονότα που ικανοποιούν την ερώτηση μας .Η απάντηση της θα είναι : Χ= άρης

Η εξαγωγή συμπερασμάτων με βάση τη γνώση που περιλαμβάνει ένα πρόγραμμα γίνεται υποβάλλοντας ερωτήσεις στο πρόγραμμα αυτό.

Μια απλή ερώτηση περιλαμβάνει μια κλήση (call) κάποιας πρότασης του προγράμματος μας .

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

‘Ένα πρόγραμμα μπορεί να δώσει όλες τις δυνατές απαντήσεις σε μια ερώτηση που υποβάλλουμε.

Page 19: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

16

2.2 Οι κανόνες (rules)

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

Ο προγραμματισμός της Prolog, όμως, δεν περιορίζεται στη διατύπωση

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

Η Δανάη και ο Άλκης είναι αδέρφια και οι γονείς τους ονομάζονται Αγη-σίλαος και Σάρα. Ο Άλκης παντρεύτηκε μοναχοκόρη του Μενέλαου και της Κλειώς, τη Λουίζα. Τα δυο παιδία τους ονομάζονται Νίκος και Αλέξανδρος. Αν επιθυμούμε να προγραμματίσουμε τα οικογενειακά γεγονότα θα γράψουμε:

πατέρας (δανάη, αγησίλαος) πατέρας (άλκης, αγησίλαος) πατέρας (λουίζα, μενέλαος) πατέρας (νίκος, άλκης) πατέρας (άλκης, αγησίλαος) πατέρας (αλέξανδρος, άλκης) μητέρα (δαναή, σάρα) μητέρα (άλκης, σάρα) μητέρα (λουίζα, κλειώ) μητέρα (νίκος, λουίζα) μητέρα (αλέξανδρος, λουίζα) γιαγιά (νίκος, σάρα) γιαγιά (αλέξανδρος , σάρα) γιαγιά (νίκος, κλειώ) γιαγιά (αλέξανδρος, κλειώ) αδέρφια(δανάη, άλκης) αδέρφια(νίκος, αλέξανδρος)

Page 20: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

17

Προσέχοντας, βέβαια, να μην χρησιμοποιούμε κεφαλαία στη θέση των κύριων ονομάτων, γιατί αλλιώς η Prolog θα τα ερμηνεύσει σαν μεταβλητές. Το ότι γράφουμε: γιαγιά(αλέξανδρος, σάρα). σημαίνει ότι η γιαγιά του Αλέξανδρου ονομάζεται Σάρα. Αν τώρα γράφαμε γιαγιά(Αλέξανδρος, σάρα). αυτό θα σήμαινε ότι όλος ο κόσμος έχει μία γιαγιά πού τη λένε Σάρα. Θα ήταν δηλαδή σαν να γράφαμε γιαγιά (Χ, σάρα). Αν κάναμε το λάθος και γράφαμε γιαγιά(αλέξανδρος, Σάρα). αυτό θα σήμαινε το ίδιο πράγμα με το γιαγιά(αλέξανδρος, Χ). Δηλώνει ότι όλος ο κόσμος είναι η γιαγιά του Αλέξανδρου. Ας κάνουμε τώρα μερικές ερωτήσεις στην Prolog για να επαληθεύσουμε τα διάφορα γεγονότα. ποια είναι τα παιδιά του ¨Αλκη; ?πατέρας (Παιδί, άλκης) Παιδί =νίκος Παιδί= Αλέξανδρος Ποια είναι τα αδέρφια ?αδέρφια (Χ, Υ) X=νίκος Y=αλέξανδρος Να όμως η πρώτη γνωστή παγίδα της Prolog .Αν τώρα ρωτήσουμε : ?αδέρφια(αλέξανδρος, Χ) =όχι η Prolog θα μας πληροφορήσει ότι δεν βρήκε κανένα Χ που να εκπληρώνει αυτή τη σχέση. Πράγματι, στο πρόγραμμά μας είχαμε γράψει αδέλφια(νίκος, αλέξανδρος).

Page 21: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

18

Όταν η Prolog προσπαθήσει να ενοποιήσει την παραπάνω ερώτηση, θα αποτύχει. Για την Prolog, το γεγονός ότι ο Νίκος είναι ο αδελφός του Αλέξανδρου δεν είναι το ίδιο πράγμα με το γεγονός ότι ο Αλέξανδρος είναι αδελφός του Νίκου. Το ίδιο πρόβλημα θα προκύψει όταν ρωτήσουμε ?αδέλφια(άλκης, Υ). όπου και πάλι η Prolog δεν θα βρει καμία λύση. Δεν υπάρχει, δηλαδή, στη Prolog καμία πληροφορία που να εξηγεί ότι η αδελφική σχέση είναι συμμετρική. Για την ώρα, η μόνη λύση είναι να προσθέσουμε τα δύο αυτά γεγονότα

αδέλφια(άλκης, δανάη). αδέλφια(αλέξανδρος, νίκος).

Σ' αυτό το σημείο πρέπει ν' αναρωτηθούμε αν είναι πράγματι ανάγκη vα προγραμματίσουμε όλα αυτά τα γεγονότα. Όταν Π.χ. γράφουμε το γεγονός

παππούς (νίκος, μενέλαος).

δεν θα ήταν πιο έξυπνο (και κομψό, από λογική άποψη) να υποδείξουμε στη' Prolog γιατί ο Μενέλαος είναι παππούς του Νίκου; Ας προσπαθήσουμε να της το πούμε, λοιπόν:

«Ο μενέλαος είναι ο παππούς του νίκου διότι η κόρη του μενέλαου είναι η μητέρα του νίκου.»

«Ο παππούς του νίκου λέγεται μενέλαος διότι η μητέρα του νίκου είναι η

λουίζα και ο πατέρας της λουίζας είναι ο μενέλαος.» ¨Άρα: παππούς (νίκος, μενέλαος) μητέρα (νίκος , λουίζα) πατέρας (λουίζας, μενέλαος)

Αυτό, όμως, ισχύει για όλες τις οικογένειες. Πράγματι, σε κάθε οικογένεια ,ο

πατέρας της μητέρας κάποιου είναι και ο παππούς του τελευταίου (η Prolog, αν και εξελιγμένη γλώσσα, δεν ασχολείται με τα σύγχρονα επιτεύγματα της τεχνητής γονιμοποίησης). Θα μπορούσαμε, δηλαδή, να γράψουμε αυτό τον κανόνα, αντικαθιστώντας με μεταβλητέ ς τα συγκεκριμένα ονόματα και να γράψουμε . Π.χ. αντί νίκος Ν, αντί λουίζα Λ και αντί μενέλαος Μ. Στη θέση της λέξης διότι θα μπορούσαμε να βάλουμε το οποιοδήποτε "συνώνυμό" του όταν, εάν κ.λπ. Έτσι, θα είχαμε: παππούς(Ν, Μ) όταν μητέρα(Ν, Λ) και πατέρας(Λ, Μ).

Page 22: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

19

Μ' άλλα λόγια, ο παππούς του Ν λέγεται Μ όταν (ή διότι, ή εάν) η μητέρα του Ν είναι η Λ και ο πατέρας της. Λ είναι ο Μ. Αντί των τριών συνωνύμων όταν, διότι, εάν), στη γλώσσα προγραμματισμού Prolog θα χρησιμοποιήσουμε ένα και μόνο συμβολισμό το :- ¨Όσο για το και, θα το αντικαταστήσουμε απλώς με το γνωστό κόμμα, . ¨Άρα το παραπάνω ,που είναι και ο πρώτος κανόνας, γραφτεί στην πραγματικότητα: παππούς(Ν, Μ) :- μητέρα(Ν, Λ) , πατέρας(Λ, Μ). Οι κανόνες, όπως και τα γεγονότα, τελειώνουν πάντα με μία τελεία. Με τον ίδιο τρόπο ανακαλύπτουμε ένα σωρό άλλους "οικογενειακούς" κανόνες: γιαγιά(Χ, γ) ; πατέρας(Χ, Ζ), μητέρα(Ζ, Υ).

Μ' άλλα λόγια, «η γιαγιά ενός Χ είναι η Υ όταν αυτός ο Χ έχει έναν πατέρα λένε Ζ και η μητέρα αυτού του τελευταίου ονομάζεται Υ». 'Ένας άλλος κανόνας θα ήταν Π.χ.

γιαγιά(Ενός, Γ) :- μητέρα(Ενός, Μ), μητέρα(Μ, Ρ).

Χρησιμοποιώντας έναν κανόνα ,λύνουμε και το πρόβλημα που προέκυψε με το κατηγόρημα αδέρφια .Δυο άτομα Χ και Υ είναι αδέρφια (μη ετεροθαλή ), όταν έχουν την ίδια μητέρα και τον ίδιο πατέρα .Αυτός ο κανόνας θα εκφραζόταν στην Prolog : αδέρφια( Χ ,Υ):- πατέρας (Χ, Ζ), πατέρας(Χ, Μ), μητέρα (Χ, Μ), μητέρα (Υ, Μ). Εκφράσαμε το γεγονός ότι πρέπει να έχουν τον ίδιο πατέρα, χρησιμοποιώ-ντας την ίδια μεταβλητή Ζ. Το ίδιο κάναμε και για την μητέρα, χρησιμοποι-ώντας τη μεταβλητή Μ.

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

Page 23: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

20

σχέσης έχει ένα μειονέκτημα καθότι δεν αποκλείει τη δυνατότητα ο Χ να είναι ίδιος με τον Υ, να είναι δηλαδή ο αδελφός τού εαυτού του! Το μειονέκτημα αυτό θα αρθεί όταν θα εξετάσουμε την άρνηση).

Χάρη στους κανόνες, αποφύγαμε επίσης να γράψουμε με λεπτομέρειες ποιος είναι ο παππούς του καθενός, ποια είναι η γιαγιά, ποια είναι τ' αδέλφια κ.λ.π, Οι κανόνες που παρουσιάστηκαν έχουν γενική μορφή και ισχύουν (ευτυχώς) και για πιο ...γόνιμες οικογένειες.

Παρατηρούμε ότι εκφράσαμε κάθε κανόνα, συνδυάζοντας ένα σύνολο από σχέσεις. Το πρώτο σκέλος ενός κανόνα, η σχέση δηλαδή που προηγείται του ‘:-‘, ονομάζεται αριστερό σκέλος. Το αριστερό σκέλος ενός κανόνα ,Prolog αποτελείται πάντα από μία και μοναδική σχέση. Μετά από το ':-' ( πού σημαίνει όταν) συναντούμε το δεξιό σκέλος του κανόνα. Το δεξιό σκέλος αποτελείται πάντα από μία ή περισσότερες σχέσεις, συνεζευγμένες μεταξύ τους με το σύμβολο ‘,’ (που σημαίνει και).

2.2.2 Πώς ερμηνεύονται οι κανόνες

Όταν γράφουμε έναν κανόνα είναι σαν να δηλώνουμε στην Prolog ορισμένες πληροφορίες-συνθήκες. Πότε π.χ. ο Χ είναι ο παππούς του Υ , ποια είναι η γιαγιά του Χ κ. τ .λ Το ίδιο κάναμε όταν δηλώναμε ορισμένα μεμονωμένα γεγονότα , όπως ότι ο πατέρας της Λουίζας είναι ο Μενέλαος , ότι το μήλο είναι φρούτο κ. ο. κ Σε γενική μορφή βλέπουμε ,λοιπόν ,ότι ένα πρόγραμμα Prolog αποτελείται από δηλώσεις , είτε πρόκειται για γεγονότα είτε για κανόνες . Η άποψη ότι η Prolog μπορεί να ειδωθεί σαν ένα σύνολο δηλώσεων ονομάζεται δηλωτική ερμήνευση .Η δηλωτική ερμηνεύση δεν είναι όμως και η μοναδική για να καταλάβουμε τι σημαίνει ένας κανόνας .Ας δούμε , για παράδειγμα , τον εξής κανόνα :

γιαγιά(Χ, Υ) μητέρα (Χ, Ζ) μητέρα(Ζ, Υ)

Ο κανόνας αυτός μπορεί να ερμηνευθεί στα ελληνικά και μ' έναν άλλο τρόπο. Είναι σαν να λέμε στην Prolog: "Για να βρεις ποια είναι η γιαγιά του Χ, βρες τη μητέρα του Χ (την οποία θα ονομάσεις Ζ) και ύστερα βρες τη μητέρα της Ζ".

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

πατέρας(λουίζα, μενέλαος). είναι σαν να λέμε το εξής: "Αν ψάχνεις να βρεις ποιος είναι ο πατέρας της λουίζας, μην πηγαίνεις πιο μακριά: είναι ο μενέλαος".

Page 24: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

21

Συμπεραίνουμε ότι ένα πρόγραμμα Prolog ερμηνεύεται κατά δύο τρόπους: δηλωτικά ή διαδικαστικά. Ένας προγραμματιστής, ο οποίος έχει συνηθίσει άλλες γλώσσες προγραμματισμού, θα προτιμήσει ίσως τη διαδικαστική ερμηνεία . Οι περισσότερες γλώσσες προγραμματισμού ερμηνεύονται κατά ένα διαδικαστικό τρόπο. Η Prolog είναι ίσως η μόνη γλώσσα που μπορεί να ερμηνευτεί και με τους δύο τρόπους. Η διαφοροποίηση δηλωτικός / διαδικαστικός ίσως φανεί λίγο λεπτή στον αναγνώστη. Ας προσπαθήσουμε να την εξηγήσουμε με έναν απλό τρόπο:

Αν θέλουμε να δείξουμε σε κάποιον το δρόμο, θα του πούμε Π.χ. "Πάρε τον πρώτο δρόμο αριστερά και μετά από εκατό μέτρα θα περάσεις απέναντι και στα δεξιά θα δεις ένα περίπτερο. Προχώρα καμιά εκατοστή μέτρα και στρίψε πάλι αριστερά". Παρατηρούμε ότι η εξήγηση που δίνουμε είναι διαδικαστική. Εκφράζουμε, δηλαδή, τη διαδικασία των εντολών ("πάρε", "στρίψε", "προχώ-ρα"), την οποία θα πρέπει να ακολουθήσει ο συνομιλητής μας. Αν θέλουμε τώρα να εξηγήσουμε σε κάποιο διαβάτη ποιο είναι το δημαρχείο, Θα του πούμε: "Το δημαρχείο είναι εκείνο το αναπαλαιωμένο κτήριο. Έχει μία σημαία στον τρίτο όροφο. Η είσοδός του είναι από το πίσω μέρος, απέναντι από το παντοπωλείο". Εδώ δεν του εξηγούμε πως θα πάει αλλά του δίνουμε, ορισμένες πληροφορίες , οι οποίες θα του είναι χρήσιμες για να εντοπίσει το δημαρχείο. Η εξήγηση μας είναι δηλωτική , γιατί δεν χρησιμοποιούμε εντολές (πάρε, στρίψε κ. τ. λ ) αλλά δηλώσεις (είναι, βρίσκεται κ. τ .λ ). Η ανθρώπινη γλώσσα λειτουργεί και με τους δυο αυτούς τρόπους : Στρίψε δεξιά .Θα δεις ένα περίπτερο στο δεξί σου χέρι .Εκεί θα πάρεις το πρώτο στενό και θα βρεις το δημαρχείο –είναι το κτίριο με τη σημαία στον τρίτο όροφο

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

Με τις ίδιες εντολές η Prolog μας επιτρέπει δηλωτικό ή διαδικαστικό προγραμματισμό Εκτός .από τη δηλωτική/διαδικαστική ερμηνεία υπάρχει κι ένας άλλος τρόπος για να διαβαστεί ένας κανόνας στην Prolog.

Ας πάρουμε για παράδειγμα τον εξής κανόνα: θνητός(Χ) :- άνθρωπος(Χ).

Αυτός ο κανόνας ερμηνεύεται: "Κάποιος Χ είναι θνητός όταν είναι άνθρωπος". Η τελευταία πρόταση είναι ισοδύναμη με την: "Αν ο Χ είναι άνθρωπος τότε είναι θνητός" που αντιστοιχεί στο διάβασμα του κανόνα από τα δεξιά προς τα αριστερά ερμηνεύοντας το σύμβολο :- με τη λέξη τότε. Ας πάρουμε τέλος δύο κανόνες που υλοποιούν το κατηγόρημα παίρνω: παίρνω(αδιάβροχο) :- βρέχει παίρνω(αδιάβροχο) :- χιονίζει.

Χρησιμοποιήσαμε δύο κανόνες για να εκφράσουμε ότι υπάρχουν δύο περι-πτώσεις (λογικό ή) στις οποίες πρέπει να πάρουμε αδιάβροχο: όταν βρέχει ή

Page 25: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

22

όταν χιονίζει. Η Prolog μας επιτρέπει να συγχωνεύσουμε τους δύο προηγού-μενους κανόνες σ' έναν, χρησιμοποιώντας το σύμβολο του λογικού ή που είναι το ; (ελληνικό ερωτηματικό) : παίρνω(αδιάβροχο) :- (βρέχει; χιονίζει).

Η συγχώνευση σ' αυτή την περίπτωση ήταν δυνατή καθότι τ' αριστερά σκέλη των δύο κανόνων είναι όμοια. Οι παρενθέσεις ορίζουν το πεδίο του λογικού ή. Θα έπρεπε όμως να υπογραμμίσουμε ότι η χρήση του λογικού ή στο δεξιό σκέλος του ίδιου κανόνα, όπως επίσης και το διάβασμα του κανόνα από τα δεξιά προς τ' αριστερά (με τη βοήθεια του αν … τότε) αποπροσανατολίζουν τον αρχάριο προγραμματιστή και περιπλέκουν τη λογική του προγράμματος.

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

2.2.3 Συνδυασμός γεγονότων και κανόνων

Μπορούμε, φυσικά, να συνδυάσουμε κανόνες και γεγονότα για να εκφρά-

σουμε πιο πολύπλοκα δεδομένα. Ας υποθέσουμε, για παράδειγμα, πως γνωρίζουμε ότι το μήλο, το αχλάδι και όλα τα εσπεριδοειδή είναι φρούτα. Η πρώτη λύση είναι να γράψουμε: φρούτο(μήλο) . φρούτο(αχλάδι). φρούτο( εσπεριδοειδή). Μ' ένα τέτοιο πρόγραμμα θα είχαμε τον εξής διάλογο: ? φρούτο(μήλο). =ναι ? φρούτο(Φρούτο). Φρούτο= μήλο Φρούτο= αχλάδι Φρούτο= εσπεριδοειδή ?φρούτο(πορτοκάλι). =όχι Η Prolog νομίζει ότι τα εσπεριδοειδή είναι ένα μοναδικό είδος φρούτων και δεν μπορεί να συμπεράνει ότι το πορτοκάλι είναι και αυτό ένα φρούτο, γιατί δεν έχει καμιά πληροφορία γι' αυτό.

Page 26: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

23

Η λύση είναι να χρησιμοποιήσουμε έναν κανόνα, ο οποίος θα υποδεικνύει στην Prolog ότι, εκτός των φρούτων μήλο και αχλάδι, ένα οποιοδήποτε αντι-κείμενο Χ μπορεί να θεωρηθεί φρούτο, όταν ανήκει στην κατηγορία των εσπε-ριδοειδών. Έτσι, έχουμε το πρόγραμμα:

φρούτο(μήλο). φρούτο(αχλάδι). φρούτο(Χ) :- εσπεριδοειδή (Χ). εσπεριδοειδή(πορτοκάλι) . εσπεριδοειδή (μανταρίνι).

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

Ποια είναι όμως η διαφορά από το να γράφαμε:

φρούτο(μήλο). φρούτο(αχλάδι). φρούτο(πορτοκάλι) . φρούτο(μανταρίνι) .

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

Τα δύο γεγονότα και ο κανόνας που αντιστοιχούν στο κατηγόρημα φρούτο

μπορούν, φυσικά, να ερμηνευτούν και με διαδικαστικό τρόπο: "Αν προσπαθείς να αποδείξεις ότι ένα αντικείμενο είναι φρούτο, τότε θα πρέπει ν' αποδείξεις ότι είναι ή μήλο ή αχλάδι, εκτός κι αν καταφέρεις ν' αποδείξεις ότι ανήκει στα εσπεριδοειδή". 2.2.4 Συμπερασματικά

¨Ένα πρόγραμμα Prolog εκτός από γεγονότα μπορεί να περιλαμβάνει και κανόνες .Οι κανόνες ορίζουν νέες σχέσεις με τη βοήθεια άλλων σχέσεων που ‘έχουν ήδη ορισθεί.

Page 27: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

24

¨Ένας κανόνας έχει τη μορφή : Α:-Β1,……………….,Βκ.

Το Α ονομάζεται κεφαλή (head) του κανόνα και αποτελεί το αποτέλεσμα της εφαρμογής του κανόνα ενώ τα Β1,………,Βκ αποτελούν το σώμα (body) Του κανόνα και περιλαμβάνει τις συνθήκες (κλήσεις) που πρέπει να ισχύουν για να αληθεύει η κεφαλή, η κεφαλή χωρίζεται από το σώμα με το συμβάν «:-» που διαβάζεται «αν».Τα Α,Β1,……………… ,Βκ είναι ατομικοί τύποι.

2.3 Σύνθετοι Όροι

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

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

Διαλέγουμε να κωδικοποιήσουμε κάθε γραμμή του πίνακα με ένα γεγονός

της μορφής:

στοιχεία _ υπαλλήλου ( όνομα( όνομα( Όνομα) ,επώνυμο( Επώνυμο), πατρώνυμο( Πατρών ) ), . διεύθυνση( οδός( Οδός), αριθμός( Αριθμός), πόλη(Πόλη),τκ(Τκ), τηλ (Τηλ) ), μισθός( βασικός( Βασικός), κρατήσεις(Κρατήσεις), επιδόματα( Επιδόματα) ) ).

Page 28: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

25

Το πρόγραμμα είναι:

ΟΝΟΜΑΤΕΠΩΝΥΜΟ ΔΙΕΥΘΥΝΣΗ ΜΙΣΘΟΣ

Όνομα Επώνυμο Πατρών. Οδός Αριθμό

Πόλη Τ.Κ Τηλέφωνο Βασικός Κρατ(%) Επίδ(%)

Νίκος Νικολάου Μηνάς Ερμού 33 Αθήνα 12345 3311111 55.000 20 35 Γιώργος Γεωργίου Νίκος Φωκά 29 Αθήνα 34231 4411332 59.500 25 36 Αντώνης Αντωνίου Πέτρας Ρήγα 15 Πάτρα 44556 233445 65.000 19 40 … . . . . . . . .. ... … … … … … . . . … . . . . . . . .. ... … ... … ... . . . . . . … . . . . . . . .. …. … ... … … . . . . . .

στοιχεία _ υπαλλήλου ( όνομα(όνομα( νίκος) ,επώνυμο(νικολάου),

πατρώνυμο(μηνάς) ) , διεύθυνση ( οδός( ερμού), αριθμός( 33 ), πόλη( αθήνα), τκ( 12345), τηλ( 3311111), μισθός( βασικός( 55000), κρατήσεις(20), επιδόματα( 35 ) ) ) .

στοιχεία _ υπαλλήλου ( όνομα( όνομα( γιώργος), επώνυμο( γεωργίου), πατρώνυμο( νίκος) ), διεύθυνση( οδός( Φωκά) ,αριθμός( 29), πόλη( αθήνα), τκ( 34231), τηλ( 4411332) ), μισθός( βασικός( 59500) ,κρατήσεις( 25), επιδόματα( 38 ) ) ).

στοιχεία _ υπαλλήλου ( όνομα( όνομα( αντώνης). επώνυμο( αντωνίου), πατρώνυμο( πέτρος) ), διεύθυνση ( οδός( ρήγα),αριθμός( 15), πόλη( πάτρα), τκ( 44556 ), τηλ( 233445) ) , μισθός( βασικός ( 65000) ,κρατήσεις ( 19), επιδόματα( 40 ) ) ). Με βάση το πρόγραμμα αυτό η ερώτηση "Ποια είναι τα επώνυμα των υπαλλήλων που μένουν στην Αθήνα;" διατυπώνεται:

? στοιχεία _ υπαλλήλου ( όνομα(_,επώνυμο( Επών ),_),

διεύθυνση (_,_πόλη( αθήνα)_,_) ,_). ενώ η ερώτηση "Ποια είναι τα τηλέφωνα των υπαλλήλων που μένουν στην Αθήνα;" διατυπώνεται:

? στοιχεία _ υπαλλήλου (_.διεύθυνση (_,_πόλη( αθήνα) ,_,τηλ(Τ) ),_).

Page 29: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

26

Ακόμη, η ερώτηση "Ποια είναι τα στοιχεία της διεύθυνσης του υπαλλήλου με επώνυμο Γεωργίου;" διατυπώνεται σε Prolog

? στοιχεία _ υπαλλήλου ( όνομα(_,επώνυμο( γεωργίου ),_),Δ,_).

Η απάντηση σ' αυτή την ερώτηση δίνει σαν τιμή της μεταβλητής Δ το σύνθετο όρο διεύθυνση(οδός(φωκά), αριθμός(29), πόλη(αθήνα), τκ(34231), τηλ( 4411332)). Ένας σύνθετος όρος μπορεί να παρασταθεί σχηματικά με ένα δέντρο. Οι κόμβοι του δέντρου αυτού είναι τα συναρτησιακά σύμβολα του σύνθετου όρου ενώ τα παιδιά του κάθε κόμβου είναι οι υποόροι που περιλαμβάνει ο σύνθετος όρος.

2.4 ΑΝΤΙΚΕΙΜΕΝΑ ΤΗΣ PROLOG

Στις προηγούμενες ενότητες είδαμε ότι ένα πρόγραμμά Prolog αποτελείται από γεγονότα και κανόνες , δηλαδή , σε τελευταία ανάλυση , από σχέσεις. Μια σχέση είναι ένα κατηγόρημα ,το οποίο συνδέει ένα σύνολο αντικειμένων τα οποία ονομάσαμε και όρους του κατηγορήματος π.χ. η σχέση αγαπάει(νίκος, σοφία). αποτελείται από το κατηγόρημα αγαπάει και συνδέει δύο αντικείμενα νίκος και σοφία, που είναι, στη συγκεκριμένη περίπτωση, σταθερές.

Τα αντικείμενα που μπορούν να παίξουν το ρόλο παραμέτρων μιας σχέσης είναι: οι σταθερές, οι μεταβλητές. Σε μια πρώτη φάση θα προσπαθήσουμε να εξετάσουμε τι εννοούμε λέγοντας σταθερά και τι μεταβλητή, καθώς και πώς τις γράφουμε στην Prolog. Τα αντικείμενα μίας γλώσσας μπορούμε να τα διαχειριστούμε μέσω των εντολών της. Έτσι, Π.χ., η Basic επεξεργάζεται (μεταξύ άλλων) strings, η Pascal πίνακες, η LISP λίστες κλπ. Για να γίνει αυτό, κάθε γλώσσα διαθέτει προκαθορισμένες εντολές (LΕΤ, WHILE, CDR κλπ), με τη βοήθεια των οποίων ο προγραμματιστής θα υλοποιήσει τον αλγόριθμο. Στην Prolog θα μιλήσουμε για προκαθορισμένα (προσηλωμένα, προκατασκευασμένα) κατηγορήματα, δηλαδή για προκαθορισμένες σχέσεις.

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

Page 30: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

27

κτο. Η χρήση των προκαθορισμένων κατηγορημάτων γίνεται συνήθως για δύο λόγους (που λίγο-πολύ, ισχύουν σε όλες τις γλώσσες προγραμματισμού):

Η χρήση τους είναι συχνή και κοινή σε πολλές εφαρμογές (π.χ. εντολές εισόδου/εξόδου).

Η υλοποίησή τους απαιτεί πληροφορίες που αφορούν την εσωτερική δομή της γλώσσας ή του υπολογιστή.

Πλεονέκτημα των προκαθορισμένων εντολών είναι ότι βελτιώνουν ένα πρόγραμμα, προσφέροντας του τυποποιημένες και ταχύτερες (στο βαθμό που η υλοποίηση τους έγινε από κάποιον έμπειρο τεχνικό της εταιρίας) λειτουργίες. ¨Όσο πιο πολλές προκαθορισμένες λειτουργίες προσφέρονται στον προγραμματιστή, τόσο πιο ισχυρά και ευέλικτα θα είναι τα προγράμματά του. Υπάρχει όμως και η άλλη όψη του νομίσματος. Η πληθώρα των προκαθο-ρισμένων εντολών δυσχεραίνει συχνά το πέρασμα του πηγαίου κώδικα σ' ένα διαφορετικό υπολογιστή, που χρησιμοποιεί διάλεκτο της γλώσσας, η οποία δεν διαθέτει αναγκαστικά το ίδιο σύνολο εντολών.

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

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

2.4.1 ΟΙ ΣΤΑΘΕΡΕΣ Οι σταθερές εκφράζουν ένα συγκεκριμένο αντικείμενο. Οι σταθερές χωρίζουν σε δυο τάξεις : Στα άτομα και στους ακεραίους. ¨Ένα άτομο, αρχίζει πάντα με μικρό γράμμα και δεν περιλαμβάνει στο εσω-τερικό του κανέναν ειδικό χαρακτήρα(όπως το κενό ή οι μη-αλφαριθμητικοί χαρακτήρες). Χρησιμοποιώντας όμως τα απλά εισαγωγικά, είμαστε σε θέση να χρησιμοποιήσουμε ότι είδους χαρακτήρα επιθυμούμε στο εσωτερικό ενός ατόμου. Επίσης επιτρέπεται η χρήση του χαρακτήρα '_' (underscore) στο εσωτερικό ενός ατόμου. Ας δούμε μερικά παραδείγματα ατόμων : μαρία πέτρος_ και _ μαρία γιάννης α ‘ήρθε σήμερα’ α173 ένα_ σπίτι

Page 31: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

28

και μερικά παραδείγματα μη-ατόμων: 2034ih δεν αρχίζει από γράμμα α-β υπάρχει το '-' ενδιάμεσα Πέτρος από κεφαλαίο (είναι μεταβλητή) Όσο για τη δεύτερη κατηγορία σταθερών, που είναι οι ακέραιοι, έχουμε ίδιο ορισμό με αυτόν που βρίσκουμε στις περισσότερες γλώσσες προγραμματισμού: Ο ή 7 ή 999 Υπάρχουν μερικές Prolog που μπορούν να διαχειριστούν και αρνητικούς ακέραιους, καθώς και πραγματικούς αριθμούς. Αυτό εξαρτάται από τον υπο-λογιστή και την έκδοση της Prolog που έχετε στη διάθεσή σας. Η Prolog διαχειρίζεται επίσης και χαρακτήρες αλλά τους αντιμετωπίζει συνήθως σαν ASCII κώδικες (μικροί ακέραιοι).

2.4.2 Οι μεταβλητές

Οι μεταβλητές παίζουν το ρόλο των άδειων δοχείων που μπορούν να γεμί-σουν και να ξαναδειάσουν κατά τη διάρκεια της εκτέλεσης ενός προγράμματος Prolog. Για να συμβολίσουμε ότι ένα αντικείμενο είναι μεταβλητή στην Prolog, αρκεί το πρώτο γράμμα του να είναι κεφαλαίο ή ο χαρακτήρας '_'. χ Πέτρος Ποιος Γιατί Α _Β _ αβγ _43

Μια ενδιαφέρουσα περίπτωση μεταβλητής είναι η ανώνυμη μεταβλητή. Χρη-σιμοποιούμε την ανώνυμη μεταβλητή για να εκφράσου με στην Prolog ότι, σ' ένα συγκεκριμένο σημείο της σχέσης; δεν μας ενδιαφέρει με τι θα γίνει η ενο-ποίηση, δεδομένου ότι δεν πρόκειται να τη χρησιμοποιήσουμε στη συνέχεια. Ας δούμε ένα συγκεκριμένο παράδειγμα. Έστω το ακόλουθο πρόγραμμα: γυναικά (νίκος, σοφία) γυναίκα( δημήτρης, ελένη ) γυναίκα (αλέξης, νεφέλη) γυναίκα (αλέξανδρος, δανάη) πλούσια( ελένη) πλούσια(δανάη)

Page 32: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

29

πλούσιος( Χ):- γυναίκα (Χ, Υ ), πλούσια(Υ).

Ο τελευταίος κανόνας εκφράζει την πληροφορία ότι κάποιος είναι πλούσιος, όταν και η γυναίκα του είναι πλούσια. Με αυτό το πρόγραμμα έχουμε τον εξής διάλογο: ? γυναικά(δημήτρης, Ποια). Ποια =ελένη ? πλούσιος(Μίδας). Μίδας= δημήτρης Μίδας= αλέξανδρος

2.5 ΕΝΟΠΟΙΗΣΗ-ΤΑΥΤΟΠΟΙΗΣΗ

Ας προσπαθήσουμε, τώρα, να εκφράσουμε έναν κανόνα που να μας υποδεικνύει πότε κάποιος είναι παντρεμένος:

παντρεμένος(Χ) :- γυναικά(Χ, Υ). με την έννοια ότι κάποιος είναι παντρεμένος, όταν έχει μια σύζυγο.

Ας προσπαθήσουμε, τώρα, να συγκρίνουμε τη μεταβλητή Υ του κανόνα πλούσιας και τη μεταβλητή Υ του κανόνα παντρεμένος. Η πρώτη Υ εμφανί-ζεται δύο φορές, στο βαθμό που, αν βρούμε τη σύζυγο του Χ, πρέπει επίσης να επαληθεύσουμε στη συνέχεια ότι η ίδια Υ είναι πλούσια. Αντίθετα, στον κανόνα παντρεμένος, η Υ εμφανίζεται μόνο και μόνο για να εκφράσου με ότι δεν μας ενδιαφέρει ποια θα είναι η γυναίκα του και ότι δεν πρόκειται να χρη-σιμοποιήσουμε τη σταθερά, με την οποία δεσμεύτηκε, στη συνέχεια του κανόνα. Αυτή είναι η κλασική περίπτωση της ανώνυμης μεταβλητής, που συμβολίζεται με το '_' μόνο του. Έτσι, ο τελευταίος κανόνας θα γραφτεί σωστότερα:

παντρεμένος(Χ) :- γυναικά(Χ, - ).

Αυτό, φυσικά, δεν είναι αναγκαίο αν και μερικές Prolog εδώ θα παραγάγουν μήνυμα προειδοποίησης, (Warning). Πρέπει, όμως, να καταλάβουμε ότι, χρησιμοποιώντας ανώνυμες μεταβλητές όπου μπορούμε, διευκολύνουμε αισθητά τη διαδικασία ενοποίησης της Prolog. Αν στην προκειμένη περίπτωση είχαμε χρησιμοποιήσει μια κλασική επώνυμη μεταβλητή Υ στον κανόνα και ρωτούσαμε:

? παντρεμένος(δημήτρης).

Page 33: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

30

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

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

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

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

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

Το πρώτο γεγονός σημαίνει ότι ο Κος Ποταμιάνος ήρθε τη Δευτέρα και έφυγε την Πέμπτη. Ας υποθέσουμε τώρα ότι ο ξενοδόχος θέλει να μάθει ποιοι είναι οι πελάτες (μεταβλητή Χ) που ήρθαν κι έφυγαν την ίδια μέρα (ίδια με-ταβλητή Μ). Η αρχική ερώτηση θα διατυπωθεί ως εξής:

? πελάτης(Χ, Μ, Μ). Η Prolog, όπως είδαμε και προηγουμένως, θ' αναλύσει την αρχική ερώτηση

και θ' ανακαλύψει ότι αποτελείται από μία σταθερά πελάτης (που είναι το όνομα του κατηγορήματος) και τρεις όρους. Θα κατασκευάσει έτσι την πρώτη σειρά: πελάτης, Χ, Μ, Μ.

Page 34: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

31

Αρχίζει τώρα ν' αναλύει ένα-ένα τα γεγονότα του προγράμματός μας. Με το πρώτο γεγονός πελάτης(ποταμιάνος, δευτέρα, πέμπτη) κατασκευάζει τη σειρά : πελάτης, ποταμιάνος, δευτέρα, πέμπτη. Συγκρίνοντας τις δύο σειρές βλέπει ότι οι δύο πρώτες σταθερές συμπίπτουν. Συνεχίζοντας δεξιότερα, η Χ δεσμεύεται με τη σταθερά ποταμιάνος και το σύνολο των ενοποιήσεων γίνεται {Χ/ποταμιάνος}. Στη συνέχεια, η μεταβλητή Μ δεσμεύεται με τη σταθερά δευτέρα και το σύνολο ενοποιήσεων αυξάνεται σε {Χ/ποταμιάνος, Μ/δευτέρα}. Όμως, η ενοποίηση της τελευταίας παραμέτρου (Μ) της αρχικής ερώτησης με την τελευταία παράμετρο του πρώτου γεγονότος (πέμπτη) αποτυγχάνει, δεδομένου ότι η Μ είναι ήδη δεσμευμένη (από την προηγούμενη ενοποίηση) με τη σταθερά δευτέρα (το αντίστοιχο δοχείο είναι ήδη "γεμισμένο" με το υγρό δευτέρα). Με άλλα λόγια, οι δύο σειρές πελάτης, Χ, Μ, Μ και πελάτης, ποταμιάνος, δευτέρα, πέμπτη ΔΕΝ είναι ενοποιήσιμες.

Ύστερα από αυτή την αποτυχία, η Prolog θα περάσει στο δεύτερο γεγονός του προγράμματός μας πελάτης(μηλαράκης, κυριακή, κυριακή) και θα το συγκρίνει πάντα με την αρχική ερώτηση. Σ' αυτό το σημείο θα πρέπει να υπο-γραμμισθεί ότι όλες οι μεταβλητές είναι εκ νέου ελεύθερες σαν να μην είχε συμβεί τίποτα.

Συγκρίνει δηλαδή τη σειρά πελάτης, Χ, Μ, Μ (που αντιστοιχεί πάντα στην αρχική ερώτηση) με τη σειρά πελάτης(μηλαράκης, κυριακή, κυριακή). Όπως και πριν, μετά την τρίτη σύγκριση, το σύνολο ενοποιήσεων θα είναι: {Χ/μηλαράκης, Μ/κυριακή}. Αυτή τη φορά όμως, η τελευταία σταθερά είναι ίδια με την προηγούμενη, οπότε η ενοποίηση είναι επιτυχής. Η Prolog κατάφερε να βρει ένα γεγονός του προγράμματός μας, το οποίο ενοποιείται με την αρχική ερώτηση. Μας ειδοποιεί γι' αυτό, δίνοντας μας τις δεσμεύσεις που προέκυψαν για τις μεταβλητές της ερώτησης : Χ= μηλαράκης Μ= κυριακή

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

Χ= καραπούλιος Μ= δευτέρα και αυτό μέχρις ότου εξαντλήσει όλα τα γεγονότα του προγράμματος και τερ-ματίσει. Ας κάνουμε τώρα μία σύνθετη ερώτηση: "Ποιος είναι ο πελάτης που ήρθε την τρίτη και ποιος είναι ο πελάτης που ήρθε την ημέρα αναχώρησης του πρώτου;"

? πελάτης(Π 1, τρίτη, Α), πελάτης(Π2, Α, Β).

Page 35: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

32

Π1 και Π2 είναι οι μεταβλητές που αντιστοιχούν στους πελάτες, Α είναι η ημέρα αναχώρησης του πρώτου, που είναι η ίδια με την ημέρα άφιξης του δεύτερου, και Β είναι η ημέρα αναχώρησης του δεύτερου.

Η Prolog θα προσπαθήσει ν' αποδείξει την πρώτη σχέση πελάτης(ΠΙ, τρίτη, Α). Συγκρίνοντας, όπως και πριν, τη σχέση αυτή με τα γεγονότα του προγράμματός μας, θα βρει στο τρίτο γεγονός το σύνολο ενοποίησης Ε={ΠΙ/γρίβας, Α/τετάρτη}. Αντί, όμως, να μας απαντήσει, θα συνεχίσει, για ν' αποδείξει τη δεύτερη σχέση της ερώτησής μας πελάτης(Π2, Α, Β), δεδομένου ότι χρησιμοποιήσαμε ένα 'και'. Κατά τη διάρκεια αυτής της έρευνας θα πρέπει να λάβει υπ' όψη το ήδη υπάρχον σύνολο ενοποιήσεων Ε. Έτσι, στην πραγματικότητα, στη δεύτερη φάση η έρευνα ανάγεται στην απόδειξη του πελάτης(Π2, τετάρτη, Β). Αρχίζοντας, φυσικά, από την αρχή του προγράμματος, βρίσκει ότι μόνο το τελευταίο γεγονός ικανοποιεί αυτή την ερώτηση.

'Έτσι η Prolog θα σταματήσει και θα μας απαντήσει: Π1 =γρίβας Α= τετάρτη Π2=φωτιάδης Β= παρασκευή. Η ταυτοποίηση είναι βασικό στοιχείο του υπολογισμού στην Prolog αποτελεί η διαδικασία ταυτοποίησης (unification) ατομικών τύπων. Με τη διαδικασία αυτή βρίσκεται ο πιο γενικός ταυτοποιητης (most general unifier) δηλαδή ένα σύνολο από στοιχειώδεις αντικαταστάσεις (substitutions) οι οποίες αν γίνουν στις μεταβλητές των ατομικών τύπων τους καθιστούν ταυτόσημους. Η εύρεση του πιο γενικού ταυτοποιητή γίνεται με τη βοήθεια του αλγορίθμου ταυτοποίησης (unification algorithm ). Ο αλγόριθμος ταυτοποίησης στηρίζεται στους εξής κανόνες :

Μια μεταβλητή χωρίς τιμή ταυτοποιείται με οτιδήποτε (σταθερά μεταβλητή ή σύνθετο όρο). Σαν αποτέλεσμα της ταυτοποίησης αυτής η μεταβλητή παίρνει για τιμή τη σταθερά ή το σύνθετο όρο με τον οποίο ταυτοποιείται. Όταν και οι δύο όροι είναι μεταβλητές χωρίς τιμή τότε οι μεταβλητές αυτές ενοποιούνται έτσι ώστε οποιαδήποτε. τιμή πάρει αργότερα μια από αυτές γίνεται αυτόματα και τιμή της άλλης.

Μια σταθερά ταυτοποιείται μόνο με τον εαυτό της.

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

Σημείωση: Όταν μια μεταβλητή ταυτοποιεΙται με ένα σύνθετο όρο τότε ο όρος

αυτός πρέπει να ελεγχθεί ότι δεν περιλαμβάνει μεταξύ των όρων του τη

μεταβλητή αυτή. Συνήθως έλεγχος αυτός (occurs check) παραλείπεται

Page 36: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

33

προκειμένου ο αλγόριθμος ταυτοποίησης να είναι γραμμικός και όχι εκθετικός

με αποτέλεσμα ο μηχανισμός απόδειξης της Prolog να μην είναι ορθός

(sound). Στην περίπτωση αυτή είναι ευθύνη του προγραμματιστή να

εξασφαλίσει ότι δεν θα εμφανιστεί τέτοια περίπτωση, να ταυτοποιηθεΙ δηλαδή

μια μεταβλητή με όρο που να την περιλαμβάνει.

2.6 ΤΕΛΕΣΤΕΣ

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

Οι τελεστές και οι ιδιότητές τους

Τόσο οι ατομικοί τύποι όσο και οι σύνθετοι όροι της Prolog , ορίστηκαν με τη

γενική μορφή: συμβολικό _όνομα(Ορίσματα)

Η μορφή αυτή χαρακτηρίζεται σαν προσημασένη παρενθεσιακή μορφή(prefix notation), και αυτό γιατί το συμβολικό όνομα (predicate ή functor) προηγείται, και τα ορίσματα περικλείονται σε παρενθέσεις. Σε ατομικούς τύπους ή σε σύνθετους όρους με ένα ή δύο ορίσματα μπορεί, όπως θα δούμε, να χρησιμοποιηθεί και μια άλλη μορφή παράστασης που βρίσκεται πιο κοντά στις παραστάσεις που χρησιμοποιεί ο άνθρωπος. Η μορφή αυτή δεν χρησιμοποιεί παρενθέσεις και έχουμε τις παρακάτω δυνατές περιπτώσεις: α) για τους ατομικούς τύπους ή σύνθετους όρους με ένα όρισμα υπάρχουν οι εξής δύο παραστάσεις: (ι)συμβολικό όνομα όρισμα: Η παράσταση αυτή ονομάζετε προσημασένη (prefix) (ιι)όρισμα συμβολικό όνομα:Η παράσταση αυτή ονομάζεται μετασημασμένη (postfix). (β) για τους ατομικούς τύπους ή σύνθετους όρους με δύο ορίσματα έχουμε την ενδοσημασμένη (infiχ) μορφή: όρισμα1 συμβολικό όνομα όρισμα2

Page 37: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

34

Φυσικά και στις παραπάνω παραστάσεις (α ,β) μπορούν τα ορίσματα να είναι σύνθετοι όροι που με τη σειρά τους μπορούν να παρασταθούν όποιες από τις δύο μορφές θέλουμε, δηλαδή την παρενθεσιακή προσημασμένη ή τις μορφές (α, β) που δεν χρησιμοποιούν παρενθέσεις.

Παρακάτω θα δούμε ποιες είναι οι απαραίτητες επαυξήσεις της Prolog ώστε να δέχεται τις μη παρενθεσιακές αυτές μορφές.

Η Prolog έχει μία, αυστηρή σύνταξη, την οποία πρέπει να τηρήσουμε, για να μη δημιουργούμε λάθη. Κάτι αντίστοιχο σημαίνει όταν θέλουμε να υπο-λογίσουμε έναν αριθμητικό τύπο. Π.χ. α = β + γ2. Θα υπολογίσουμε πρώτα το γ2 και ύστερα θα το προσθέσουμε στο β. Επ' ουδενί λόγω, όμως, δεν θα προ-σθέταμε το β στο γ πριν την ύψωση στο τετράγωνο. Αντίθετα, κάτι τέτοιο θα συνέβαινε αν γράφαμε: α = ( β +γ )2.

Συμπεραίνουμε ότι η έκφραση μιας αριθμητικής πράξης (ή μιας σχέσης στην

Prolog) στηρίζεται στην τήρηση ορισμένων πρoτεραιoτήτων. Στο πρώτο παράδειγμά μας, πρώτα θα υψώσουμε στο τετράγωνο και ύστερα θα προσθέσουμε. Θα μπορούσαμε να αναρωτηθούμε "Τι είναι οι αριθμητικές Πράξεις;". Η Πληροφορική γενικεύει την έννοια της αριθμητικής πράξης, χρη-σιμοποιώντας τον όρο τελεστής (operator). Ένας τελεστής έχει σαν ρόλο να εφαρμοστεί σε έναν, δύο, ή περισσότερους όρους (operands), για να εκφράσει μία σχέση ή να μας δώσει ένα αποτέλεσμα (όπως, Π.χ. στην πρόσθεση 5+4 έχουμε τον τελεστή + της πρόσθεσης και τα αντικείμενα 5 και 4. Στην Prolog συναντήσαμε πολλούς τελεστές (χωρίς να το συνειδητοποιήσουμε, οι οποίοι δεν έχουν πάντα τις ίδιες ιδιότητες με τους γνωστούς αριθμητικούς τελεστές (πρόσθεση, αφαίρεση κλπ). Ένα παράδειγμα είναι ο τελεστής διαχωρισμού μίας λίστας σε κεφαλή και ουρά (σύμβολο Ι ).

Έτσι, Π.χ. όταν γράψουμε

Α = [Β| Γ] κάνουμε κάτι ανάλογο με το να γράφαμε στην αριθμητική: α = β + γ Στη δεύτερη περίπτωση, πρέπει να προσθέσουμε (τελεστής +) το β με το γ, ενώ στην πρώτη πρέπει να διαχωρίσουμε την αρχική μας λίστα σε κεφαλή και ουρά (τελεστής Ι ). Η αναλογία, όμως, σταματάει εδώ, αφού ως προς μεν την πρόσθεση μπορούμε να γράψουμε α = β+ γ+ δ

χωρίς να έχουμε κάνει λάθος, στη δε Prolog δεν μας επιτρέπεται να

γράψουμε Α = [Β Ι Γ Ι Δ]

Page 38: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

35

καθότι η Prolog δεν ξέρει τι διαχωρισμό να πραγματοποιήσει. Κάτι τέτοιο δεν συνέβαινε ούτε με την πρόσθεση ούτε με την αφαίρεση. Αυτό οφείλεται στην έλλειψη προσεταιριστικότητας του τελεστή Ι (δηλαδή ούτε δεξιά, ούτε αριστε-ρή). Μ' άλλα λόγια, αυτός ο τελεστής διαχωρισμού δεν αποδέχεται τελεστές 1ΙΕ την ίδια προτεραιότητα ούτε δεξιά του, ούτε αριστερά του, σε αντίθεση με τους κοινούς αριθμητικούς τελεστές. Η έννοια του τελεστή καλύπτει μια έννοια ευρύτερη από εκείνην της αριθμητικής πράξης. Ένας τελεστής είναι μία συνάρτηση, που εφαρμόζεται σε αντικείμενα που είναι οι παράμετροί της (οι όροι του τελεστή). Ένας τελεστής χαρακτηρίζεται από τις εξής ιδιότητες: 1. Προτεραιότητα 2. Κατεύθυνση προσεταιριστικότητας (αριστερά, δεξιά) 3. Αριθμός όρων (παραμέτρων) 4. Θέση του τελεστή σε σχέση με τους όρους

Η Prolog μας επιτρέπει να δημιουργήσουμε νέους τελεστές. Κάθε φορά που θα κατασκευάσουμε ένα νέο τελεστή, θα πρέπει να καθορίσουμε στην Prolog το σύμβολο που τον απεικονίζει και τις τέσσερις ιδιότητες που αναλύσαμε. Για να γίνει αυτό, θα χρησιμοποιήσουμε την εντολή ορ (που είναι σύντμηση της λέξης operator).

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

? ορ(80, y f x, Τ). Ο πρώτος ακέραιος εκφράζει τη σειρά με την οποία πρέπει να γίνει η πράξη, όπου εμφανίζεται. Αν υποθέσουμε, δηλαδή, ότι η πρόσθεση έχει αντίστοιχη σειρά 31, τότε στον τύπο a T b + c Όσο μεγαλύτερη είναι η προτεραιότητα ενός τελεστή, τόσο μικρότερη είναι η σειρά του, την οποία θα εκφράσου με σαν πρώτη παράμετρο της εντολής ορ της Prolog. Ας πάρουμε τώρα τη δεύτερη παράμετρο, που είναι η σταθερά-κωδικός yfx. Το γράμμα f συμβολίζει τον τελεστή και τα γράμματα x,y τους όρους του. Παρατηρούμε , κατ' αρχήν ότι ο τελεστής αποδέχεται δύο όρους και ότι τοπο-θετείται ανάμεσά τους. Η θέση, τώρα, του y σε σχέση με το x έχει σημασία, αφού καθορίζει την κατεύθυνση της προσεταιριστικότητας. Στο παράδειγμά

Page 39: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

36

μας, το y βρίσκεται αριστερά. Με άλλα λόγια, στο σημείο που έχει τοποθετηθεί το y (δηλαδή αριστερά) μπορούμε να χρησιμοποιήσουμε έναν οποιονδήποτε τελεστή με σειρά φυσικά μικρότερη του Τ, πράγμα που δεν μπορεί να γίνει δεξιά, γιατί χρησιμοποιήσαμε το x. Άρα, όταν γράψουμε: aTbTc O τύπος θα ερμηνευτεί ως (a b) Tc. Αντίθετα, αν είχαμε χρησιμοποιήσει σαν κωδικό τη σταθερά xfy, ο προηγούμενος τύπος θα ερμηνευόταν ως aT (bTc) Συνοπτικά υπάρχουν 8 δυνατότητες κωδικοποίησης των ιδιοτήτων των τελεστών που χρησιμοποιούμε : xfy yfx xfx yfy fx fy xf yf

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

Αριθμός αντικειμένων

Θέση τελεστή

Κατεύθυνση προσεταιριστικότητας

x:fy 2 ενδιάμεση δεξιά

yfx 2 ενδιάμεση αριστερά

xfx 2 ενδιάμεση όχι

yfy 2 ενδιάμεση αριστερά και δεξιά

fx 1 πριν όχι

fy 1 πριν δεξιά

xf 1 μετά όχι

yf 1 μετά αριστερά

Πριν δώσουμε ένα παράδειγμα κατασκευής νέου τελεστή, ας δούμε ενδεικτι-

κά ένα μέρος των γνωστότερων τελεστών που γνωρίζει εκ των προτέρων η Prolog

Page 40: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

37

και σε τι δηλώσεις ορ θα αντιστοιχούσαν:

ορ(255,xfx,:-). ορ(60,fy,not). ορ(40,xfx,is). ορ(40,xfx,>). ορ(31,yfx,-). ορ(31,yfx,+). ορ(21,yfx,/). ορ(21, yfx, *).

Εφαρμογές των τελεστών

Η Prolog επεκτείνει την έννοια του τελεστή στη σύνταξη των κατηγορημάτων.

Πράγματι, όταν γράφουμε το γεγονός

πίνει(γιάννης, γάλα). το κατηγόρημα πίνει μπορεί να ειδωθεί σαν ένας τελεστής που εφαρμόζεται σε δύο αντικείμενα (γιάννης και γάλα). Αν, τώρα, δηλώναμε αυτόν τον τελεστή ? ορ(500, xfy, πίνει). =ναι και γράφαμε μέσα στο πρόγραμμά μας γιάννης πίνει γάλα. μαρία πίνει νερό. πέτρος πίνει ουίσκι. .

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

ερωτήσεις μας. Π.χ.: ? μαρία πίνει Τι. Η Prolog ερμηνεύει αυτή την ερώτηση σαν να είχαμε γράψει: ? πίνει(μαρία, Τι).

Page 41: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

38

θα μας απαντούσε: Τι =νερό Η ίδια σύνταξη ισχύει και στο εσωτερικό του προγράμματος σ' έναν κανόνα. Αντί για παράδειγμα, να γράψουμε. αλκοολικός(Χ) :- πίνει(Χ, ουίσκι). Θα γράψουμε με τον ίδιο τρόπο αλκοολικός(Χ) :- Χ πίνει ουίσκι. και αν είχαμε δηλώσει ορ(500, xfy, είναι). τα πράγματα θα ήταν ακόμα πιο κατανοητά, αφού θα μπορούσαμε να γρά-ψουμε τον τελευταίο κανόνα ως εξής (ας μην ξεχνάμε ότι το σύμβολο :- ση-μαίνει όταν) : Κάποιος είναι αλκοολικός :- Κάποιος πίνει ουίσκι.

(Φυσικά, το ότι χρησιμοποιούμε τη μεταβλητή Κάποιος αντί της Χ δεν έχει καμία απολύτως σημασία).

Θα είχαμε τότε:

? Ποιος είναι αλκοολικός. Ποιος =πέτρος

Χρησιμοποιώντας, τώρα, περισσότερους τελεστές, μπορούμε να εμπλουτί-σουμε τις φράσεις μας ορ(400, fx, ο). ορ(300, fx, μία). Το γεγονός ο γιάννης πίνει μία λεμονάδα. θα ερμηνευτεί σαν να είχαμε γράψει: πίνει(o(γιάννης), μία(λεμονάδα)).

Page 42: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

39

Πώς κατασκευάστηκε αυτό το γεγονός; Πρώτα απ' όλα, η Prolog διάλεξε τον τελεστή με τη μικρότερη σειρά και, άρα, με τη μεγαλύτερη προτεραιότητα. Ο τελεστής αυτός είναι η λέξη μία με αριθμό 300, οπότε η φράση έγινε: ο γιάννης πίνει μία(λεμονάδα). Μετά ασχολήθηκε με τον τελεστή με σειρά 400 :

Ο(γιάννης) πίνει μία(λεμονάδα). Και τέλος, με τον τελεστή με αριθμό 500 ; πίνει( o(γιάννης), μία(λεμονάδα)). Θα παρατηρήσατε ότι ο κωδικός που χρησιμοποιήθηκε για τον τελεστή-άρθρο ο είναι fx. Πράγματι, πρόκειται για έναν τελεστή που αφορά ένα μόνο αντικείμενο (το ουσιαστικό), που βρίσκεται μετά απ' αυτόν. Η χρήση του χ υποδεικνύει ότι μια φράση του τύπου ο γιάννης δεν είναι σωστή, στο βαθμό που, μετά το άρθρο, εμφανίζεται ένας τελεστής με ίδια προτεραιότητα, δηλαδή το ίδιο το άρθρο. Αν χρησιμοποιήσουμε έναν όρο σε μορφή δέντρου, δεν είναι παρά μία ευκολία έκφρασης και δεν επηρεάζει τον αποδεικτικό μηχανισμό της Prolog, παρά μόνο κατά τη διάρκεια της ενοποίησης. Αν, δηλαδή εκφράσουμε το γεγονός: πατέρας( φίλος( άλκης, γιώργος), νίκος). ? πατέρας(φίλος(άλκης, Χ), Ζ). Prolog θα μας απαντήσει: Χ= γιώργος Ζ= νίκος Οι απαντήσεις αυτές προέκυψαν από τις ενοποιήσεις που πραγματοποίησε Prolog και είναι άσχετες με το αν το γεγονός φίλος( άλκη, γιώργος) προκύ-πτει σαν αληθές από το πρόγραμμά μας (υπάρχει δηλαδή σαν γεγονός ή συ-νάγεται από κάποιον κανόνα). Σε τέτοιου είδους συντάξεις μπορούμε να χρη-σιμοποιήσουμε Π.χ. το ορ(100, xfy, φίλος). και να γράψουμε το προηγούμενο γεγονός πατέρας(άλκης φίλος γιώργου, Ζ). στο πρόγραμμά μας. Ένας τελεστής μπορεί επομένως να παρομοιαστεί με τη ρίζα ενός δέντρου. Βλέπουμε λοιπόν, ότι η δημιουργία ενός τελεστή μας επιτρέπει να υιοθετήσουμε τη σύνταξη που επιθυμούμε για να καταγράψουμε μια σχέση (ή ένα δομημένο όρο), χωρίς να είμαστε αναγκασμένοι να χρησιμοποιήσουμε την κλασσική σύνταξη της Prolog,

Page 43: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

40

δηλαδή: κατηγόρημα(παράμετρος, παράμετρος2,κτλ) Πρόγραμμα με τελεστές

Η Prolog γνωρίζει τις ιδιότητες του κάθε τελεστή, όταν διαβάζει το αρχείο. Ας πάρουμε ένα παράδειγμα: Ας υποθέσουμε ότι, σ' ένα αρχείο με το όνομα επαναστάσεις, έχουμε γράψει το εξής πρόγραμμα γαλλική επανάσταση το 1789. ελληνική επανάσταση το 1821. γαλλική επανάσταση το 1848. γαλλική επανάσταση το 1968.

Επιθυμούμε τώρα να διαβάσουμε το αρχείο επαναστάσεις, αφού

εξηγήσουμε στην Ρrοlοg πώς να το ερμηνεύσει. Θ' ακολουθήσει ο διάλογος:

? ορ(100, fx, το). =ναι ? ορ(120, xfy, επανάσταση). =ναι ? cοnsuιt (επαναστάσεις). =ναι ? Ποια επανάσταση το 1968. Ποια= γαλλική

Το μειονέκτημα αυτής της μεθόδου ανάγνωσης του αρχείου είναι ότι κάθε

φορά, προτού χρησιμοποιήσουμε την εντολή consult, πρέπει να δηλώνουμε τους τελεστές. Θα ήταν πιο πρακτικό αν, κατά τη διάρκεια του διαβάσματος μέσα στο αρχείο, η Prolog καταλάβαινε ότι πρέπει να δημιουργήσει αυτούς τους τελεστές. Για να γίνει αυτό, θα χρησιμοποιήσουμε την "εντολή" :- την οποία είχαμε ήδη χρησιμοποιήσει για να διαχωρίσουμε το αριστερό σκέλος ενός κανόνα από το δεξιό. Γράφουμε τώρα το προηγούμενο πρόγραμμα ως εξής:

:- ορ(100, fx, το). :- ορ(120, xfy, επανάσταση). γαλλική επανάσταση το 1789. ελληνική επανάσταση το 1821. γαλλική επανάσταση το 1848. γαλλική επανάσταση το 1968. Κάνοντας, μετά: ? recοnsult (επαναστάσεις).

Page 44: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 2 - Η ΣΥΝΤΑΞΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗΝ PROLOG

41

Prolog θα διαβάσει το αντίστοιχο αρχείο και θα συναντήσει το σύμβολο :-,δηλαδή ένα είδος κανόνα χωρίς αριστερό σκέλος. Σ' αυτή την περίπτωση, υποδεικνύουμε στην Prolog ότι δεν πρέπει να ερμηνεύσει αυτό που ακολουθεί, σαν κάτι που ανήκει στο πρόγραμμα, αλλά να το εκτελέσει αμέσως, σαν να το είχαμε ζητήσει εμείς ρητά από έναν προηγούμενο διάλογο. Θα συνεχίσει ύστερα την ανάγνωση του αρχείου, σαν να μην είχε συμβεί τίποτε, αλλά θα ξέρει πλέον είναι οι τελεστές το και επανάσταση. Η εντολή:- είναι πάρα πολύ χρήσιμη, όταν θέλουμε να εκτελούμε ορισμένα πράγματα (π.χ. προκαθορισμένα γραφικά κατηγορήματα) την ίδια ώρα που διαβάζουμε (με το consult) ένα αρχείο Prolog. (Αυτή η λειτουργία είναι ανάλογη της εντολής include της Pascal). Ας υποθέσουμε π.χ. ότι, κατά τη διάρκεια της ανάγνωσης του αρχείου επανάσταση, πρέπει να διαβαστεί κι ένα δεύτερο (ας το ονομάσουμε επαναστάτες). Στην Prolog θα προσθέσουμε στην αρχή του αρχείου: :- cοnsuιt(επαναστάτες). Την ίδια εντολή θα χρησιμοποιήσουμε, αν θέλουμε να γνωρίζουμε πού βρίσκεται η Prolog κατά τη διάρκεια της ανάγνωσης. Σ' ένα οποιοδήποτε σημείο του προγράμματος θα γράψουμε π. χ, :- wrίte('Τώρα διαβάζω τα γεγονότα). και το μήνυμα αυτό θα εκτυπωθεί όταν η consult το συναντήσει. Μπορούμε επίσης να δημιουργήσουμε ένα γεγονός δυναμικά, μέσα στο ίδιο το αρχείο. :- assert (είναι(αρχείο, διαβασμένο)). Βλέπουμε, λοιπόν, ότι η εντολή consult, όχι μόνο προσθέτει το νέο

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

Page 45: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

42

ΕΝΟΤΗΤΑ 3

Η PROLOG ΩΣ ΓΛΩΣΣΑ

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

ΤΡΟΠΟΙ ΑΝΑΖΗΤΗΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ……… ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ PROLOG ………….

ΤΡΟΠΟΙ ΕΡΩΤΑΠΑΝΤΗΣΕΩΝ……………..........

ΜΕΘΟΔΟΙ ΑΝΑΠΑΡΑΣΤΑΣΗΣ ΓΝΩΣΗΣ............

ΠΛΕΟΝΕΚΤΗΜΑΤΑ ΚΑΙ ΜΕΙΟΝΕΚΤΗΜΑΤΑ….

ΕΤΟΙΜΑ ΠΡΟΓΡΑΜΜΑΤΑ ΣΕ PROLOG……….

Page 46: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

43

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

3.1 ΑΝΑΖΗΤΗΣΗ ΠΛΗΡΟΦΟΡΙΩΝ Κάποιος χώρος αναζήτησης θα μπορούσε να εμφανιστεί με τη μορφή ενός δέντρου ή μιας γράφου (με ή χωρίς κύκλους). Στην αρχική κατάσταση όπως και στην τελική ο κόμβος θα πρέπει να είναι μεγαλύτερος ή ίσος του 1. Το πρόβλημα της αναζήτησης επικεντρώνεται στην : Εύρεση ενός μονοπατιού από την αρχική κατάσταση στην τελική και στην Κατασκευή τελικής κατάστασης από την αρχική.

Η γενική μέθοδος αναζήτησης έχει ως εξής: Βήμα 1: Έστω L η λίστα των αρχικών κόμβων. Κάθε στιγμή το L είναι η λίστα των κόμβων που δεν έχουν εξετασθεί. Βήμα 2: Αν η L είναι κενή, απέτυχες. Αλλιώς, διάλεξε ένα κόμβο n από την L. Βήμα 3: Αν ο n είναι τελικός κόμβος, να τον επιστρέψεις, καθώς και το μονοπάτι από τον αρχικό κόμβο προς τον n, και να σταματήσεις. Βήμα 4: Αλλιώς, να διαγράψεις τον n από την L και να προσθέσεις στην L τα παιδιά του n, προσαρτώντας στο καθένα το μονοπάτι από τον αρχικό κόμβο προς αυτό. Πήγαινε στο βήμα 2.

Page 47: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

44

3.1.1 Τυφλή αναζήτηση (Blind search) Η τυφλή αναζήτηση περιλαμβάνει την πρώτα-κατά-βάθος αναζήτηση (depth first search), την πρώτα κατά πλάτος αναζήτηση (breadth first search).

3.1.1.1 Πρώτα-κατά-βάθος αναζήτηση (depth first search) Στην πρώτα-κατά-βάθος αναζήτηση κατά την εκκίνηση επιλέγεται το αρχικό γεγονός και στη συνέχεια κάποιο διαδοχικό του αρχικού και στη συνέχεια κάποιος διάδοχος του διαδόχου κ.λ.π . Συνήθως η επιλογή ανάμεσα στη διαδοχή ενός γεγονότος δεν είναι αυθαίρετη αλλά προερχόμενη από ευρυστική αναζήτηση. Αν τώρα η πρώτα-κατά-βάθος αναζήτηση φτάσει σε ένα γεγονός Γ χωρίς διαδόχους, ή αν όλοι οι διάδοχοι του γεγονότος Γ έχουν ήδη επιλεχθεί και ο στόχος δεν έχει επιτευχθεί ακόμη, επιστρέφει πίσω. Αυτό σημαίνει πως πηγαίνει στο αμέσως προηγούμενο γεγονός ή στον προκάτοχο του τυπικά το γεγονός Δ, του οποίου διάδοχος ήταν το Γ αρχικά. Ένα παράδειγμα θα είναι αυτό που θα ξεκαθαρίσει την κατάσταση. Αν θεωρήσουμε πως τα γράμματα είναι γεγονότα και έτσι το γεγονός Α είναι το αρχικό και το γεγονός Τ είναι το τελικό. Ας υποθέσουμε πως το κάθετο ύψος του γεγονότος χρησιμοποιείται για να ταξινομήσει τα γεγονότα όταν μια επιλογή είναι απαραίτητη, με τα υψηλότερα γεγονότα που έχουν να έχουν την υψηλότερη βαθμίδα. Η πρώτα-κατά-βάθος αναζήτηση θα επισκεφτεί πρώτα το Α στη συνέχεια τον Β και στη συνέχεια το Δ. Αλλά ο Δ δεν έχει διαδόχους έτσι επιστρέφουμε στο Β και προσπαθούμε με τον δεύτερο διάδοχο Ε . Αλλά δεν έχει ούτε αυτός διαδόχους έτσι επιστρέφουμε στον Β. Αλλά τώρα εφόσον έχουμε δοκιμάσει όλους τους διαδόχους του Β και δεν έχουμε βρει τον Τ πρέπει να επιστρέψουμε στον αρχικό μας κόμβο που είναι ο Α. Τώρα θα πάμε στον επόμενο διάδοχο που είναι ο Ζ. Αλλά ο Ζ δεν έχει καθόλου διαδόχους και επιστρέφουμε πάλι στον αρχικό μας κόμβο Α από εκεί πάμε στον τρίτο του διάδοχο τον Ν. Ο Ν έχει ένα διάδοχο τον Μ και ο Μ έχει άλλον ένα διάδοχο τον Τ. Έτσι φτάσαμε στον τελικό μας στόχο τον Τ. ¨Άρα λοιπόν το μονοπάτι που θα πρέπει να ακολουθήσουμε από τον Α για να φτάσουμε στον στόχο μας στον τελικό κόμβο δηλαδή είναι : Α-> Ζ-> Ν-> Μ-> Τ . Το πρόβλημα με την πρώτα-κατά-βάθος αναζήτηση είναι το εξής ότι λειτουργεί κανονικά μόνο αν τα γραφήματα αναζήτησης είναι δέντρα η δικτυωτά πλέγματα, αλλά μπορεί πολύ εύκολα να κολλήσει αν συναντήσει έναν άπειρο βρόγχο ή άλλες γραφικές παραστάσεις. Αυτό μπορεί να συμβεί γιατί η πρώτα-κατά-βάθος αναζήτηση θα ταξιδεύει γύρω από ένα κύκλο στη γραφική παράσταση για πάντα! Μια λύση είναι να κρατήσει σε μια αποτύπωση μια λίστα από γεγονότα όπου προηγουμένως έχει επισκεφτεί, και να μην δοθεί άδεια να επιστρέψει για αναζήτηση σε κανένα από αυτά. Η απαιτούμενη μνήμη είναι ανάλογη του αριθμού των κόμβων που έχουν φυλαχτεί για μελλοντική εξέταση όταν η αναζήτηση φτάσει για πρώτη φορά σε κάποιο κόμβο.

Page 48: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

45

Ο απαιτούμενος χρόνος είναι ανάλογος του αριθμού των επισκεπτόμενων κόμβων. Ο ελάχιστος αριθμός είναι (αν ο κόμβος –στόχος είναι ο πιο αριστερά κόμβος) και ο μέγιστος αριθμός είναι ίσος με το συνολικό αριθμό των κόμβων του δέντρου, δηλαδή αν ο κόμβος –στόχος είναι ο πιο δεξιά κόμβος). Η μέση τιμή του ελάχιστου και του μέγιστου δίνει τον αναμενόμενο αριθμό των κόμβων που θα εξετασθούν,

3.1.1.2 Πρώτα-κατά-πλάτος αναζήτηση (Breadth first search) H πρώτα-κατά-πλάτος αναζήτηση δεν έχει αυτόν τον κίνδυνο των απείρων βρόγχων, η κεντρική ιδέα βασίζεται στο να εξεταστούν τα γεγονότα κατά σειρά των αυξανόμενων αριθμών των κλάδων. ¨Έτσι πρώτα ελέγχουμε όλους τους άμεσους διαδόχους από την έναρξη, στη συνέχεια όλους τους άμεσους διαδόχους των κ. ο. κ εως ότου φτάσουμε στο γεγονός που είχαμε θέσει σαν στόχο. Για κάθε επίπεδο ονομάζουμε τα γεγονότα με κάποιο τρόπο όπως και στην πρώτα-κατά-βάθος αναζήτηση. Αν τώρα το Α είναι στο επίπεδο 0. Το Β, Γ , και το Δ είναι στο επίπεδο 1. Το Ε, Ζ, Τ είναι στο επίπεδο 2 και το Ρ, Σ, Ξ είναι στο 3 επίπεδο. Άρα η διαδρομή που θα πρέπει να ακολουθήσουμε θα πρέπει να είναι Α->Β->Γ->Δ->Ε->Ζ->Τ για να φτάσουμε στο στόχο μας. Η πρώτα-κατά-πλάτος αναζήτηση εγγυάται να βρει το γεγονός που έχουμε θέσει ως στόχο με την πρώτη αν βρίσκεται στο πρώτο επίπεδο, ενώ η πρώτα-κατά-βάθος αναζήτηση μπορεί να πάρει λίγο χρόνο. Οι βρόγχοι σε ένα γράφημα αναζήτησης μπορεί να προκαλέσουν ανεπάρκεια (άχρηστα επιπλέον μονοπάτια που εξετάζονται) σε αντίθεση με τους άπειρους βρόγχους επεξεργασίας. Αν αυτή η ανεπάρκεια είναι ενοχλητική, μπορούμε να χρησιμοποιήσουμε το ίδιο τέχνασμα με την πρώτα-κατά-βάθος αναζήτηση δηλαδή να κρατήσει σε μια αποτύπωση μια λίστα από γεγονότα όπου προηγουμένως έχει επισκεφτεί, και να την ελέγξει ξανά. Παρατηρήστε ότι δουλεύοντας ανά επίπεδο, οποιοδήποτε μονοπάτι βρίσκουμε προς το γεγονός δεν μπορεί να είναι πιο μικρό από το πρώτο μονοπάτι που βρίσκεται σε αυτό, έτσι το πρώτο μονοπάτι σε ένα γεγονός μπορεί να συγκριθεί με το καλύτερο. Η απαίτηση σε μνήμη της πρώτα –κατά –πλάτος αναζήτησης είναι ανάλογη του αριθμού των κόμβων, και οι απαιτήσεις σε χρόνο είναι ανάλογος του αριθμού των επισκεπτόμενων κόμβων

3.1.2 Ευρυστική μέθοδος αναζήτησης Η πρώτα-κατά-πλάτος αναζήτηση και η πρώτα-κατά-βάθος αναζήτηση είναι εύκολες ως προς την εφαρμογή αλλά συχνά ανεπαρκής ως προς τα δύσκολα προβλήματα. Έρευνες της τεχνητής νοημοσύνης έχουν βρει τις καλύτερες μεθόδους αναζήτησης. Μερικές από αυτές είναι η πρώτα-κατά-πλάτος αναζήτηση και η πρώτα-κατά-βάθος αναζήτηση. Δυο κοινές παραλλαγές είναι η αναζήτηση χρησιμοποιώντας την ευρυστική μέθοδο και αυτή της χρησιμοποίησης λειτουργιών αξιολόγησης. Ευρυστική μέθοδος αναζήτησης είναι οποιεσδήποτε μη αριθμητικές συμβουλές για το ποια διαταγή να δοκιμάσουν οι διάδοχοι ενός γεγονότος για την περαιτέρω

Page 49: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

46

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

Για τον προγραμματισμό μιας διαδρομής, ποτέ μην στρίβετε δυο φο0ρές συνεχόμενα δεξιά διότι θα φτάσετε στο μέρος από όπου ξεκινήσατε.

Για τον προγραμματισμό μιας διαδρομής, γυρίστε πίσω όταν δείτε πως έχετε αφήσει πίσω σας τα όρια της πόλεως.

Για την επισκευή ενός αυτοκινήτου ποτέ μην αφαιρείτε ένα μέρος εκτός και αν πιστεύετε πως αυτό βρίσκεται σε ένα άλλο μέρος που θεωρείται πως είναι ελαττωματικό.

Για την επισκευή ενός αυτοκινήτου, βγάλτε πρώτα τα μικρά κομμάτια.

Για την εξυπνότερη εμπροσθοδρόμηση ακολουθήστε τα γεγονότα που εμφανίζονται μαζί με αλλά γνωστά γεγονότα προς τη σωστή πλευρά ενός κανόνα.

Για την εξυπνότερη εμπροσθοδρόμηση για να οδηγηθείτε σε χρήσιμα συμπεράσματα ακολουθήστε τα γεγονότα που είναι σχετικά με τα δέκα τελευταία τρεξίματα.

Στην ευρυστική μέθοδο αναζήτησης δεν είναι όλα εξίσου πολύτιμα. Γι’ αυτό ας συγκρίνουμε: 1)Για την επισκευή ενός αυτοκινήτου, κάνουμε αρχικά τις μικρότερες δουλειές. 2)Για την επισκευή ενός αυτοκινήτου πρώτα βγάζουμε τα μικρά μέρη που συνδέονται με τα μέρη που θέλουμε να επισκευάσουμε. 3)Για την επισκευή ενός αυτοκινήτου, αρχικά παίρνουμε πρώτα τις βίδες από το μέρος από το οποίο θέλουμε να επισκευάσουμε. 4) Για την επισκευή ενός αυτοκινήτου, για να καθορίσετε τον συμπλέκτη πρέπει να βγάλετε έξω πρώτα τις βίδες του. 5) Για την επισκευή ενός αυτοκινήτου, για να επισκευάσετε τον συμπλέκτη βγάλτε πρώτα τις βίδες της πρόσοψης Η ευρυστική μέθοδο αναζήτησης εκτείνετε σε ένα φάσμα από το γενικό στο συγκεκριμένο. Οι πραγματικά γενικές συμβουλές #1 είναι δύσκολο να ισχύσουν (λόγω του ότι είναι δύσκολο να αποφασίσει το τι είναι «μικρή δουλειά») σε πολλές περιπτώσεις (θα συστήνανε εξίσου την αφαίρεση οποιασδήποτε βίδας στο αυτοκίνητο το μεγαλύτερο μέρος του οποίου είναι άσχετο). ¨Άλλο ακραίο ευρετικά

Page 50: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

47

#4 και #5 είναι πάρα πολύ συγκεκριμένα για να είναι χρήσιμα, και αν προσπαθούσαμε να εκτελέσουμε την ευρυστική μέθοδο αναζήτησης σε ένα πρόβλημα σαν αυτό της πρότασης #5 θα έπρεπε να χρησιμοποιήσουμε πολλές από αυτές έτσι ή πιθανότητα αναζήτησης πολύ πιθανών να μειωνόταν και όχι να αυξανόταν όπως είναι ο βασικός σκοπός της ευρυστικής μεθόδου αναζήτησης. Άρα σαν συμπέρασμα βγάζουμε πως οι καλύτερες προτάσεις της ευρυστικής μεθόδου αναζήτησης είναι οι #2 και η #3 που συμβιβάζονται μεταξύ των άκρων, πιθανώς η #3 είναι η καλύτερη διότι τα μικρά μέρη είναι πιο δύσκολο να καθοριστούν. Τα είδη των ευριστικών μεθόδων αναζήτησης είναι τα εξής:

Πρώτα –ο –καλύτερος (Best–first).

Αναρρίχηση λόφου (Hill climbing).

Προσομοιωμένη ανόπτηση (Simulated annealing).

IDA* (ID = Iterative Deepening).

3.1.2.1 Πρώτα –ο –καλύτερος (Best–first). Στο βήμα 2 της γενικής μεθόδου αναζήτησης επιλέγεται από την L ο κόμβος που βρίσκεται πλησιέστερα σε κόμβο –στόχο, όπως αυτό αποφασίζεται από μία κατάλληλα επιλεγμένη ευριστική συνάρτηση.

Page 51: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

48

L = {A/6} L = {B/3, C/5, D/1} L = {B/3, C/5, E/4, F/6} L = {G/6, H/5, C/5, E/4, F/6} L = {G/6, H/5, C/5, I/2, J/1, F/6} ............................................................

3.1.2.2 Αναρρίχηση λόφου Η μέθοδος της αναρρίχησης λόφου αποτελεί μία εξειδίκευση της “πρώτα –ο –καλύτερος” μεθόδου με τα εξής χαρακτηριστικά: – Η αναζήτηση γίνεται κατά μήκος ενός μόνο μονοπατιού στο χώρο αναζήτησης. – Η αναζήτηση προχωρά μόνο από διαδοχικά καλύτερους κόμβους. Βήμα 1: Τρέχων κόμβος είναι ένας από τους αρχικούς κόμβους. Βήμα 2: Αν ο τρέχω ν κόμβος είναι κόμβος –στόχος, τότε τελείωσες με επιτυχία. Βήμα 3: Αλλιώς, αν δεν υπάρχει απόγονος του τρέχοντος κόμβου που είναι “καλύτερος” από αυτόν, τότε απέτυχες. Βήμα 4: Τρέχων κόμβος είναι ένας από τους “καλύτερους” απογόνους του τρέχοντος κόμβου. Βήμα 5: Πήγαινε στο βήμα 2. • Αν στο βήμα 4 επιλέγεται ο “καλύτερος” από τους απογόνους, τότε η μέθοδος ονομάζεται αναρρίχηση λόφου από την πιο απότομη πλαγιά (steepest-ascent hill climbing). • Η μέθοδος της αναρρίχησης λόφου είναι πολύ αποδοτική σε ορισμένα προβλήματα και εφ’ όσον επιλεγεί κατάλληλη ευριστική συνάρτηση. Προβλήματα της αναρρίχησης λόφου

τοπικά μέγιστα (local maximum)

οροπέδια (plateau)

κορυφογραμμές (ridge)

Page 52: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

49

Εφαρμογή της αναρρίχησης λόφου στο πρόβλημα του κόσμου των κύβων

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

3.1.2.3 Προσομοιωμένη ανόπτηση

Η μέθοδος της προσομοιωμένης ανόπτησης είναι μία παραλλαγή της αναρρίχησης λόφου ως προς το ότι στα αρχικά στάδια της αναζήτησης είναι δυνατή η μετάβαση από ένα κόμβο σε κάποιο “χειρότερο” απόγονό του . Η πιθανότητα να συμβεί κάτι τέτοιο μειώνεται με την πάροδο του χρόνου . Η ιδέα προέρχεται από τη σταδιακή ανόπτηση (annealing) ενός τηγμένου μετάλλου μέσω κατάλληλα σχεδιασμένου χρονοδιαγράμματος μείωσης της θερμοκρασίας. Το μέταλλο μεταβαίνει σε καταστάσεις χαμηλότερης ενέργειας, αλλά σε θερμοκρασία T είναι δυνατόν να συμβεί αύξηση ενέργειας είναι η σταθερά Boltzmann. Στη μέθοδο της προσομοιωμένης ανόπτησης είναι πάντα δυνατή η μετάβαση σε “καλύτερους” απογόνους, όπως στην αναρρίχηση λόφου, αλλά επιτρέπεται επίσης και η μετάβαση σε “χειρότερους” απογόνους Με κατάλληλη εμπειρική επιλογή του χρονοδιαγράμματος μείωσης της “θερμοκρασίας”, η προσομοιωμένη ανόπτηση μπορεί να δώσει λύση εκεί που η αναρρίχηση λόφου αποτυγχάνει.

3.1.2.4 Η ευριστική μέθοδος αναζήτησης IDA* Η μέθοδος IDA* συνίσταται σε διαδοχικές πρώτα– κατά –βάθος αναζητήσεις με συνεχώς αυξανόμενο επάνω φράγμα, όχι στο βάθος του κόμβου n, αλλά στην τιμή της συνάρτησης f(n). Αρχική τιμή του επάνω φράγματος είναι 1 και σε κάθε πρώτα–κατά–βάθος αναζήτηση το επάνω φράγμα ισούται με την ελάχιστη

Page 53: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

50

υπέρβαση της προηγούμενης αναζήτησης. Η μέθοδος IDA* απαιτεί γραμμική ποσότητα μνήμης ως προς το βάθος του κόμβου –στόχου. Η ευριστική συνάρτηση f(n) χρησιμοποιείται για τη διακοπή της τρέχουσας πρώτα–κατά–βάθος αναζήτησης και όχι για τον καθορισμό της σειράς εξέτασης των κόμβων. Η μέθοδος IDA* εξετάζει μόνο τους κόμβους που εξετάζει και η A* και αποδεικνύεται ότι σε περίπτωση παραδεκτής ευριστικής συνάρτησης h΄(n) βρίσκει την καλύτερη λύση.

3.1.3 Οπισθοδρόμηση (Backward chaining) και Εμπροσθιοδρόμηση (Forward chaining) Η ανάλυση της δυσκολίας της αναζήτησης ενός προβλήματος μας αφήνει να συγκρίνουμε για πρώτη φορά τις διαφορές μεταξύ των δομών ελέγχου. Για παράδειγμα έχουμε αυτό στους κανόνες σύστημα: τ :- α, β. τ :- γ. υ :- not(α), γ. υ :- α, δ. φ :- β, ε. Υποθέστε τώρα πως μόνο τα γεγονότα α, ε και δ είναι αληθινά και σε αυτή την εντολή. Η οπισθοδρόμηση θα προσπαθήσει τους τρεις πρώτους κανόνες όπου αποτυγχάνουν και στη συνέχεια τον τέταρτο που πετυχαίνει. Βασικά η οπισθοδρόμηση χωρίς αποθήκευση περιέχει οκτώ συνολικές ερωτήσεις: κορυφαία κατηγορήματα τ, υ και α (όπου επιτυγχάνει),β (όπου αποτυγχάνει), γ (όπου αποτυγχάνει), α πάλι (όπου επιτυγχάνει), α πάλι, και τέλος δ (όπου επιτυγχάνει). Ο χρόνος να γίνει αυτό είναι περίπου ανάλογος προς τον αριθμό ερωτήσεων που γίνονται επειδή κάθε ερώτηση απαιτεί μια συμβούλευση δεικτών του σχεδόν ίσου χρόνου. Η εμπροσθιοδρόμηση θα ταιριάξει το γεγονός α στις εκφράσεις του πρώτου και του τέταρτου κανόνα, στη συνέχεια ταιριάζει το ε στην έκφραση του τελευταίου κανόνα. Τελικά, ταιριάζει το δ στο τέταρτο κανόνα, και το υ αποδεικνύεται. Άρα έχουμε τέσσερις αντιστοιχίες. Ο χρόνος να γίνει αυτό είναι περίπου ανάλογος

Page 54: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

51

προς τον αριθμό αντιστοιχιών επειδή κάθε ένας απαιτεί μια συμβούλευση δεικτών του σχεδόν ίσου χρόνου. Τώρα θα συγκρίνουμε 8 ερωτήσεις με τέσσερις αντιστοιχίες για να αποφασίσουμε ποιος είναι καλύτερος τρόπος της εμροσθιοδρόμησης ή της οπισθιοδρόμησης για τη συγκεκριμένη περίπτωση. Μέσα από αυτή τη σύγκριση ανάμεσα σε διαφορετικές μονάδες (μήλα και πορτοκάλια) εμεις μπορούμε συνήθως να πραγματοποιήσουμε τα πειράματα για να εξισώσουμε και τις ερωτήσεις και τις αντιστοιχίες στη μονάδα του χρόνου. Το κυρίως πρόβλημα με αυτή την ανάλυση είναι ότι είναι πολύ δύσκολο να γενικευθεί : μπορούμε να μην ξέρουμε ποια και πόσα γεγονότα πρόκειται να είναι αληθινά τη συγκεκριμένη κατάσταση, και υπάρχουν πολλές πιθανές καταστάσεις. Οι προσομοιώσεις είναι ένας τρόπος προσέγγισης. Αλλά μπορούμε επίσης να χρησιμοποιήσουμε τις πιθανότητες της μαθηματικής ανάλυσης, όπως θα δουμε στη συνέχεια. Ας χρησιμοποιήσουμε αρχικά την οπισθιοδρόμηση, χρησιμοποιώντας ακόμα το προηγούμενο παράδειγμα. Ας υποθέσουμε ότι τα πιθανα γεγονότα είναι α, β, γ, δ και ε έχουν ανεξάρτητες πιθανότητες P της αληθείας. Κατόπιν η πιθανότητα του πρώτου κανόνα τ:- το α, β που πετυχαίνει, και η τρίτη |(1-P)P| , και στη συνέχεια η τέταρτη και η Πέμπτη |P sup 2| . Ο αναμενόμενος αριθμός ερωτήσεων παράχθηκε όταν οι κανόνες με αυτή τη σειρά γίνανε ένας μεγάλος και δυσνόητος τύπος επειδή δεν πρέπει να αξιολογήσουμε πλήρως έναν κανόνα για να αποτύχουμε. 3 P sup 2 + 3 ( 1 - P ) P + 4 P ( 1 - P ) P + 8 P ( 1 - P ) sup 2 P + 10 ( 1 - P ) P ( 1 - P ) P + 10 P ( 1 - P ) sup 3 + 9 ( 1 - P ) sup 3 + 10 ( 1 - P ) P ( 1 - P ) sup 2 Πήραμε αυτόν τον τύπο με το συλλογισμό για το δικτυωτό πλέγμα αναζήτησης, που ήταν πραγματικά περισσότερο από ένα δικτυωτό πλέγμα απόφασης, για τις πιθανές καταστάσεις. Ο πρώτος όρος στον τύπο αντιστοιχεί στην επιτυχία του πρώτου κανόνα, τον όρο 2 και τον όρο 3 στην επιτυχία του δεύτερου, κανένας για τον τρίτο (δεν υπάρχει κανένας τρόπος ο τρίτος κανόνας να επιτύχει δίνοντας τον δεύτερου αποτυχημένο), ο όρος 4 στην επιτυχία του τέταρτου κανόνα, ο όρος 5 στην επιτυχία του πέμπτου, και στους υπόλοιπους όρους στις τρεις διαφορετικές περιπτώσεις όπου όλοι οι κανόνες αποτυγχάνουν. Για να επιτύχεις αυτό τον τύπο θεωρείς χωριστά περιπτώσεις με το α σωστό και το α λάθος. Μπορούμε να σκεφτούμε το ίδιο και για την εμπροσθιοδρομηση όταν τα γεγονότα λαμβάνονται πάντα σε μια σειρά και μια πιθανότητα P. Υποθέσετε ότι η διαταγή είναι α πρίν από το β, β πριν από το γ, το γ πρίν από το δ και το δ πριν από το ε. Ο τύπος για το αριθμό των αντιστοιχιών γεγονός –κανόνας έχουν ως εξής: 1 P ( 1 - P ) + 3 P sup 2 + 3 P sup 2 ( 1 - P ) + 3 P sup 2 ( 1 - P ) sup 2 + 4 P sup 2 ( 1 - P ) sup 3 + 3 P ( 1 - P ) sup 4 + 4 P sup 3 ( 1 - P ) sup 2 + 4 P sup 2 ( 1 - P ) sup 3 + 3 P sup 2 ( 1 - P ) sup 3 + 3 P ( 1 - P ) sup 4 + 3 P sup 2 ( 1 - P ) sup 3 + 2 P ( 1 - P ) sup 4 + 2 P ( 1 - P ) sup 4 + 1 ( 1 - P ) sup 5

Page 55: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

52

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

3.2 ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ PROLOG

Μια βάση δεδομένων (data base) είναι ένα σύστημα που περιέχει δομημένες πληροφορίες για μια εφαρμογή και επιτρέπει την αναζήτηση των πληροφοριών κατά διάφορους τρόπους και με διάφορους ορισμούς. Έχει γίνει αρκετή έρευνα πάνω στην πιθανότητα χρησιμοποίησης της Prolog για υλοποίηση βάσεων δεδομένων. Μια πρωτότυπη είναι του Lί [4] που υλοποίησε ένα σύστημα διοίκησης βάσεων δεδομένων σε Prolog δημιουργώντας και δύο γλώσσες ερωταπαντήσεων (query languages) για αυτό το σύστημα. Σύστημα Διεπαφής Ελληνικής Γλώσσας για πρόσβαση σε Βάσεις Δεδομένων (Hellenic Natural Language Interface for Data Base Access) Εδώ παρουσιάζεται ένα σύστημα για την επεξεργασία ερωτήσεων εκφρασμένων στην ελληνική με Prolog. Οι ερωτήσεις μεταφράζονται αυτομάτως σε προτάσεις SQL, οι οποίες υποβάλλονται στο σύστημα διαχείρισης της βάσης δεδομένων για να τις εκτελέσει και να παραγάγει τα αποτελέσματα. Η βάση που χρησιμοποιείται ως παράδειγμα εφαρμογής περιέχει πληροφορίες για διάφορες χώρες, και συγκεκριμένα την πρωτεύουσα, τον πληθυσμό, την έκταση, την ήπειρο στην οποία βρίσκεται η κάθε χώρα, τα προϊόντα που εξάγει, καθώς επίσης και τυχόν οργανισμούς στους οποίους ανήκει. Οι πληροφορίες αυτές είναι αποθηκευμένες σε πίνακες της βάσης δεδομένων. Η οργάνωση της βάσης έχει αναπαρασταθεί με Prolog χρησιμοποιώντας κατηγόρημα στο οποίο προσδιορίζεται η δομή των πινάκων και τα αντίστοιχα χαρακτηριστικά που περιέχει κάθε πίνακας του συστήματος διαχείρισης βάσης δεδομένων. Επίσης υπάρχουν κατηγορήματα που αναπαριστούν γνώση που σχετίζεται με τη βάση δεδομένων. Συγκεκριμένα υπάρχουν πίνακες που αντιστοιχούν στα ρήματα "εξάγω", "ανήκω"," έχω" και "βρίσκομαι" και χρησιμοποιούνται για να δίνουν τη δυνατότητα στο σύστημα επεξεργασίας της φυσικής γλώσσας, να εντοπίζει τον πίνακα που αναφέρεται κάθε ερώτηση. Ορισμένες ασάφειες που παρουσιάζει η φυσική γλώσσα, επιλύονται από το σύστημα με χρήση της κατάλληλης γνώσης. Η αρχιτεκτονική του συστήματος αυτού εξασφαλίζει φιλικότητα της διεπαφής και μεταφερσιμότητα σε ποικιλία βάσεων δεδομένων.

3.2.1 ΣΧΕΣΙΑΚΕΣ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

Υπάρχουν πολλά μοντέλα αναπαράστασης των δεδομένων σε μια βάση με επικρατέστερο το σχεσιακό (relational) ,το ιεραρχικό (hierarchical), και το δικτυωτό (network). Η Prolog έχει άμεση αντιστοιχία με το σχεσιακό μοντέλο. Φυσικά και αυτά τα μοντέλα μπορούν να αναπαρασταθούν σε Prolog

Page 56: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

53

χρησιμοποιώντας όμως πιο σύνθετες δομές και τεχνικές προγραμματισμού. Δεν υπάρχει κανένας λόγος για κάτι τέτοιο γιατί από τα τρία παραπάνω μοντέλα το σχεσιακό είναι το πιο κοντινό στον ανθρώπινο τρόπο σκέψης και το περισσότερο κατανοητό. Αν έχουμε τα σύνολα Σ1,Σ2,..., Σν, όχι απαραίτητα διαφορετικά, τότε R είναι μια σχέση (relation) σε αυτά τα ν σύνολα, αν είναι ένα σύνολο διατεταγμένων ν-άδω ν < Π1,Π2,...,Πν >, τέτοιων ώστε το Π1 ανήκει στο Σ1, το Π2 ανήκει στο Σ2, .., το Πν ανήκει στο Σν. Τα Π1, Π2, ..., Πν είναι τα πεδία (fields) της σχέσης, τα Σ1, Σ2, ..., Σν είναι τα πεδία ορισμού (domains), ενώ το ν είναι ο βαθμός (degree) της σχέσης. Οι διατεταγμένες ν-άδες, στη γενική περίπτωση, λέγονται πλειάδες (tuples). Μια άμεση αντιστοιχία που μπορούμε να κάνουμε, προτού πούμε οτιδήποτε άλλο, είναι η αντιστοίχηση των πλειάδων με ένα σύνολο γεγονότων της Prolog με το ίδιο κατηγόρημα και την ίδια τάξη κατηγόρημα είναι το όνομα της σχέσης ενώ τα ορίσματα αντιστοιχούν ένα προς ένα με τα πεδία. Πεδίο ορισμού, όσον αφορά την Prolog θεωρείται το σύνολο των τιμών που μπορεί να πάρει ένα όρισμα. Η βάση δεδομένων θα είναι το σύνολο όλων των γεγονότων που ορίζουν τις σχέσεις Προμηθευτές

Πμ_Κωδικός

Πμ_¨Ονομα Χρον_Παράδ Πμ_Πόλη

Προμ1 Γεωργίου 34 Αθήνα

Προμ2 Γαζής 52 Πάτρα

Προμ3 Ανδρέου 48 Αθήνα

Προμ4 Αργυρίου 14 Λαμία

Προϊόντα

Πι_Κωδικός

Πι_Όνομα Χρώμα Πι_Πόλη Πι_Ποσότητα

Προι1 Κατσαβίδι Κόκκινο Αθήνα 5000

Προι2 Κατσαβίδι Γκρι Ηράκλειο 300

Προι3 Βίδα Μαύρο Λαμία 18000

Προι4 Σφυρί Κόκκινο Πάτρα 4000

Παραγγελίες

Πα_Πμ_Κωδικός

Πα_Πι_Κωδικός

Πα_Ποσότητα

Προμ1 Προι1 500

Προμ2 Προι4 100

Προμ1 Προι3 2000

Προμ3 Προι4 200

Προμ1 Προι1 300

Page 57: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

54

Το γενικό σχήμα

προμηθευτές (Πμ_Κωδικός, Πμ_¨Ονομα, Χρον_Παράδ, Πμ_Πόλη) προϊόντα (Πι_Κωδικός, Πι_Όνομα, Χρώμα, Πι_Πόλη, Πι_Ποσότητα) παραγγελίες(Πα_Πμ_Κωδικός, Πα_Πι_Κωδικός, Πα_Ποσότητα)

Αναπαράσταση σε Prolog προμηθευτές(Προμ1, Γεωργίου, 34, Αθήνα) προμηθευτές(Προμ2, Γαζής,52,Πάτρα) προμηθευτές(Προμ3, Ανδρέου, 48, Αθήνα) προμηθευτές(Προμ4,Αργυρίου,14,Λαμία προϊόντα(Προι1, Κατσαβίδι, Κόκκινο, Αθήνα, 5000) προϊόντα(Προι2, Κατσαβίδι, Γκρι, Ηράκλειο, 300) προϊόντα(Προι3, Βίδα, Μαύρο, Λαμία, 18000) προϊόντα(Προι4, Σφυρί, Κόκκινο, Πάτρα, 4000) παραγγελίες(Προμ1, Προι1,500) παραγγελίες(Προμ2, Προι4,100) παραγγελίες(Προμ1, Προι3,2000) παραγγελίες(Προμ3, Προι4,200) παραγγελίες(Προμ1, Προι1,300)

3.2.2 ΚΛΕΙΔΙΑ Σε μερικές σχεσιακές βάσεις δεδομένων ορισμένα πεδία ξεχωρίζουν με την ιδιότητά τους σαν κλειδιά (keys). Τα κλειδιά είναι τα πεδία πάνω στα οποία γίνεται δεικτοδότηση (indexing) και, έτσι, σύμφωνα με την τιμή τους μπορεί να γίνει αναζήτηση των πλειάδων. Στην Prolog δεν χρειάζεται κάτι τέτοιο γιατί ο μηχανισμός ταυτοποίησης χειρίζεται όλους τους όρους ενός ατομικού τύπου σαν κλειδιά. Μερικά από τα κλειδιά μιας σχέσης ενεργούν σαν πρωτεύοντα κλειδί (primary keys). Τα πρωτεύοντα κλειδιά ξεχωρίζουν τις πλειάδες μεταξύ τους, δηλαδή απαγορεύεται δύο πλειάδες να έχουν τον ίδιο συνδυασμό πρωτευόντων κλειδιών. Στην Prolog μπορούμε να δημιουργήσουμε μια διαδικασία που αναλαμβάνει τον έλεγχο των πρωτευόντων κλειδιών κατά την εισαγωγή νέων πλειάδων-γεγονότων στη βάση. Η διαδικασία αυτή με το κατηγόρημα εισαγωγή έχει δύο όρους. Μια λίστα της θέσης των πρωτευόντων κλειδιών, και τη νέα πλειάδα.Για παράδειγμα η ερώτηση: ?εισαγωγή( [1]προμηθευτές( προμ5,βασιλείου,34,πάτρα)). εισάγει το νέο προμηθευτή "βασιλείου" στη βάση, αφού πρώτα ελέγξει το πρωτεύον κλειδί “προμ5” ανήκει και σε άλλη πλειάδα.

Page 58: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

55

3.3 ΤΡΟΠΟΙ ΕΡΩΤΑΠΑΝΤΗΣΕΩΝ

Όλες οι βάσεις δεδομένων έχουν μια γλώσσα ερωταπαντήσεων που αναλαμβάνει την επικοινωνία μεταξύ χρήστη και βάσης. Αυτές οι γλώσσες που μοιάζουν λίγο-πολύ με γλώσσες προγραμματισμού, βασίζονται για τις σχεσιακές βάσεις δεδομένων στο σχεσιακό λογισμό (relational calculus) σχεσιακή άλγεβρα (relationall algebra).Ο σχεσιακός λογισμός βασίζεται στον κατηγορικό λογισμό πρώτης τάξης (first order predicate caIculus) πάνω στον οποίο βασίζεται και η Prolog και έτσι η σχέση τους είναι άμεση. Χρησιμοποιεί τις πλειάδες βασικά στοιχεία της βάσης για την απάντηση ερωτήσεων ενώ η σχεσιακή άλγεβρα θεωρεί σαν δομικά στοιχεία της βάσης τις σχέσεις που χειρίζεται σαν σύνολα. Βασισμένη στο σχεσιακό λογισμό είναι η γλώσσα ερωταπαντήσεων SQL.

3.3.1 SQL ΚΑΙ PROLOG Η βασική εντολή για απάντηση ερωτήσεων στην SQL είναι η εντολή SELECT.

Δίνουμε δύο παραδείγματα ερωτήσεων:

(α) SΕLΕCΤ Πμ_Ονομα FRΟΜ Προμηθευτές WHERE Χρόν _Παράδ > 30 (Βρες τα ονόματα των Προμηθευτών με Χρόν_Παράδ > 30). (β) SELECT Πμ_Όνομα FROM Προμηθευτές WHERE Πμ_Κωδικός ΙΝ (SELECT Πα_Πμ_Κωδικός FROM Παραγγελίες WHERE Πα_Ποσότητα> 500) (Βρες τα ονόματα των Προμηθευτών που προμηθεύουν κάπα προϊόν σε ποσότητα μεγαλύτερη του 500) Η εντολή SELECT της SQL δεν χρειάζεται ειδικές διαδικασίες για να υλοποιηθεί σε Prolog. Οι ερωτήσεις προς τη βάση μπορούν να γίνουν με ερωτήσεις που θα έκανε οποιοσδήποτε χρήστης της Prolog. Για παράδειγμα οι δύο παραπάνω SQL ερωτήσεις σε Prolog θα γίνουν: (α)?προμηθευτές(-, Ο, ΧΠ, -),ΧΠ > 30. (β)?προμηθευτές(Κ, Ο,_,_),παραγγελίες(Κ, _, Ποσ),Ποσ > 500.

Στην πρώτη ερώτηση η Prolog θα μας επιστρέψει τα ονόματα και τους αντίστοιχους χρόνους παράδοσης για τους προμηθευτές που έχουν χρόνο παράδοσης μεγαλύτερο του 30. Στη δεύτερη ερώτηση η Prolog θα μας επιστρέψει τους κωδικούς, τα ονόματα και τις αντίστοιχες ποσότητες παραγγελίας για τους προμηθευτές με ποσότητες παραγγελία μεγαλύτερες του 500. Μία ιδιότητα της SQL αλλά και πολλών άλλων γλωσσών είναι δημιουργία όψεων (views). Όψη είναι μια εικονική σχέση, που δεν υπάρχει στην πραγματικότητα, αλλά μπορεί να

Page 59: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ - 3 Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

56

δημιουργηθεί με ορισμένου κανόνες από τις υπάρχουσες σχέσεις και συμπεριφέρεται σαν πραγματική σχέση. Αυτές οι ιδιότητες των όψεων θυμίζουν τις ιδιότητες των διαδικασιών της Prolog και πράγματι υλοποιούνται σαν διαδικασίες. Η εντολή για τη δημιουργία μιας όψεως που περιέχει τους κωδικούς και τα ονόματα των προμηθευτών στους οποίους εκκρεμεί παραγγελία, στην SQL είναι: DEFINE VIEW Προμηθευτές_με_Παραγγελίες SELECT Πμ_Κωδικός, Πμ_Ονομα FROM Προμηθευτές WΗΕRΕ Πμ_Κωδικός ΙΝ (SELECT Πα_Πμ_Κωδικός FROM Παραγγελίες) Ο αντίστοιχος ορισμός σε Prolog θα είναι: Προμηθευτές_με_παραγγελίες(Κ,Ο) :-, προμηθευτές(Κ,Ο,_,_), παραγγελίες(Κ,_,_) .

3.3.2 ΣΧΕΣΙΑΚΗ ΑΛΓΕΒΡΑ

Η σχεσιακή άλγεβρα ορίζει ορισμένες πράξεις πάνω σε σύνολα και, θεωρώντας τις σχέσεις σαν σύνολα πλειάδων, χρησιμοποιεί αυτές τις πράξεις για να εξαγάγει τα αποτελέσματα της. Οι πράξεις αυτές είναι: 1. Επιλογή (Selection) με τελεστή το SELECT...WHERE. 2. Προβολή (Projection) με τελεστή το PROJECT...OVER. 3. Καρτεσιανό γινόμενο (Cartesian Product) με τελεστή το TIMES. 4. Ένωση (Union) με τελεστή το UNION. 5. Διαφορά (Difference) με τελεστή DIFF. 6. Τομή (Intersection) με τελεστή INTERSECT. 7. Σύνδεση (Join) με τελεστή JOIN. 8. Διαίρεση (Division) με τελεστή DIVIDEDBY

Οι πράξεις Τομή, Διαίρεση και Σύνδεση είναι σύνθετες πράξεις, δηλαδή

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

Page 60: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

57

3.3.2.1 ΕΠΙΛΟΓΗ (SELECTION)

Α = SELECT Προμηθευτές WHERE (Χρόν _Παράδ < 40 AND Πμ_Πόλη = Αθήνα)

Δημιουργείται η σχέση Α που περιέχει τις πλειάδες της σχέσης προμηθευτές που ικανοποιούν τις συνθήκες. Στο πιο κάτω πρόγραμμα βρίσκεται η υλοποίηση της πράξης επιλογής σε Prolog. Έχει τρεις όρους: Το γενικό γεγονός της σχέσης, το κατηγόρημα του αποτελέσματος και μια λίστα που περιέχει τις συνθήκες. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι: ?επιλογή(προμηθευτές(_,_, ΧΠ ,Π),α,[ΧΠ < 40,Π = αθήνα]).

επιλογή(Σχέση, Κατηγ_Αποτελ, Λίστα_Συνθηκών ) :-

Σχέση =…[_ | Λίστα_Ορων ], Α =.. [Κατηγ_Αποτελ Ι Λίστα_Ορων],

/ * Δημιουργία γενικού γεγονότος (Α) του αποτελέσματος */ . επιλoγή_1 (Σχέση, Α, Λίστα_Συνθηκών). επιλογή_1(Σ Α, ΛΣ) :-

Σ,

/ * Βρίσκουμε μία πλειάδα * /

έλεγχος_συνθηκών (ΛΣ ), όχι(Α),

/* Έλεγχος αν αυτό το αποτέλεσμα υπάρχει πάλι * /

ενσωμάτωση_ω ( Α),

/ *Προσθέτουμε το μερικό αποτέλεσμα στη σχέση-αποτέλεσμα * /

αποτυγχάνει. επιλογή-Ι (_, _, _). έλεγχος_συνθηκών ([ ]). έλεγχος-συνθηκών ([Σ1 | Σ2]) :-

Σ1, έλεγχος-συνθηκών (Σ2).

Οι μεταβλητές που δηλώνονται με "_" δεν μας ενδιαφέρουν γιατί δε παίζουν ρόλο στη διαμόρφωση του τελικού αποτελέσματος

Page 61: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

58

3.3.2.2 ΠΡΟΒΟΛΗ (PROJECTION)

Α = PROJECT Πρoμηθευτές OVER (Πμ_Ονομα,Χρόν_Παράδ)

Δημιουργείται η σχέση Α που περιέχει από όλες τις πλειάδες της σχέσης Προμηθευτές τα πεδία Π_Όνομα και Χρόν_Παράδ μόνο. Στο πρόγραμμα που ακολουθεί βρίσκεται η υλοποίηση της πράξης προβολής σε Prolog, Έχει τρεις όρους: Το γενικό γεγονός της σχέσης, το κατηγόρημα του αποτελέσματος και μια λίστα με τα πεδία που θα προβληθούν στο αποτέλεσμα. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι: ?προβολή( προμηθευτές(_,Ο ,Κατ,_) ,α [Ο ,Κατ] ).

προβολή( Σχέση, Κατηγ_Αποτελ, Λίστα_Πεδίων ) :-

Α =.. (Κατηγ_Αποτελ | Λίστα_Πεδίων ), / * Δημιουργία γενικού γεγονότος αποτελέσματος και ταύτιση όρων αποτελέσματος και πεδίων για προβολή * /

προβολή_1(Σχέση, Α). προβολή_1(Σ, Α) :-

Σ,

/ * Εύρεση μίας πλειάδας της σχέσης * /

όχι(Α), ενσωμάτωσε_ω(Α), αποτυγχάνει.

προβολή_1 (_,_).

Οι μεταβλητές που δηλώνονται με "_" δεν μας ενδιαφέρουν γιατί ( δεν παίζουν ρόλο στη διαμόρφωση του τελικού αποτελέσματος .

3.3.2.3 ΚΑΡΤΕΣΙΑΝΟ ΓΙΝΟΜΕΝΟ (CARTESIAN PRODUCT)

Α = Προμηθευτές TIMES Παραγγελίες Δημιουργείται η σχέση Α που έχει τα πεδία σχέσης Παραγγελίες και οι πλειάδες της είναι όλοι οι δυνατοί συνδυασμοί των πλειάδων των δύο αυτών σχέσεων. Στο πρόγραμμα πιο κάτω βρίσκεται η υλοποίηση της πράξης καρτεσιανού γινομένου σε Prolog. Έχει τρεις όρους: Τη λίστα με στοιχεία την πρώτη σχέση που παίρνει μέρος στην πράξη και την τάξη της, τη λίστα με στοιχεία τη δεύτερη σχέση και την τάξη της και το αποτέλεσμα. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι:

Page 62: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

59

?γινόμενο( [προμηθευτές,4], [παραγγελίες, 3] ,α). γινόμενο( [Σχέση1 , Τάξη 1] ,[Σχέση2, Τάξη2] Κατηγ_Aπoτελ):-

συναρτησιακό_σύμβολο(Σ1,Σχέση1, Τάξη1 ), συναρτησιακό _σύμβολο( Σ2, Σχέση2, Τάξη2), ΣΙ =.. [ _ | Ορισμ1 ] ), Σ2 =.. [ _ | Ορισμ2 ] ), παράθεση( Ορισμ1, Ορισμ2, Ορισμ), Α =.. [Κατηγ_Αποτελ | Ορισμ ] ),

/ * Δημιουργούμε τα γενικά γεγονότα των δυο σχέσεων και του αποτελέσματος * /

γινόμενο_1 (Σ1,Σ2,Α). γινόμενο_1 (Σ1, Σ2, Α) :-

Σ1, Σ2, όχι(Α), ενσωμάτωσε_ω(Α), αποτυγχάνει.

γινόμενο_1 (_, _, _) .

3.3.2.4 ΕΝΩΣΗ (UNION)

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

προμηθευτές_αθήνας(Πμ_Κωδικός,Πμ-Όνομα,Χρόν_Παράδ). προμηθευτές_πάτρας(Πμ_Κωδικός,Πμ- Όνομα, Χρόν _Παράδ). Τότε η πράξη ένωσης αυτών των δύο σχέσεων είναι: Α = Προμηθευτές_Αθήνας UΝIΟΝ Προμηθεuτές_Πάτρας

Στην πράξη της ένωσης οι δύο σχέσεις που παίρνουν μέρος στη πράξη πρέπει να έχουν το ίδιο πλήθος πεδίων με τα ίδια πεδία ορισμού, είναι δηλαδή υποπεριπτώσεις μιας γενικότερης σχέσης. Στο παραπάνω (παράδειγμα δημιουργείται η σχέση Α που έχει τις πλειάδες και των δύο, άλλων σχέσεων. Στο πρόγραμμα που ακολουθεί βρίσκεται η υλοποίηση της πράξης ένωσης σε Prolog. Έχει τέσσερις όρους: Την πρώτη σχέση που παίρνει μέρος στην πράξη, τη δεύτερη σχέση, την τάξη τους, και το αποτέλεσμα. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι: ?ένωση( προμηθευτές_αθήνας, προμηθευτές_πάτρας, 3 ,α). ένωση(Σχέση1,Σχέση2,Τάξη,Κατηγ_Αποτελ) :-

Page 63: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

60

συναρτησιακό_σύμβολο( Σ1 ,Σχέση1, Τάξη), συναρτησιακό_σύμβολο( Σ2,Σχέση2, Τάξη), συναρτησιακό_σύμβολο( Α, Κατηγ_Αποτελ, Τάξη), /* Δημιουργία γενικών γεγονότων των σχέσεων και του αποτελέσματος * /

ένωση_1 (Σ1,Α), Ι * Δημιουργία αποτελεσμάτων από την. πρώτη σχέση * Ι.

ένωση_1 (Σ2,Α). Ι * Δημιουργία αποτελεσμάτων από τη δεύτερη σχέση * Ι ένωση_1(Σ, Α) :

Α =.. [ _ | Ορίσματα)), Σ =.. [ _ | Ορίσματα)),

/* Ενοποίηση ορισμάτων αποτελέσματος και σχέσης * /

Σ, όχι(Α), ενσωμάτωσε_ω(Α), αποτυγχάνει.

ένωση_1 (_, _).

3.3.2.5 ΔΙΑΦΟΡΑ (DIFFERENCE)

Α = Προμηθευτές_Αθήνας DIFF Προμηθευτές_Πάτρας

Και στην πράξη της διαφοράς οι δύο σχέσεις που παίρνουν μέρος στην πράξη πρέπει να έχουν το ίδιο πλήθος πεδίων με τα ίδια πεδία ορισμού. Στο παραπάνω παράδειγμα δημιουργείται η σχέση Α που έχει τις πλειάδες της σχέσης Προμηθευτές_Αθήνας που δεν ανήκουν και στη σχέση Προμηθευτές_Πάτρας, δηλαδή αυτούς που δεν έχουν υποκαταστήματα και στην Πάτρα. Στο επόμενο πρόγραμμα βρίσκεται η υλοποίηση της πράξης διαφοράς σε Prolog. Έχει τέσσερις όρους: Την πρώτη σχέση που παίρνει μέρος στην πράξη, τη δεύτερη σχέση, την τάξη τους και το αποτέλεσμα. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι: ?διαφορά(προμηθευτές_αθήνας,προμηθευτές-πάτρας,3,α). διαφορά(Σχέση1,Σχέση2,Τάξη,Κατηγ_Αποτελ) :-

συναρτησιακό_συμβολο( Σ1, Σχέση1, Τάξη), συναρτησιακό_συμβολο( Σ2,Σχέση2, Τάξη), συναρτησιακό_συμβολο( Α, Κατηγ_Αποτελ, Τάξη),

Page 64: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

61

/ * Δημιουργία γενικών γεγονότων των σχέσεων και του αποτελέσματος */

Σ1 =.. [ _ | Ορίσματα]), Σ2 =.. [ _ | Ορίσματα] ), Α =..[ _ | Ορίσματα]),

/ * Ενοποίηση ορισμάτων αποτελέσματος και σχέσεων * /

διαφορά_1(Σ1,Σ2,Α).

διαφορά _1(Σ1,Σ2,Α) : Σ1, όχι(Σ2),

/* Έλεγχος ύπαρξης ίδιας πλειάδας στην άλλη σχέση * / όχι(Α), ενσωμάτωσε _ω( Α), αποτυγχάνει.

διαφορά_1(_, _, _).

3.3.2.6 ΤΟΜΗ (INTERSECTION)

Α = Προμηθευτές_Αθήνας INTERSECT Προμηθευτές-Πάτρας

Και στην πράξη της τομής οι δύο σχέσεις που παίρνουν μέρος στην πράξη πρέπει να έχουν το ίδιο πλήθος πεδίων με τα ίδια πεδία ορισμού. Στο παραπάνω παράδειγμα δημιουργείται η σχέση Α που έχει τις πλειάδες της σχέσης Προμηθευτές_Αθήνας που ανήκουν και στη σχέση Προμηθευτές_Πάτρας, δηλαδή αυτούς που έχουν υποκαταστήματα και στις δύο πόλεις. Η πράξη της τομής είναι σύνθετη πράξη. Η πράξη Σ1 IΝΤΕRSΕCΤ Σ2 ισοδυναμεί με Σ1 DIFF (Σ1 DIFF Σ2). Στο πρόγραμμα που ακολουθεί βρίσκεται η υλοποίηση της πράξης τομής σε Prolog. Έχει τέσσερις όρους: Την πρώτη σχέση που παίρνει μέρος στην πράξη, τη δεύτερη σχέση, την τάξη τους, και το αποτέλεσμα. Η μόνη διαφορά του με το πρόγραμμα της σχέσης διαφορά είναι η έλλειψη του όχι στη διαδικασία τομή_1.Αυτό το όχι ελέγχει αν η υπό εξέταση πλειάδα βρίσκεται ή όχι και στη δεύτερη σχέση. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι: ?τομή(προμηθευτές_αθήνας,προμηθευτές_πάτρας,3,α). τομή(Σχέση1,Σχέση2,Τάξη,Κατηγ_Αποτελ) :-

συναρτησιακό_σύμβολο( Σ1 ,Σχέση1 , Τάξη), συναρτησιακό_σύμβολο( Σ2,Σχέση2, Τάξη), συναρτησιακό_σύμβολο( Α ,Κατηγ_Αποτελ , Τάξη),

Page 65: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

62

/ * Δημιουργία γενικών γεγονότων των σχέσεων και του αποτελέσματος */

ΣΙ =.. [ _ | Ορίσματα ] ), Σ2 =..[ _ | Ορίσματα ] ), Α =.. [ _ | Ορίσματα] ) ,

/ * Ενοποίηση ορισμάτων αποτελέσματος και σχέσεων * /

τομή_1 (Σ1,Σ2,Α). τομή_1(Σ1,Σ2,Α) :-

ΣΙ, Σ2,

/ * Έλεγχος ύπαρξης ίδιας πλειάδας στην άλλη σχέση * /

όχι(Α), ενσωμάτωσε_ω(Α), αποτυγχάνει

τομή_1 (_,_,_) .

3.3.2.7 ΣΥΝΔΕΣΗ (JOIN)

Α = Προμηθευτές JOIN Προϊόντα OVER ((Πμ_Πόλη,Πι_Πόλη))

Στην πράξη της σύνδεσης το αποτέλεσμα έχει τα πεδία και των δύο σχέσεων που παίρνουν μέρος στην πράξη για τις πλειάδες που έχουν τις ίδιες τιμές στα πεδία που ορίζονται μετά το OVER. Η πράξη αυτή είναι στην πραγματικότητα ένα καρτεσιανό γινόμενο με περιορισμούς που "κόβουν" μερικές πλειάδες. Έτσι η πράξη Σ1 JOIN Σ2 OVER (Περιορισμοί) ισοδυναμεί με την πράξη SELECT (Σ1 TIMES Σ2) WHERE (Περιορισμοί). Στο παραπάνω παράδειγμα δημιουργείται η σχέση Α που έχει τα πεδία της σχέσης Προμηθευτές και της σχέσης Προϊόντα και συσχετίζει τους προμηθευτές με τα προϊόντα που αποθηκεύονται στην ίδια πόλη που αυτοί έχουν την έδρα τους. Στο επόμενο πρόγραμμα βρίσκεται η υλοποίηση της πράξης σύνδεσης σε Prolog. Έχει τρία ορίσματα: Τα γενικά γεγονότα της πρώτης και της δεύτερης σχέσης που παίρνουν μέρος στην πράξη με τις κοινές τους μεταβλητές και το αποτέλεσμα. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι: ?σύνδεση( προμηθευτές(Π_Κ,Π_Ο,Κατ,Π), προϊόντα(Πρ_Κ, Πρ_Ο, Χ, Β, Π, Ποσ),α). .

σύνδεση(Σχέση1,Σχέση2,Κατηγ_Αποτελ):

Σχέση1 =.. [ _ | Ορισμ1 ] ), Σχέση2 =.. [ _ | Ορισμ2 ] ),

Page 66: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

63

παράθεση( Ορισμ1 ,Ορισμ2,Ορισμ), Α =.. [Κατηγ_Αποτελ | Ορισμ ] ),

/ * Δημιουργούμε τα γενικά γεγονότα των δύο σχέσεων και του αποτελέσματος * /

γινόμενο_1 (Σχέση1 ,Σχέση2,Α). /* !!!... Η εργασία είναι η ίδια με το γινόμενο αφού οι κοινές μεταβλητές των Σχέση1 και Σχέση2 μας εξασφαλίζουν τη λειτουργία της σύνδεσης * /

3.3.2.8 ΔΙΑΙΡΕΣΗ (DIVISION) Α = Προμηθευτές DIVIDEDBY Παραγγελίες OVER (Πμ_Κωδικός, Πα_Πμ_Κωδικός)

Στην πράξη της διαίρεσης αν η πρώτη σχέση έχει βαθμό μ και η δεύτερη ν (ν < μ) τότε το αποτέλεσμα έχει βαθμό μ-ν. Τα πεδία της δεύτερης σχέσης πρέπει να είναι υποσύνολο των πεδίων της πρώτης σχέσης. Η πράξη δίνει σαν αποτέλεσμα τα πεδία της πρώτης σχέσης που δεν ανήκουν και στη δεύτερη, για τις πλειάδες που οι τιμές των κοινών πεδίων είναι οι ίδιες και στις δύο σχέσεις. Η πράξη της διαίρεσης είναι σύνθετη. Η πράξη Σ1 DIVIDEDBY Σ2 ισοδυναμεί με την πράξη PROJECT (Σ1 JOIN Σ2 OVER (Κοινά-Πεδία)) OVER (Μη-Κοινά-Πεδία). Στο παραπάνω παράδειγμα δημιουργείται η σχέση Α που έχει τα πεδία της σχέσης Προμηθευτές εκτός του Πμ_Κωδικός για τους προμηθευτές που έχουν παραγγελία, δηλαδή αυτούς που ο κωδικός τους εμφανίζεται στο πεδίο Πα_Πμ_Κωδικός της σχέσης Παραγγελίες. Στο πρόγραμμα πιο κάτω βρίσκεται η υλοποίηση της πράξης διαίρεσης σε Prolog. Έχει τέσσερις όρους: Τα γενικά γεγονότα της πρώτης και της δεύτερης σχέσης που παίρνουν μέρος στην πράξη με τις κοινές τους μεταβλητές, το αποτέλεσμα και τη λίστα των μη κοινών πεδίων. Σύμφωνα με αυτό το πρόγραμμα η παραπάνω ερώτηση είναι: ?προβολή(παραγγελίες(ΚΠ,_,_ ),α1[ΚΠ]) διαίρεση(προμηθευτές (Κ,Ο,Κατ,Π) ,α1(Κ),α,[0,Κατ,Π]) διαίρεση(Σχέση1 ,Σχέση2,Κατηγ _Αποτελ, Λίστα_Πεδίων) :

Α =.. [Κατηγ_ΑποτελΙ Λίστα_Πεδίων]) , / * Δημιουργούμε το γενικό γεγονός του αποτελέσματος * /

διαίρεση_1 (Σχέση1 ,Σχέση2,Α). διαίρεση_1(Σ1,Σ2,Α) : Σ1,

Page 67: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

64

/* Εύρεση μιας πλειάδας του διαιρετέου * /

Σ2,

/ * Εύρεση μιας πλειάδας του διαιρέτη και έλεγχος κοινών μεταβλητών * / όχι(Α), ενσωμάτωσε_ω(Α), αποτυγχάνει.

διαίρεση_1 (_, _, _). Μέχρι τώρα δημιουργήσαμε μια βιβλιοθήκη προγραμμάτων υλοποιούν τις 8 πράξεις της σχεσιακής άλγεβρας. Με αυτές τις πράξεις και της υλοποιήσεις τους σε Prolog μπορεί να γίνει διαχείριση μιας βάσεις δεδομένων.

3.4 ΜΕΘΟΔΟΙ ΑΝΑΠΑΡΑΣΤΑΣΗΣ ΓΝΩΣΗΣ

Η Βάση Γνώσεων περιέχει γνώση για το γνωστικό πεδίο για το οποίο έχει αναπτυχθεί το Ε.Σ. Χρησιμοποιώντας αυτήν τη γνώση και συνδυάζοντας την με τα δεδομένα, τα οποία αφορούν ένα συγκεκριμένο πρόβλημα, το έμπειρο σύστημα μπορεί να βγάλει το συμπέρασμα ή τα συμπεράσματα για τη λύση του προβλήματος αυτού. Για την κωδικοποίηση της γνώσης σε ένα Ε.Σ. έχουν αναπτυχθεί διάφoρoι τρόποι αναπαράστασής της. Οι κυριότεροι από αυτούς είναι η λογική (Iogic), οι κανόνες παραγωγής (production rules), τα σημασιολογικά δίκτυα (semantic networks) και τα πλαίσια (frames). Ο μηχανισμός εξαγωγής συμπερασμάτων ο οποίος είναι υπεύθυνος για την εξαγωγή συμπερασμάτων που προκύπτουν από τη γνώση είναι διαφορετικός για κάθε τρόπο αναπαράστασής της.

3.4.1 ΛΟΓΙΚΗ Η λογική είναι από τους χρονολογικά αρχαιότερους τρόπους

αναπαράστασης γνώσης. Η γνώση αναπαρίσταται σαν σύνολο από προτάσεις που ονομάζονται καλά σχηματισμένοι τύποι (well formed forrmulas). Ένα παράδειγμα καλά σχηματισμένου τύπου είναι:

Vχ (Υψηλόμισθος (χ) <- Υπάλληλος(χ) & Ξlψ(Mισθός(x,ψ) & Μεγαλύτερος(ψ,200000)))

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

Page 68: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

65

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

3.4.2 ΚΑΝΟΝΕΣ ΠΑΡΑΓΩΓΗΣ Ο πιο δημοφιλής τρόπος αναπαράστασης γνώσης είναι οι κανόνες της μορφής "αν - τότε" (if - then) οι οποίοι ονομάζονται κανόνες παραγωγής. Οι κανόνες αυτοί μπορούν να έχουν διάφορες σημασιολογικέ ερμηνείες όπως Π.χ.

Αν ισχύουν οι συνθήκες Α τότε ισχύει το συμπέρασμα Σ.

Αν βρισκόμαστε σε μια κατάσταση Α τότε να γίνει η ενέργεια Β.

Αν ισχύουν οι συνθήκες Σ1 και Σ2 τότε δεν ισχύει η συνθήκη Σ. Παράδειγμα τα κανόνων παραγωγής είναι: Κανόνας 1: Αν Υπάλληλος(χ) & Μισθός(χ,ψ) & Μεγαλύτερος(ψ,200000) Τότε Νέα-Γνώση(Υψηλόμισθος(χ) ) Κανόνας 2: Αν Χαμηλόμισθος(χ) & Eτoς -Τελευταίας-Aύξησης(1989) Τότε Συμπέρασμα( Αύξηση(χ,15%)) Κανόνας 3: Αν Υψηλόμισθος(χ) & Έτος-Τελευταίας-Αύξησης(1989) Τότε Συμπέρασμα(Αύξηση(χ,10%))

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

Page 69: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

66

νέα δεδομένα είτε αλλάζει τα υπάρχοντα στη βάση είτε τελειώνει τη διαδικασία βγάζοντας ένα συμπέρασμα.

Η αναπαράσταση της γνώσης με κανόνες παραγωγής έχει τις παρακάτω επιθυμητές ιδιότητες:

Δόμηση της γνώσης: κάθε κανόνας ορίζει ένα μικρό, και σχετικά ανεξάρτητο από τα άλλα, "τμήμα" γνώσης.

Ευκολία: στην αύξηση της γνώσης: νέοι κανόνες εισάγονται χωρίς πολλές παρενέργειες.

Ευκολία: στην τροποποίηση της γνώσης σαν συνέπεια της δομημένης μορφής της.

Οι κανόνες είναι ευανάγνωστοι, ευκρινείς και εύκολα κατανοητοί: από τον άνθρωπο, που είναι ιδιότητες πολύ χρήσιμες γιατί μας εξασφαλίζουν τη δυνατότητα απάντησης στις ερωτήσεις του χρήστη: "Γιατί" (Why): Γιατί θέλεις αυτήν την πληροφορία; "Πως" (How) : Πως κατέληξες σ'αυτό το συμπέρασμα;

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

3.4.3 ΣΗΜΑΣΙΟΛΟΓΙΚΑ ΔΙΚΤΥΑ

Τα σημασιολογικά δίκτυα εισάγουν την έννοια της διασύνδεσης της, γνώσης με τη βοήθεια κόμβων και ακμών. Αποτελούνται από κόμβους που εκφράζουν αντικείμενα, έννοιες, ιδιότητες ή τάξεις και σύνολα από αντικείμενα ή έννοιες. Οι ακμές που συνδέουν τους κόμβους έχουν Ετικέτες (Iabels) που προσδιορίζουν τη σχέση των κόμβων που συνδέουν. ¨Ένα είδος ακμής είναι η ακμή με ετικέτα "είναι" (Is-A) που ομαδοποιεί τους κόμβους σε κλάσεις ή τύπους δημιουργώντας έτσι μια ιεραρχία. Ο μηχανισμός εξαγωγής συμπερασμάτων εξαρτάται από τη σημασιολογία των κόμβων και των ακμών που χρησιμοποιούνται. Στην περίπτωση της ιεραρχικής μορφής ακμές "είναι" ο μηχανισμός συμπερασματολογίας που βασίζεται στην αρχή της κληρονόμησης (inheritance).

3.4.4 ΠΛΑΙΣΙΑ

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

Page 70: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

67

ειδικές θέσεις που λέγονται κρύπτες (slots). Μερικές από τις κρύπτες μπορούν να περιέχουν δείκτες σε ειδικές ρουτίνες (demons, triggers, methods) που ενεργοποιούνται όταν η κρύπτη πάρει μια ειδική τιμή ή δεν έχει τιμή (event driven reasoning) ή όταν αλλάζει η τιμή της. Μερικές κρύπτες έχουν μία προκαθορισμένη τιμή για την περίπτωση που στη διαδικασία "γεμίσματος" (instantiation) τους δεν πάρουν τιμή (default reasoning). Τα πλαίσια είναι διατεταγμένα σε μια ιεραρχία. Αυτά που βρίσκονται στα πάνω επίπεδα αντιπροσωπεύουν τύπους αντικειμένου ενώ τα κατώτερα είναι συγκεκριμένα αντικείμενα (instances). Σημαντική ιδιότητα των πλαισίων είναι η κληρονόμηση. Οι τύποι ή τα αντικείμενα κληρονομούν τις ιδιότητες ή τις μεθόδους (δηλαδή τις τιμές των κρυπτών) του ανώτερου τύπου στον οποίο ανήκουν. Σε μερικά συστήματα πλαισίων μπορεί να υπάρχουν εξαιρέσεις και κάποια αντικείμενα να διαχωρίζονται από τον τύπο τους σε μερικές ιδιότητες. Ο μηχανισμός εξαγωγής συμπερασμάτων χρησιμοποιεί το μηχανισμό κληρονόμησης ιδιοτήτων και τις ειδικές ρουτίνες με σκοπό το γέμισμα των κρυπτών.

3.5 ΠΛΕΟΝΕΚΤΗΜΑΤΑ ΚΑΙ ΜΕΙΟΝΕΚΤΗΜΑΤΑ Πλεονεκτήματα

Η ενσωμάτωση νέας γνώσης στο σύστημα είναι εξαιρετικά εύκολη. Δεν έχουμε παρά να γράψουμε τους νέους κανόνες (γεγονότα της Prolog) μαζί με τους παλιούς.

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

Μεγάλο πλεονέκτημα της Prolog είναι η ύπαρξη του μηχανισμού επαγωγής (deduction) που επιτρέπει πολύπλοκες και ανορθόδοξες ερωτήσεις, πέρα από τις δυνατότητες οποιασδήποτε γλώσσας ερωταπαντήσεων, με τη χρήση διαδικασιών. Αν για παράδειγμα υπάρχει η σχέση γονιός με δύο πεδία, το γονιό και το παιδί (γονιός(Γονιός, Παιδί)) είναι αδύνατον σε μια βάση δεδομένων να γίνει η ερώτηση που ζητά όλους τους προγόνους ενός ατόμου. Μπορεί να γίνει η ερώτηση για τους προγόνους κάποιου συγκεκριμένου βαθμού περιγράφοντας μέσω SELECT και JOIN το μονοπάτι που πρέπει να ακολουθηθεί για να βρεθεί η λύση.

Page 71: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

68

Αντίθετα στην Prolog η ερώτηση αυτή γίνεται πολύ εύκολα ορίζοντας αναδρομικά τη διαδικασία πρόγονος:

πρόγονος(Α,Β) : γονιός(Α,Β) . πρόγονος(Α,Β) :- . γονιός(Γ,Β), πρόγονος(Α,Γ).

Το πλεονέκτημα που διέκρινε ο Li στην Prolog είναι, η άμεση αντιστοιχία της με ορισμένες μορφές βάσεων δεδομένων και η ύπαρξη δυνατοτήτων αντίστοιχων με τις λειτουργίες των βάσεων δεδομένων

Μειονεκτήματα

Μειονέκτημα της Prolog είναι ότι δεν μπορεί να χρησιμοποιηθεί αυτούσιος ο μηχανισμός εκτέλεσης της σαν μηχανισμός εξαγωγής συμπερασμάτων αλλά απαιτείται να γραφεί ένας μετά-διερμηνέας (διερμηνέας των κανόνων) για την υλοποίηση του μηχανισμού αυτού. Αυτό προκαλεί πρόσθετη χρονική επιβάρυνση στην εκτέλεση του προγράμματος.

Μειονεκτήματα της Prolog σε σχέση με τις βάσεις δεδομένων είναι ο μεγάλος χώρος κεντρικής μνήμης και ο χρόνος που χρειάζεται για απάντηση μιας ερώτησης. Για μείωση. του χώρου μπορούν να χρησιμοποιηθούν τεχνικές σελιδοποίησης (paging). Με αυτές τις τεχνικές στην κεντρική μνήμη υπάρχει κάθε φορά μια μόνο σχέση ενώ οι υπόλοιπες είναι σε περιφερειακή μνήμη (αρχεία) και "φορτώνονται" με χρήση των ενσωματωμένων διαδικασιών χειρισμού προγραμμάτων. Φυσικά αυτή η διαδικασία αυξάνει τον απαιτούμενο χρόνο. Είναι γεγονός, ότι τις βασικές απαιτήσεις των βάσεων δεδομένων, που είναι ο μεγάλος όγκος πληροφοριών και η ταχύτητα προσπέλασης τους ,δεν κατάφερε ακόμα να τις ικανοποιήσει η Prolog καθώς καθυστερεί η Πέμπτη γενιά υπολογιστών που υπόσχεται ταχύτητα και αποτελεσματικότητα σε θέματα λογικού χειρισμού δεδομένων.

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

Page 72: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

69

3.6 Έτοιμα Προγράμματα 3.6.1 ΜΗΧΑΝΙΣΜΟΣ ΑΝΑΚΤΗΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ

Ι * Μηχανισμός ανάκτησης της πληροφορίας από το χρήστη*/

πληροφορία( Ν ,Κεφαλή_κανόνα, Χ) :- απαντήθηκε ( Χ), !,

Χ.

πληροφορία(Ν,Κεφαλή_κανόνα,Χ):- συναρτησιακό_σύμβολο(Χ,Π) βρές_από_Μενού(Π,Ν,Κεφαλή_κανόνα,Ζ), συναρτησιακό_σύμβολο(Ω,Π,1), όρος(1,Ω,Ρ),

ίσα(Ρ,Ζ), ενσωμάτωσε_ω( Ω), !, Χ. απαντήθηκε(Χ) :- συναρτησιακό_σύμβολο ( Χ ,Π,_), συναρτησιακό_σύμβολο ( Τ ,Π,1), Τ. /* Μηχανισμός ανάκτησης της πληροφορίας από το χρήστη με τη βοήθεια του μενού * / βρές_από_Μενού(Χαρακτ,Ν,Κεφαλή,Απ) :- μενού( Χαρακτ,Λίστα), απάντηση( Χαρακτ ,Ν ,Απ,Κεφαλή,Λίστα). απάντηση(Π,Ν1,Χ,Κεφαλή_κανόνα,Λιστα) :-

νέα_γραμμή, γράψε(

Διάλεξε μια από τις πιο κάτω επιλογές που αφορούν: '), γράψε(Π),

νέα_γραμμή, νέα_γραμμή, τύπωσε_λίστα( 1,Λιστα) , διάβασε(Ν), ν_οστο(Ν, Υ ,Λίστα), !.

ανάλυση_απάντησης(Π,N1,Y, Χ,Κεφαλή_κανόνα).

Page 73: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

70

ανάλυση-απάντησης(Π,Ν, γιατί_ρωτάς, Χ ,Κεφαλή_κανόνα) :- !, διαδικασία_εξήγησης( Ν), βρές_από_Μενού(Π,Ν,Κεφαλή_κανόνα, Χ).

ανάλυση-απάντησης(Π,Ν ,λάθος_επιλογή, Χ , Κεφαλή_κανόνα) :- !, γράψε ( Ό αριθμός που επέλεξες δεν βρίσκεται μέσα’), νέα_γραμμή, γράψε ( - στα αποδεκτά πλαίσια. Προσπάθησε πάλι.’), νέα_γραμμή, βρές_από_Μενού (Π,Ν , Κεφαλή_κανόνα, Χ).

ανάλυση-απάντησης(Π,Ν,Χ,Χ, Κεφαλή_κανόνα). ν_ οστό (1,Χ,[Χ Ι Χσ] ):- !. ν_ οστό (Ν ,Χ,[ΥIΛιστα]) : Ν1 ισούται-με Ν - 1, ν_οστο ( Ν1, Χ ,Λίστα). ν_ οστό ( 1 ,γιατί_ρωτάς, [] ): !. ν _οστό(2,δεν_ξέρω,[] ):- !. ν_οστο(Ν ,λάθος_επιλογή,[] ). τύπωσε_λίστα(Ν,[Χ Ι Λίστα]) :- γράψε(Ν), γράψε(‘.’), γράψε ( Χ ), νέα_γραμμή, Ν1 ισούται_με Ν + 1, τύπωσε _λίστα( Ν1 , Λίστα). τύπωσε _λίστα( Ν , [ ]) : - ' γράψε (Ν), γράψε (‘. γιατί_ρωτάς’), νέα_γραμμή, Ν1 ισούται -με Ν + 1, γράψε (Ν1, γράψε (. δεν_ξέρω’), νέα_γραμμή, νέα_γραμμή, γράψε ( ‘Δώσε επιλογή: ‘).

Page 74: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

71

3.6.2 ΜΗΧΑΝΙΣΜΟΙ ΕΠΕΞΗΓΗΣΗΣ

/*Mηxανισμός Επεξήγησης "πως" (how) * Ι

εξήγηση_πως :- λήμμα(Ν ,Κ ), γράψε (' Από τον κανόνα:'), νέα_γραμμή, κανόνας(N, K, Σ ),

γράψε ('--------------- ------- '), νέα_γραμμή, τύπωσε_κεφαλή(K), τύπωσε_σώμα(Σ ), νέα_γραμμή,

γράψε (' ---------------------- '), νέα_γραμμή, γράψε ('και επειδή μου είπες ότι:'), νέα_γραμμή, ίσα(Σ,[ΠΚΙ Σ1]), εκτύπωση_συνθηκών(Σ Ι ) ; γράψε (' συμπέρανα ότι:'), γράψε (Κ), νέα_γραμμή, αποτυγχάνει.

εξήγηση_πως. εκτύπωση_συνθηκών([]) :- νέα_γραμμή. εκτύπωση_συνθηκών ( [Σ1 Ι Σ]) :- εκτύπωση_συνθηκης ( Σ 1), εκτύπωση_συνθηκών (Σ). εκτύπωση_συνθηκης ( Σ 1) :-

συναρτησιακό_σύμβoλo( Σ1 ,ΣΣ, Τ), γράψε (ΣΣ ), γράψε (' : '), όρος( 1,Σ1,01), γράψε (01), νέα_γραμμή.

εκτύπωση_κανόνα( Ν) :- κανόνας(N, K, Σ ), τύπωσε - κεφαλή( Κ), τύπωσε_σώμα(Σ ). τύπωσε_κεφαλή(Κ) :-

γράψε(Κ), γράψε(' αν ).

Page 75: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

72

τύπωσε_σώμα( [βασίλειο(φυτά) Ι Σ)) :- !,

τύπωσε_σώμα(Σ ). τύπωσε_σώμα( [Σ1]) :-

γράψε (Σ1 ), γράψε ('.’).

τύπωσε_σώμα([Σ1,Σ2IΣ)) :- γράψε (Σ1 ), γράψε (' και'), τύπωσε_σώμα( [Σ2| Σ]).

Ι * Μηχανισμός Επεξήγησης "γιατί" (why) * Ι

διαδικασία_εξήγησης(Ν) : γράψε (' γιατί προσπαθώ να εφαρμόσω τον κανόνα:'), νέα_γραμμή,

γράψε(' ---------------------------------------------------- '), νέα_γραμμή,

εκτύπωση_κανόνα ( Ν), νέα_γραμμή,

γράψε(' ---------------------------------------------------- '), νέα_γραμμή, γράψε (‘ Για να εφαρμόσω τον κανόνα αυτό χρειάζομαι'), νέα_γραμμή,

γράψε('την πληροφορία που σου ζητώ'), νέα_γραμμή

3.6.3 ΕΡΩΤΗΣΗ ΕΠΙΤΕΥΞΗΣ ΣΤΟΧΟΥ

Ι * Αρχική κλήση (GoaI) * Ι

αρχή:- καθάρισε, αποτυγχάνει.

αρχή:- κατάταξη(φύλλο( Χ1) ), κατάταξη(κλάση(Χ2) ), κατάταξη( τάξη ( Χ3) ), κατάταξη( οικογένεια( Χ4)), κατάταξη ( γένος( Χ5) ), κατάταξη( είδος( Χ6)), !, γράψε (

Ή κατάταξη του Φυτού σου είναι η ακόλουθη:'),

Page 76: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

73

νέα_γραμμή, έξοδος-λήμματος.

αρχή:- λήμμα(_,Χ), ! , έξοδος_τμήματος. αρχή:-

γράψε ( Δυστυχώς δεν μπορώ να δώσω καμία κατάταξη'),

νέα_γραμμή.

3.6.4 ΔΙΑΔΙΚΑΣΙΑ ΕΞΟΔΟΥ ΑΠΟ ΜΙΑ ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ Ι * Διαδικασίες εξόδου* Ι έξοδος-τμήματος:

γράψε ( 'Με βάση την (περιορισμένη) βάση γνώσης μου'),

νέα_γραμμή, γράψε ( 'και τα στοιχεία που μου έδωσες'), νέα_γραμμή, γράψε ( ‘μπορώ να σου δώσω'), νέα_γραμμή, γράψε (

'μόνο ένα μέρος της κατάταξης του νέα_γραμμή, νέα_γραμμή, έξοδος-λήμματος

έξοδος_λήμματος:- λήμμα(_,Χ ), συναρτησιακό_σύμβoλo (Χ, Π, Ζ ), ίσα(Ζ,1), όρος( 1, Χ ,Κατηγορία), γράψε (Π), γράψε (‘:’), γράψε ( Κατηγορία), νέα_γραμμή, αποτυγχάνει. έξοδος_λήμματος :- .

γράψε ( 'θέλεις εξήγηση(1 = ΝΑΙ /2 = ΟΧΙ) :'), διάβασε(Ν), ίσα(Ν,1),

!,

Page 77: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

74

εξήγηση_πως. έξοδος_λήμματος. ίσα(Χ, Χ ). όχι(Χ) :- Χ, !, αποτυγχάνει. όχι(Χ).

3.6.5 ΔΙΑΔΙΚΑΣΙΑ ΚΑΘΑΡΙΣΜΟΥ ΜΙΑΣ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ Ι * Καθάρισμα της προσωρινής βάσης δεδομένων * Ι καθάρισε:

διάγραψε( σπερματική_βλάστη(_)), διάγραψε (ειδικ_για_σπερματική_βλάστη(_)), διάγραψε ( κοτυληδόνες(_)), διάγραψε ( νεύρωση_φύλλων (_)), διάγραψε ( υπόγειος_βλαστός(_)), διάγραψε ( ειδικ_για_υπόγειους_βλαστούς(_)), διάγραψε ( ωοθήκη(_)), διάγραψε ( ειδικ_για_ωοθήκη(_)), διάγραψε ( καρπός(_)), διάγραψε ( ειδικ_για_καρπό(_)), διάγραψε ( στήμονες(_)), διάγραψε ( φύλλα_στύλο(_)), διάγραψε ( σέπαλα(_)), διάγραψε ( στέλεχος(_)), διάγραψε (χρώμα_άνθoυς(_)), διάγραψε (άνθη(_)), διάγραψε (χυμός(_)), διάγραψε (λήμμα(_,_)) .

Page 78: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

75

3.6.6 ΠΡΟΣΠΕΛΑΣΗ ΜΙΑΣ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ ΜΕ ΦΥΣΙΚΗ ΓΛΩΣΣΑ.

Στο παράδειγμα που ακολουθεί χρησιμοποιείται μια βάση δεδομένων η

οποία περιλαμβάνει τρεις σχέσεις: Οι σχέσεις αυτές είναι οι διαρρέει. συνορεύει και βρίσκεται. Το υποσύνολο της φυσικής γλώσσας που «καταλαβαίνει» το σύστημα περιλαμβάνει ερωτήσεις της μορφής:

ποιες χώρες συνορεύουν με την Γιουγκοσλαβία; με ποιες χώρες συνορεύει η Βουλγαρία; ποια ποτάμια διαρρέουν την Ρουμανία; ποιες χώρες διαρρέει ο Δούναβης; ποιες πόλεις βρίσκονται στην Ελλάδα; σε ποια χώρα βρίσκεται το Βουκουρέστι; με ποιες χώρες τις οποίες διαρρέει ο Αξιός συνορεύει η Ελλάδα; ποιες χώρες οι οποίες συνορεύουν με την Αλβανία συνορεύουν με την Τουρκία; ποια χώρα στην οποία βρίσκεται το Βελιγράδι διαρρέει ο Αξιός; ποιο ποτάμι το οποίο διαρρέει την Τουρκία διαρρέει την Ελλάδα;

Το σύστημα αυτό υλοποιείται από το πιο κάτω πρόγραμμα. Οι ερωτήσεις μπορούν να διατυπωθούν στο πρόγραμμα όπως στο παράδειγμα:

?πρόταση( [ποιες, χώρες, συνορεύουν ,με ,την , Γιουγκοσλαβία’,’ ‘;’], [ ],Κλήση, Αντικείμενο), Κλήση.

Η μεταβλητή Αντικείμενο θα πάρει διαδοχικά σαν τιμές τις χώρες οι οποίες συνορεύουν με τη 'Γιουγκοσλαβία'.

Ι * ΣΥΝΤΑΞΗ * Ι

πρόταση(Λ1,Λ4,Κλήση,Αντικ) : ερωτ_ονοματ_φράση( Λ1,Λ2,Αριθ,Πτώση,Πρόθεση,

Σύνoλo,Aντικ,KλήσηΙ ). ρηματική_φράση ( Λ2.Λ3.Αριθ,Πτώση,Πρόθεση,Σύνολο,

Αντικ.Κλήση2), σύνθεσε_κλήση(Κλήση,Κλήση1,Κλήση2) , ερωτηματικό(Λ3,Λ4 ). .ερωτ_ονοματ_φράση ( Λ1,Λ5, Αριθ, Πτώση,Πρόθεση,Σύνολο,

Αντικ,Κλήση) : πιθανή_πρόθεση( Λ1,Λ2,Πρόθεση), ερωτ_αντωνυμία( Λ2,Λ3,Γένοs,Αριθ,Πτώση), ουσιαστικό ( Λ3,Λ4,Γένοs,Αριθ,Πτώση, Σύνολο), πιθανή_αναφορική_φράση( Λ4,Λ5 ,Γένος, Αριθ, Σύνολο, Αντικ,Κλήση).

Page 79: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

76

πιθανή_αναφορική_φράση( Λ,Λ,Γένος,Αριθ,Σύνολο,Αντικ, κενή_κλήση).

πιθανή_αναφορική_φράση ( Λ1,Λ3, Γένος,Αριθ,Σύνολο,Αντικ, Κλήση) :- αναφορική_ονοματική_φράση( Λ1,Λ2,Γένοs,Αριθ,Πτώση, Πρόθεση) , ρηματική_φράση ( Λ2,Λ3 ,Αριθ ,Πτώση,Πρόθεση,Σύνολο, Αντικ,Κλήση). αναφορική- ονοματική- φράση ( Λ1,Λ3, Γένος, Αριθ,Πτώση, Πρόθεση) :- πρόθεση_άρθρο(Λ1,Λ2,Γένοs,Αριθ,Πτώση,Πρόθεση), αναφ_αντωνυμία( Λ2 ,Λ3,Γένοs,Αριθ ,Πτώση). ρηματική_φράση( Λ1,Λ3,Αριθ1 ,ονομ, όχι_πρόθεση,Σύνολο1 , Αντικ1,Κλήση) :- ρήμα(Λ1,Λ2,Αριθ1,Πρόθεση,Σύνολο1,Αντικ1,Σύνολο2, Αντικ2 ,Κλήση), πρόθεση_άρθρο_κύριο_όνομα( Λ2,Λ3,Αριθ2,αιτ ,Πρόθεση, Σύνολο2,Αντικ2 ). ρηματική_φράση( Λ1,Λ3 ,Αριθ2,αιτ ,Πρόθεση,Σύνολο2,Αντικ2,

Κλήση) :- ρήμα( Λ1,Λ2,Αριθ1,Πρόθεση,Σύνολο1,Αντικ1,Σύνολο2, Αντικ2,Κλήση),

πρόθεση_άρθρο_κύριο_όνομα( Λ2,Λ3 ,Αριθ1, ονομ, όχι_πρόθεση,Σύνολο1,Αντικ1 ).

πρόθεση_άρθρο_κύριο_όνομα( Λ1,Λ3,Αριθ,Πτώση,Πρόθεση, Σύνολο,Αντικ) :- πρόθεση_άρθρο(Λ1,Λ2,Γένοs,Αριθ,Πτώση,Πρόθεση), κύριο_όνομα( Λ2,Λ3,Γένοs,Αριθ ,Πτώση, Σύνολο,Αντικ). πρόθεση_άρθρο(Λ1,Λ3,Γένος,Αριθ,Πτώση,Πρόθεση) :-

πιθανή_πρόθεση(Λ1,Λ2,Πρόθεση) , άρθρο( Λ2,Λ3, Γένος,Αριθ ,Πτώση).

πιθανή-πρόθεση(Λ, Λ, όχι_πρόθεση). πιθανή-πρόθεση (ΛΙ,Λ2,Πρόθεση) :-

πρόθεση(Λ1,Λ2,Πρόθεση) . σύνθεσε_κλήση(Kλήση,κενή_κλήση,Kλήση) :- ! . σύνθεσε_κλήση( και(Kλήση1 ,Κλήση2) ,Κλήση1 ,Κλήση2). Ι * ΛΕΞΙΚΟ* Ι /*ερωτ_αντωνυμία ([Α I Λ),Λ, Γένος, Αριθμός, Πτώση) <-- Το Α είναι ερωτηματική αντωνυμία με γραμματικά χαρακτηριστικά που περιγράφονται από τα ορίσματα Γένος, Αριθμός και Πτώση * / ερωτ_αντωνυμία( [ποιος Ι Λ] , Λ, αρσ, εν ,ονομ).

Page 80: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

77

ερωτ_αντωνυμία( [ποιο Ι Λ] , Λ, αρσ ,εν , αιτ). ερωτ_αντωνυμία( [ποιοι Ι Λ] , Λ, αρσ, πληθ, ονομ). ερωτ_αντωνυμία( [ποιους | Λ] , Λ, αρσ, πληθ, αιτ). ερωτ_αντωνυμία( [ποια Ι Λ] , Λ, θήλ ,εν ,ονομ). ερωτ_αντωνυμία( [ποια Ι Λ] , Λ, θήλ, εν , αιτ). ερωτ_αντωνυμία( [ποιες Ι Λ] , Λ, θήλ, πληθ, ονομ). ερωτ_αντωνυμία( [ποιες Ι Λ] , Λ, θήλ, πληθ, αιτ). ερωτ_αντωνυμία( [ποιο Ι Λ] , Λ, ουδ, εν ,ονομ). ερωτ_αντωνυμία( [ποιο Ι Λ] , Λ, ουδ, εν ,αιτ). ερωτ_αντωνυμία( [ποια | Λ] , Λ, ουδ, πληθ, ονομ). ερωτ_αντωνυμία( [ποια | Λ] , Λ, ουδ, πληθ, αιτ). /* αναφ_αντωνυμία( [Α Ι Λ],Λ ,Γένος ,Αριθμός ,Πτώση) <-- το είναι αναφορική αντωνυμία με γραμματικά χαρακτηριστικά πού περιγράφονται από τα ορίσματα Γένος, Αριθμός και Πτώση * / αναφ_αντωνυμία( [οποίος! Λ),Λ, αρσ, εν ,ονομ). αναφ_αντωνυμία( [οποίο Ι Λ],Λ ,αρσ, εν ,αιτ). αναφ_αντωνυμία ( [οποίοι! Λ] ,Λ, αρσ, πληθ, ονομ). αναφ_αντωνυμία ( [οποίους Ι Λ),Λ, αρσ, πληθ, αιτ). αναφ_αντωνυμία( [οποία Ι Λ],Λ, θήλ, εν ,ονομ). αναφ_αντωνυμία ( [οποία / Λ] ,Λ, θήλ, εν ,αι τ). αναφ_αντωνυμία( [οποίες Ι Λ),Λ, θήλ, πληθ, ονομ). αναφ_αντωνυμία ( [οποίες Ι Λ] ,Λ, θήλ, πληθ ,αιτ) . αναφ_αντωνυμία ( [οποίο Ι Λ],Λ, ουδ, εν ,ονομ). αναφ_αντωνυμία( [οποίο Ι Λ] ,Λ, ουδ, εν ,αιτ). αναφ_αντωνυμία ( [οποία Ι Λ] ,Λ, ουδ, πληθ, ονομ). αναφ_αντωνυμία( [οποία Ι Λ],Λ, ουδ, πληθ, αιτ). πρόθεση( [με Ι Λ] ,Λ, με). πρόθεση( [σε Ι Λ] ,Λ, σε). άρθρο( [ο I Λ] ,Λ, αρσ, εν ,ονομ). άρθρο( [τον Ι Λ] ,Λ ,αρσ, εν ,αιτ). άρθρο( [οι Ι Λ] ,Λ, αρσ, πληθ, ονομ). άρθρο( [τους Ι Λ] ,Λ, αρσ, πληθ ,αι τ). άρθρο( [η Ι Λ] ,Λ, θήλ, εν ,ονομ). άρθρο( [την Ι Λ] ,Λ, θήλ, εν ,αιτ). άρθρο( [οι | Λ] ,Λ, θήλ, πληθ, ονομ). άρθρο( [τις | Λ] ,Λ, θήλ, πληθ ,αιτ). άρθρο( [το I Λ] ,Λ, ουδ, εν ,ονομ). άρθρο( [το Ι Λ] ,Λ, ουδ, εν ,αιτ). άρθρο( [τα Ι Λ] ,Λ, ουδ, πληθ, ονομ). άρθρο( [τα | Λ] ,Λ, ουδ, πληθ, αιτ) πρόθεση_άρθρο( [στον Ι Λ] ,Λ, αρσ ,εν ,αιτ ,σε). πρόθεση_άρθρο ( [στους Ι Λ),Λ, αρσ, πληθ ,αι τ, σε) .

Page 81: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

78

πρόθεση_άρθρο ( [στην Ι Λ] ,Λ, θήλ, εν ,αιτ, σε). πρόθεση_άρθρο ( [στις |Λ),Λ, θήλ, πληθ, αιτ, σε). πρόθεση_άρθρο ( [στο | Λ] ,Λ, ουδ, εν ,αιτ ,σε). πρόθεση_άρθρο ( [στα Ι Λ],Λ, ουδ, πληθ, αιτ, σε). ερωτηματικό( [';' Ι Λ], Λ). ουσιαστικό( [χώρα Ι Λ] , Λ, θηλ, εν ,ονομ, χώρα). ουσιαστικό( [χώρα Ι Λ], Λ, θηλ, εν ,αιτ ,χώρα). ουσιαστικό( [χώρες Λ], Λ, θηλ, πληθ, ονομ, χώρα). ουσιαστικό( [χώρες | Λ], Λ, θηλ, πληθ, αιτ, χώρα). ουσιαστικό( [ποτάμι Ι Λ], Λ, ουδ, εν, ονομ, ποτάμι). ουσιαστικό( [ποτάμια Ι Λ], Λ, ουδ, πληθ, ονομ, ποτάμι). ουσιαστικό( [πόλη Ι Λ], Λ, θηλ, εν ,ονομ, πόλη). " ουσιαστικό( [πόλεις Ι Λ], Λ, θηλ, πληθ, ονομ, πόλη). /* κύριο_όνομα([Α I Λ], Λ, Γένος, Αριθμός, Πτώση, Κατηγορία, Άτομο) <-- Το Α είναι κύριο όνομα με γραμματικά χαρακτηριστικά που περιγράφονται από τα ορίσματα Γένος ( Αριθμός και Πτώση, και αντιστοιχεί στο άτομο της βάσης Άτομο που ανήκει στην κατηγορία Κατηγορία * / κύριο_όνομα( ['Αλβανία' Ι Λ], Λ, θηλ, εν ,ονομ, χώρα, αλβανία). κύριο_όνομα( ['Αλβανία' Ι Λ], Λ, θηλ, εν ,αιτ ,χώρα, αλβανία). κύριο_όνομα( ['Βουλγαρία' Ι Λ], Λ, θηλ, εν ,ονομ, χώρα, βουλγαρία). κύριο_όνομα( ['Βουλγαρία' Ι Λ], Λ, θηλ, εν ,αιτ, χώρα, βουλγαρία). κύριο_όνομα( [Ελλάδα' Ι Λ], Λ, θηλ, εν ,ονομ, χώρα, ελλάδα). κύριο_όνομα( [Ελλάδα' Ι Λ], Λ, θηλ, εν ,αιτ ,χώρα ,ελλάδα). κύριο_όνομα( ['Ρουμανία' Ι Λ], Λ, θηλ, εν ,ονομ, χώρα, ρουμανία). κύριο - όνομα(['Ρουμανία' Ι Λ], Λ, θηλ, εν ,αιτ ,χώρα, ρουμανία). κύριο_όνομα(['Τουρκία' Ι Λ], Λ, θηλ, εν ,ονομ, χώρα, τουρκία). κύριο_όνομα(['Τουρκία' Ι Λ], Λ, θηλ, εν ,αιτ, χώρα, τουρκία). κύριο_όνομα([‘Γιουγκοσλαβία' Ι Λ], Λ, θηλ, εν ,ονομ, χώρα,

γιουγκοσλαβία) . κύριο_όνομα([‘Γιουγκοσλαβία' Ι Λ], Λ, θηλ, εν ,αιτ, χώρα,

γιουγκοσλαβία) . κύριο_όνομα(['Αξιός' Ι Λ], Λ, αρσ, εν, ονομ, ποτάμι, αξιός). κύριο_όνομα([‘Δούναβης' Ι Λ], Λ, αρσ, εν ,ονομ, ποτάμι, δούναβης). κύριο_όνομα([Έβρος' Ι Λ], Λ, αρσ, εν ,ονομ, ποτάμι, έβρος). κύριο_όνομα (['Τίρανα' Ι Λ] ] , Λ, ουδ, πληθ, ονομ, πόλη, τίρανα). κύριο_όνομα(['Σόφια' Ι Λ], Λ, θηλ, εν ,ονομ, πόλη, σόφια). κύριο_όνομα(['Αθήνα' Ι Λ], Λ, θηλ, εν, ονομ ,πόλη, αθήνα). κύριο_όνομα(['Βουκουρέστι' Ι Λ], Λ, ουδ, εν ,ονομ, πόλη, βουκουρέστι) . κύριο_όνομα(['Άγκυρα ' Ι Λ], Λ, θηλ, εν ,ονομ, πόλη, άγκυρα). κύριο_όνομα(['Βελιγράδι' Ι Λ] , Λ, ουδ, εν ,ονομ, πόλη, βελιγράδι).

Page 82: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

79

/* ρήμα([ΠΙ Λ ],Λ,Αρίθμ,Πρόθ,Κατηγ1,Αντ1,Κατηγ2,Αντ2, σχέση_βάσης(Αντ,Αντ2)) <-- το ρήμα Ρ εισάγει τη σχέση της βάσης σχέση-βάσης, είναι αριθμού Αριθμ, το υποκείμενο του (Αντ1) ανήκει στην κατηγορία Κατηγ1 και το αντικείμενο του (Αντ2), που συντάσσεται με την πρόθεση Πρόθ, ανήκει στην κατηγορία Κατηγ2 * / ρήμα( [συνορεύει Ι Α] ,Α, εν ,με, χώρα, Αντικ1 ,χώρα,Αντικ2, συνορεύει(Αντικ1,Αντικ2) ). ρήμα( [συνορεύουν Ι Α] ,Α, πληθ, με, χώρα, Αντικ1 ,χώρα,Αντικ2, συνορεύει( Αντικ1 ,Α ντικ2) ). ρήμα( [διαρρέει Ι Α] ,Α, εν ,όχι-πρόθεση, ποτάμι, Αντικ1 ,χώρα, Αντικ2,διαρρέει(Αντικ1,Αντικ2) ). ρήμα( [διαρρέουν Ι Α] ,Α, πληθ , όχι-πρόθεση , ποτάμι ,Αντικ1 ,χώρα, Αντικ2,διαρρέει(Αντικ1,Αντικ2) ). ρήμα( [βρίσκεται Ι Α] ,Α, εν ,σε, πόλη, Αντικ1,χώρα,Αντικ2, βρίσκεται(Αντικ1,Α ντικ2) ). ρήμα( [βρίσκονται Ι Α] ,Α, πληθ, σε, πόλη, Αντικ1 ,χώρα, Αντικ2, βρίσκεται(Αντικ1,Αντικ2) ). και(Κλήση1,Κλήση2) :-

Κλήση1 , Κλήση2.

/* ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ */ * συνορεύει(Χl,Χ2) <-- Η χώρα Χ1 συνορεύει με τη χώρα Χ2 * / συνορεύει( αλβανία, ελλάδα). συνορεύει( αλβανία, Γιουγκοσλαβία). συνορεύει( βουλγαρία, ελλάδα). συνορεύει(βουλγαρία, ρουμανία). συνορεύει(βουλγαρία, τουρκία). συνορεύει(βουλγαρία, Γιουγκοσλαβία). συνορεύει( ελλάδα, αλβανία). συνορεύει(ελλάδα, βουλγαρία). συνορεύει( ελλάδα, τουρκία). συνορεύει(ελλάδα, γιουγκοσλαβία). συνορεύει( ρουμανία, βουλγαρία). συνορεύει( ρουμανία, γιουγκοσλαβία). συνορεύει( τουρκία, βουλγαρία). συνορεύει(τουρκία, ελλάδα). συνορεύει( γιουγκοσλαβία, αλβανία). συνορεύει( γιουγκοσλαβία, βουλγαρία). συνορεύει( γιουγκοσλαβία, ελλάδα). συνορεύει( γιουγκοσλαβία, ρουμανία).

Page 83: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΕΝΟΤΗΤΑ 3 - Η PROLOG ΚΑΙ ΟΙ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ

80

/* διαρρέει(Π, Χ) <-- Το ποτάμι Π βρίσκεται στη χώρα Χ */ διαρρέει( αξιός, ελλάδα). διαρρέει(αξιός, γιουγκοσλαβία). διαρρέει( δούναβης, βουλγαρία). διαρρέει( δούναβης, ρουμανία). διαρρέει( δούναβης, γιουγκοσλαβία). διαρρέει( έβρος, βουλγαρία). διαρρέει( έβρος, ελλάδα). διαρρέει( έβρος, τουρκία). /* βρίσκεται(Π, Χ) <-- Η πόλη Π βρίσκεται στη χώρα Χ * / βρίσκεται( τίρανα, αλβανία). βρίσκεται( σόφια, βουλγαρία'). βρίσκεται( αθήνα, ελλάδα). βρίσκεται( βουκουρέστι, ρουμανία). βρίσκεται ( άγκυρα, τουρκία). βρίσκεται( βελιγράδι, γιουγκοσλαβία).

Page 84: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ

ΒΙΒΛΙΟΓΡΑΦΙΑ.

1.PROγραμματίζοντας στη LOGική. (Με εφαρμογές της Τεχνητής Νοημοσύνης.) Μ. ΚΑΤΖΟΥΡΑΚΗ- Μ. ΓΕΡΓΑΤΣΟΥΛΗΣ- Σ.

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

ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ. 2. PROLOG (Τεχνικές Προγραμματισμού.) ΣΠΥΡΟΣ ΞΑΝΘΑΚΗΣ. (ΑΘΗΝΑ 1990). 3. LEARN PROLOG NOW! Patrick Blackburn ([email protected]) Johan Bos ([email protected]) Kristina Strien ([email protected]) http://www.coli.uni-sb.de/kris/learn-prolog-now 4. SOFTWARE—PRACTICE AND EXPERIENCE, VOL.

21(6), 603–624 (JUNE 1991) Reflection Mechanisms for Combining Prolog

Databases. EVELINA LAMMA, PAOLA MELLO AND ANTONIO

NATALI. Dipartimento di Elettronica, Informatica e

Sistermistica, Università di Bologna. 5. ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

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

Πηγές internet: http://www.binnetcorp.com http://logic.csci.unt.edu:8080/wordnet_agent/frame.html http://logic.csci.unt.edu:7070/

Page 85: ΠΤΥΧΙΑΚΗ – ΑΣΚΗΣΗdigilib.teiemt.gr/jspui/bitstream/123456789/2493/1/...Α.Μ. 220 nzarpas@in.gr ΥΠΕΥΘΥΝΟΣ ΚΑΘΗΓΗΤΗΣ: Dr. ΣΤΕΡΓΙΟΣ ΠΑΠΑΔΗΜΗΤΡΙΟΥ