Υπολογιστική Λογική και Λογικός Προγραμματισμός

Σχετικά έγγραφα
Εισαγωγή στους Αλγορίθμους

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Εισαγωγή στους Αλγορίθμους

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Διοικητική Λογιστική

Εισαγωγή στους Αλγορίθμους

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Πληροφορική ΙΙ Θεματική Ενότητα 5

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Δομημένος Προγραμματισμός

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 1

Δομημένος Προγραμματισμός

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

Διοίκηση Επιχειρήσεων

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 4

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Προγραμματισμός H/Y Ενότητα 2: Εντολές ελέγχου ροής. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Γενικά Μαθηματικά Ι. Ενότητα 15: Ολοκληρώματα Με Ρητές Και Τριγωνομετρικές Συναρτήσεις Λουκάς Βλάχος Τμήμα Φυσικής

Μηχανολογικό Σχέδιο Ι

Διδακτική της Πληροφορικής

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Πληροφορική ΙΙ Ενότητα 1

Γενικά Μαθηματικά Ι. Ενότητα 12: Κριτήρια Σύγκλισης Σειρών. Λουκάς Βλάχος Τμήμα Φυσικής ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

Βάσεις Περιβαλλοντικών Δεδομένων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Δομές Δεδομένων Ενότητα 1

Ιστορία της μετάφρασης

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Λογικός Προγραμματισμός Ασκήσεις

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Βέλτιστος Έλεγχος Συστημάτων

Διδακτική της Πληροφορικής

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

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

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

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός Η/Υ. Συναρτήσεις & Υποπρογράμματα. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Λογικός Προγραμματισμός Ασκήσεις

Ηλεκτρονικοί Υπολογιστές

Θεσμοί Ευρωπαϊκών Λαών Ι 19 ος -20 ος αιώνας

Εισαγωγή στους Η/Υ. Ενότητα 2β: Αντίστροφο Πρόβλημα. Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Εισαγωγή στους Υπολογιστές

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

ΗΛΕΚΤΡΟΝΙΚΗ IΙ Ενότητα 6

Εκκλησιαστικό Δίκαιο

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στους Αλγορίθμους Ενότητα 11η Άσκηση - Σταθμισμένος Χρονοπρογραμματισμός Διαστημάτων

Ιδιότητες και Τεχνικές Σύνταξης Επιστημονικού Κειμένου

Κβαντική Επεξεργασία Πληροφορίας

Μηχανολογικό Σχέδιο Ι

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 4: Συναρτήσεις

Εφαρμογές πληροφορικής σε θέματα πολιτικού μηχανικού

Διοικητική Λογιστική

Θεσμοί Ευρωπαϊκών Λαών Ι 19 ος -20 ος αιώνας

Μάρκετινγκ Αγροτικών Προϊόντων

Τεχνητή Νοημοσύνη Ι. Διαφάνειες Εργαστηρίου. Σγάρμπας Κυριάκος Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών

Τεχνικό Σχέδιο - CAD

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές

ΗΛΕΚΤΡΟΝΙΚΗ IΙ Ενότητα 3

Εκκλησιαστικό Δίκαιο

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ενότητα: ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ ΚΥΡΟΠΟΥΛΟΣ ΚΩΝΣΤΑΝΤΙΝΟΣ. Τμήμα Διοίκηση Επιχειρήσεων (Κοζάνη)

Τεχνικό Σχέδιο - CAD

Λογικός Προγραμματισμός Ασκήσεις

1 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Θέματα Εφαρμοσμένης. Ενότητα 14.2: Η ψήφος στα πρόσωπα. Θεόδωρος Χατζηπαντελής Τμήμα Πολιτικών Επιστημών ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

Μυελού των Οστών Ενότητα #1: Ερωτήσεις κατανόησης και αυτόαξιολόγησης

Ευφυής Προγραμματισμός

Τεχνολογία Λογισμικού

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 6: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ: ΠΡΟΒΛΗΜΑ ΑΝΑΖΗΤΗΣΗΣ

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Βέλτιστος Έλεγχος Συστημάτων

Εισαγωγή στους Υπολογιστές

Λογικός Προγραμματισμός Ασκήσεις

Λογικός Προγραμματισμός Ασκήσεις

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

Διδακτική Πληροφορικής

Κβαντική Επεξεργασία Πληροφορίας

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

Προγραμματισμός Η/Υ. 3 η ενότητα. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Transcript:

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Υπολογιστική Λογική και Λογικός Προγραμματισμός Ενότητα 7: Γλώσσα Prolog: Έλεγχος εκτέλεσης προγράμματος, Αποκοπή, Άρνηση Νίκος Βασιλειάδης, Αναπλ. Καθηγητής

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Γλώσσα Prolog: Έλεγχος εκτέλεσης προγράμματος, Αποκοπή, Άρνηση.

Αποκοπή Η στρατηγική αναζήτησης λύσεων της Prolog βασίζεται στον κανόνα "Από αριστερά προς τα δεξιά και κατά βάθος" (LRDF) αναζήτηση στο δένδρο υπολογισμού. Μπορούμε να επέμβουμε κάπως σε αυτή τη διαδικασία, αλλάζοντας τη σειρά των προτάσεων ή την σειρά των κλήσεων στις προτάσεις. Η Prolog προσφέρει μια ενσωματωμένη διαδικασία, την αποκοπή (cut) η οποία συμβολίζεται με! και επιδρά στη διαδικασία εύρεσης απαντήσεων της Prolog. 5

Χρησιμότητα Αποκοπής Η κύρια δουλειά της αποκοπής είναι να μειώνει το χώρο αναζήτησης (search space) κλαδεύοντας δυναμικά (δηλ. κατά την ώρα της εκτέλεσης) το δένδρο υπολογισμού. Είναι ένας τρόπος ελέγχου του μηχανισμού οπισθοδρόμησης, «απαγορεύοντας» τη δημιουργία κλαδιών τα οποία γνωρίζουμε ότι δεν θα οδηγήσουν σε λύση. 6

Λειτουργία Αποκοπής (1/2) Η αποκοπή είναι ένα ενσωματωμένο κατηγόρημα, συμβολίζεται με το θαυμαστικό "!" και πετυχαίνει πάντα. Όταν ο μηχανισμός αναζήτησης συναντήσει αποκοπή τότε: Αγνοούνται όλες οι προτάσεις του ίδιου κατηγορήματος με την πρόταση και που περιέχει την αποκοπή και έπονται αυτής. Αγνοούνται όλοι οι εναλλακτικοί τρόποι ικανοποίησης της κλήσης που αντιστοιχεί στην διαδικασία που περιέχει την αποκοπή. Αγνοούνται όλες οι εναλλακτικές λύσεις των ατομικών τύπων (κλήσεων) οι οποίοι βρίσκονται πριν από την αποκοπή μέσα στο σώμα του κανόνα στον οποίο εμφανίζεται. 7

Λειτουργία Αποκοπής (2/2)?- p. p 1 :-.. p 2 :- b 1, b 2,, b k,!, b k+1,, b n. p 3 :-. p n :-. Όταν εκτελεστεί η αποκοπή, «κόβονται» όσες εναλλακτικές λύσεις έχουν οι κλήσεις b 1, b 2,, b k. Επίσης, οι προτάσεις p 3,, p n, είναι σα να μην υπάρχουν. Η αποκοπή δεν έχει καμία επίπτωση στις κλήσεις b k+1,, b n, καθώς και στην πρόταση p 1. 8

Παραδείγματα Αποκοπής (1/2) Δίνεται το ακόλουθο Prolog πρόγραμμα: p(1). p(2):-!. p(3). Ποιες είναι οι απαντήσεις στις ακόλουθες ερωτήσεις;?-p(x).?-p(x), p(y).?-p(x),!, p(y). X=1; X=2; No X=1, Y=1; X=1, Y=2; X=2, Y=1; X=2, Y=2; No X=1, Y=1; X=1, Y=2; No 9

Παραδείγματα Αποκοπής (2/2) Τι θα γινόταν αν δεν υπήρχε η αποκοπή στο πρόγραμμα; p(1). p(2). p(3).?-p(x).?-p(x), p(y).?-p(x),!, p(y). X=1; X=2; Χ=3; No X=1, Y=1; X=1, Y=2; X=1, Y=3; X=2, Y=1; X=2, Y=2; X=2, Y=3; X=3, Y=1; X=3, Y=2; X=3, Y=3; No X=1, Y=1; X=1, Y=2; X=1, Y=3; No 10

?- a. Επίπτωση Αποκοπής στο a :- b, c....... b :- d,!, e....... d 1. d 2. d n. Δένδρο Εκτέλεσης Η αποκοπή «κόβει» όλα (πλην ενός) τα αδέλφια και παιδιά του κόμβου που περιέχει την αποκοπή.?- a.?- b, c...?- d,!, e, c.?- d 1,!, e, c.?- d 2,!, e, c.?-!, e.?- e... Δεν επηρεάζονται..?- d n,!, e, c. Δεν επηρεάζονται 11

Goal:?- p(x, Y), t(x). C1: p(x,y):- q(x,y), r(y). C2: p(x,y):- s(x), r(y). C3: q(a, b). C4: q(b, c). C5: q(c, a). C6: r(c). C7: s(a). C8: t(a). C9: t(b). { X/a, Y/b } { X/X, Y/Y }?- q(x,y), r(y), t(x) κόμβος 2 C 3 C 4 C 5 { X/b, Y/c }?- p(x,y), t(x) κόμβος 1 C 1 C 2 { X/c, Y/a } { X/X, Y/Y }?- s(x), r(y), t(x) κόμβος 7 { X/a } C 7?- r(b), t(a) κόμβος 3?- r(c), t(b) κόμβος 4?- r(a), t(c) κόμβος 6?- r(y), t(a) κόμβος 8 C 6 { Y/c } C 6 αποτυχία?- t(b) κόμβος 5 αποτυχία?- t(a) κόμβος 9 C 9 C 8 επιτυχία επιτυχία 12

Goal:?- p(x, Y), t(x). C1: p(x,y):- q(x,y),!, r(y). C2: p(x,y):- s(x), r(y). C3: q(a, b). C4: q(b, c). C5: q(c, a). C6: r(c). C7: s(a). C8: t(a). C9: t(b). { X/a, Y/b }?-!, r(b), t(a) κόμβος 3 κλάδεμα { X/X, Y/Y }?- q(x,y),!, r(y), t(x) κόμβος 2 C 3 C 4 Χ Χ C 5?- p(x,y), t(x) κόμβος 1 Χ C 1 C 2?- r(b), t(a) κόμβος 4 αποτυχία Κλαδεύονται οι εναλλακτικές κλήσεις πριν το cut και εντός του ίδιου κανόνα και οι εναλλακτικοί ίδιοι κανόνες. 13

Goal:?- p(x, Y), t(x). C1: p(x,y):- q(x,y), r(y). C2: p(x,y):- s(x), r(y). C3: q(a, b):-!. C4: q(b, c). C5: q(c, a). C6: r(c). C7: s(a). C8: t(a). C9: t(b). { X/a, Y/b } { X/X, Y/Y }?- q(x,y), r(y), t(x) κόμβος 2 C 3 C4 Χ Χ C 5?- p(x,y), t(x) κόμβος 1 C 1 C 2 { X/X, Y/Y }?- s(x), r(y), t(x) κόμβος 8 { X/a } C 7?-!, r(b), t(a) κόμβος 3 κλάδεμα?- r(y), t(a) κόμβος 9 { Y/c } C 6?- r(b), t(a) κόμβος 4 Κλαδεύονται οι εναλλακτικές κλήσεις πριν το cut και εντός του ίδιου κανόνα (εδώ δεν υπάρχουν) και οι εναλλακτικοί ίδιοι κανόνες.?- t(a) κόμβος 10 C 8 αποτυχία επιτυχία 14

Πλεονεκτήματα Χρήσεις Αποκοπής Πλεονεκτήματα. Ταχύτερη εκτέλεση προγράμματος. Εξοικονόμηση μνήμης. Αποφυγή ατέρμονων αναζητήσεων. Περικοπή λύσεων που πλεονάζουν. Ανάπτυξη προγραμμάτων που θα ήταν αδύνατα χωρίς αυτήν. Υλοποίηση της άρνησης. Χρήσεις. Παράλειψη άσκοπων ελέγχων. Τερματισμός παραγωγής εναλλακτικών λύσεων. Εξαναγκασμός του συστήματος σε αποτυχία. Ορισμός δομών ελέγχου. 15

Παράλειψη άσκοπων ελέγχων (1/3) Η αποκοπή μπορεί να χρησιμοποιηθεί για την αποφυγή άσκοπων ελέγχων κατά την οπισθοδρόμηση, όταν γνωρίζουμε ότι μόνο μια πρόταση από το κατηγόρημα μπορεί να επιτύχει σε κάθε δεδομένη χρονική στιγμή. Στο παράδειγμα αποφεύγονται οι περιττοί έλεγχοι κατά την οπισθοδρόμηση αφού γνωρίζουμε εκ των προτέρων ότι μόνο μια από τις τρεις προτάσεις του προγράμματος μπορεί να είναι αληθής κάθε φορά. sign(x, positive) :- Χ > 0,!. sign(x, zero) :- Χ =:= 0,!. sign(χ, negative) :- Χ < 0.?- sign(5,a). A = positive; no?- sign(-5,a). A = negative Για να απαντηθεί το no δεν εκτελείται κανένας έλεγχος. Χωρίς cut θα εκτελούνταν άλλοι 2 έλεγχοι. 16

Παράλειψη άσκοπων ελέγχων (2/3) Χρησιμοποιώντας την αποκοπή μπορούμε ακόμη και να παραλείψουμε συνθήκες. Έτσι επιταχύνεται η εκτέλεση των προγραμμάτων καθώς εκτελούνται λιγότερες εντολές. Το προηγούμενο παράδειγμα μπορεί να γραφεί (χωρίς να αλλάξουν τα αποτελέσματα που επιστρέφει): sign(x, positive) :- Χ > 0,!. sign(x, zero) :- Χ =:= 0,!. sign(χ, negative).?- sign(5,a). A = positive; no?- sign(-5,a). A = negative Για να απαντηθεί το negative εκτελούνται 2 έλεγχοι και όχι 3 (όπως στο προηγούμενο παράδειγμα). 17

Παράλειψη άσκοπων ελέγχων (3/3) Γιατί είναι απαραίτητη η αποκοπή για να παραλείψουμε συνθήκες; Η σειριακότητα της Prolog δεν αρκεί? sign(x, positive) :- Χ > 0. sign(x, zero) :- Χ =:= 0. sign(χ, negative).?- sign(-5,a). A = negative?- sign(5,a). A = positive; A = negative; no Για να απαντηθεί το negative εκτελούνται 2 έλεγχοι. Το κατηγόρημα επιστρέφει επιπλέον λύσεις (ΛΑΘΟΣ) στην οπισθοδρόμηση. 18

Τερματισμός παραγωγής εναλλακτικών λύσεων (1/4) Το member/2 επιστρέφει όλα τα στοιχεία μιας λίστας αν το πρώτο όρισμα είναι μεταβλητή. member(x,[x _]). member(x,[_ T]) :- member(x,t).?- member(x,[a,b,c]). X=a; X=b; X=c; no 19

Τερματισμός παραγωγής εναλλακτικών λύσεων (2/4) Έστω ότι θέλω το member/2 να επιστρέφει ένα μόνο στοιχείο της λίστας (π.χ. το πρώτο) αν το πρώτο όρισμα είναι μεταβλητή. member(x,[x _]) :-!. member(x,[_ T]) :- member(x,t).?- member(x,[a,b,c]). X=a; no 20

Τερματισμός παραγωγής εναλλακτικών λύσεων (3/4) Αν βάλω το cut στον δεύτερο κανόνα του member τι θα συμβεί; member(x,[x _]). member(x,[_ T]) :- member(x,t),!.?- member(x,[a,b,c]). X=a; Χ=b; no Ο πρώτος κανόνας μπορεί να έχει εναλλακτικές λύσεις. Αφού εκτελεστεί η πρώτη αναδρομική κλήση και δοθεί η δεύτερη απάντηση, το cut κόβει τις εναλλακτικές κλήσεις της. 21

Τερματισμός παραγωγής εναλλακτικών λύσεων (4/4) Αν βάλω το cut στον δεύτερο κανόνα του member (πιο αριστερά) τι θα συμβεί; member(x,[x _]). member(x,[_ T]) :-!, member(x,t).?- member(x,[a,b,c]). X=a; Χ=b; Χ=c; no Το cut δεν κόβει τίποτε, αφού δεν υπάρχει αριστερότερη κλήση, ούτε πιο κάτω κανόνας. 22

Εξαναγκασμός σε αποτυχία Με την αποκοπή και το κατηγόρημα fail μπορούμε να εξαναγκάσουμε το μηχανισμό της Prolog να αποτύχει, δηλαδή να επιστρέψει no, όταν το θελήσουμε εμείς. not_member(x,l) :- member(x,l),!, fail. not_member(x,l).?- not_member(a,[b,a,c,d]). no?- not_member(a,[b,q,c,d]). yes 23

Άρνηση στην Prolog ως αποτυχία (1/3) Γενικότερα, η άρνηση μέσω αποτυχίας για οποιοδήποτε κατηγόρημα επιτυγχάνεται ως εξής: not(goal) :- Goal,!, fail. not(_). Το κατηγόρημα not δέχεται ως όρισμα μια οποιαδήποτε κλήση της Prolog. Αν η κλήση μπορεί να αποδειχθεί τότε το κατηγόρημα αποτυγχάνει. Αν όχι τότε πετυχαίνει. Μεταβλητή κλήση 24

Άρνηση στην Prolog ως αποτυχία (2/3)?- not(member(a,[b,a,c,d])). no?- not(member(a,[b,q,c,d])). yes?- not(last(a,[c,b,a])). no?- not(last(d,[c,b,a])). yes 25

Άρνηση στην Prolog ως αποτυχία (3/4) Μία από τις σημαντικότερες διαφορές της Prolog από την κατηγορηματική λογική είναι η σημασία της άρνησης. Στην κατηγορηματική λογική μπορούν να υπάρξουν αρνητικά γεγονότα. Ατομικοί τύποι για τους οποίους δηλώνεται ρητά ότι είναι ψευδείς. Στην Prolog υπάρχει η δυνατότητα αναπαράστασης μόνο θετικής γνώσης. Η ύπαρξη κάποιου γεγονότος δηλώνει την αλήθεια του. Θεωρούμε πως ό,τι δεν αναφέρεται ρητά στην μνήμη της Prolog, τότε δεν ισχύει. Αυτό ονομάζεται "υπόθεση του κλειστού κόσμου" (closedworld assumption). Δίνει τη δυνατότητα ύπαρξης ενός είδους περιορισμένης άρνησης, της "άρνησης ως αποτυχίας" (negation-as-failure). 26

Άρνηση στην Prolog ως αποτυχία (4/4) Σύμφωνα με την υπόθεση του κλειστού κόσμου, οποιαδήποτε σχέση δεν μπορεί να αποδειχθεί από το σύστημα θεωρείται ως ψευδής. Η υλοποίηση αυτή της άρνησης διαφέρει σαφώς από την κλασσική έννοια της άρνησης στην λογική. Χρησιμοποιήθηκε καθώς απαλλάσσει τον προγραμματιστή από την υποχρέωση του ορισμού όλης την αρνητικής πληροφορίας για κάποια εφαρμογή. Χρησιμοποιείται ευρέως και σε άλλα συστήματα, όπως π.χ. οι Βάσεις Δεδομένων. 27

Προβλήματα με την άρνηση programmer(mary). male(nick). female(x) :- not(male(x)).?- programmer(x), female(x). X = mary?- female(x), programmer(x). Υπάρχει πρόβλημα όταν οι κλήσεις που βρίσκονται μέσα στην άρνηση δεν έχουν μεταβλητές με τιμές όταν εκτελούνται Η άρνηση ΔΕΝ μπορεί να δώσει τιμές στις μεταβλητές Επιλύεται με αναδιάταξη των προτάσεων ή των κλήσεων. No 28

Ορισμός δομών ελέγχου Με το cut μπορούμε να ελέγξουμε τη ροή εκτέλεσης ενός προγράμματος. Κατηγόρημα if_then_else(condition,then,else) αν αληθεύει η συνθήκη Condition εκτελείται ο στόχος Then. αλλιώς εκτελείται ο στόχος Else. if_then_else(condition,then,else) :- Condition,!, Then. if_then_else(condition,then,else) :- Else.?- if_then_else(5=5,write(ok),write(wrong)). ok?- if_then_else(5=6,write(ok),write(wrong)). wrong 29

Παράδειγμα Δομών Ελέγχου Να οριστεί το κατηγόρημα max(x,y,max), το οποίο επιστρέφει το μέγιστο από τα X, Y στο όρισμα Max. max(x,y,max) :- if_then_else(x>y,max=x,max=y). max(x,y,max) :- (X>Y -> Max=X ; Max=Y).?- max(4,7,a). A = 7?- max(8,2,a). A = 8?- max(6,6,a). A = 6 30

Δομή Ελέγχου case (1/2) Να οριστεί το κατηγόρημα case(listofconditions,listofactions,otherwise), το οποίο να υλοποιεί τη δομή ελέγχου case των συμβατικών γλωσσών προγραμματισμού. case([],[],otherwise) :- Otherwise. case([condition _],[Action _],_) :- Condition,!, Action. case([_ RestConditions],[_ RestActions],Otherwise) :- case(restconditions,restactions,otherwise). 31

Δομή Ελέγχου case (2/2) menu :- read(x), case( [X=1, X=2, X=3], Διαβάζει έναν όρο από το πληκτρολόγιο. [write('1st choice'), write('2nd choice'), write('3rd choice')], write('out of Range')), nl.?- menu. : 2. 2nd choice yes?- menu. : 5. Out of Range yes 32

Είδη Αποκοπής Η αποκοπή μπορεί να μεταβάλει την δηλωτική ερμηνεία ενός προγράμματος. ΠΡΑΚΤΙΚΑ: Δηλωτική ερμηνεία ενός προγράμματος είναι το σύνολο όλων των συμπερασμάτων στα οποία καταλήγει. Αν η αποκοπή μεταβάλλει την δηλωτική ερμηνεία ενός προγράμματος ονομάζεται κόκκινη αποκοπή (red cut). Αν η αποκοπή δεν μεταβάλλει την δηλωτική ερμηνεία ενός προγράμματος, αλλά απλά κάνει το πρόγραμμα πιο γρήγορο/αποδοτικό, ονομάζεται πράσινη αποκοπή (green cut). 33

Παράδειγμα Κόκκινης Αποκοπής sign(x, positive) :- Χ > 0,!. sign(x, zero) :- Χ =:= 0,!. sign(χ, negative). sign(x, positive) :- Χ > 0. sign(x, zero) :- Χ =:= 0. sign(χ, negative).?- sign(5,a). A = positive; no?- sign(5,a). A = positive; A = negative; no Η αποκοπή είναι κόκκινη γιατί άλλα αποτελέσματα επιστρέφονται με και άλλα χωρίς αυτήν. 34

Παράδειγμα Πράσινης Αποκοπής sign(x, positive) :- Χ > 0,!. sign(x, zero) :- Χ =:= 0,!. sign(χ, negative) :- Χ < 0. sign(x, positive) :- Χ > 0. sign(x, zero) :- Χ =:= 0. sign(χ, negative) :- Χ < 0.?- sign(5,a). A = positive; no?- sign(5,a). A = positive; no Η αποκοπή είναι πράσινη γιατί επιστρέφονται τα ίδια αποτελέσματα με και χωρίς αυτήν. Η διαφορά με το προηγούμενο παράδειγμα οφείλεται στην έξτρα συνθήκη Χ < 0. Το πρόγραμμα είναι αποδοτικότερο από αυτό χωρίς αποκοπή, αλλά όχι διαφορετικό. 35

Αποκοπή που δεν επηρεάζει (1/2) Η αποκοπή αν τοποθετηθεί στην αρχή της τελευταίας πρότασης ενός κατηγορήματος δεν επηρεάζει καθόλου. Δεν υπάρχουν εναλλακτικές προτάσεις sign παρακάτω για να τις «κόψει». Δεν υπάρχουν κλήσεις αριστερότερα της αποκοπής των οποίων τις εναλλακτικές λύσεις να «κόψει». sign(x, positive) :- Χ > 0,!. sign(x, zero) :- Χ =:= 0,!. sign(χ, negative) :-!, Χ < 0. 36

Αποκοπή που δεν επηρεάζει (2/2) Αν η αποκοπή τοποθετούνταν δεξιότερα στην τελευταία πρόταση, πάλι δεν θα επηρέαζε καθόλου, καθώς η κλήση X<0 δεν έχει εναλλακτικές λύσεις. sign(x, positive) :- Χ > 0,!. sign(x, zero) :- Χ =:= 0,!. sign(χ, negative) :- Χ < 0,!. 37

Ασκήσεις με αποκοπή Να ορισθεί σχέση split(nums,pos,neg) που χωρίζει λίστα αριθμών Nums σε θετικούς Pos (και 0) και αρνητικούς Neg.?- split([3,-1,0,5,-2],a,b). Α = [3,0,5], Β = [-1,-2] Λύση με αποκοπή. split([],[],[]). split([x L],[X L1],L2) :- X >= 0,!, split(l,l1,l2). split([x L],L1,[X L2]) :- split(l,l1,l2). Λύση χωρίς αποκοπή. split([],[],[]). split([x L],[X L1],L2) :- X >= 0, split(l,l1,l2). split([x L],L1,[X L2]) :- X < 0, split(l,l1,l2). Κόκκινο cut 38

Συνδυαστική λύση Λύση με πράσινη αποκοπή. split([],[],[]). split([x L],[X L1],L2) :- X >= 0,!, split(l,l1,l2). split([x L],L1,[X L2]) :- Χ < 0, split(l,l1,l2) 39

Ασκήσεις αποκοπής (count) (1/4) Να ορισθεί μια διαδικασία count που θα μετρά πόσες φορές εμφανίζεται ένα στοιχείο (άτομο) σε μια λίστα. count(a,l,n) A: άτομο, L: λίστα, Ν: αριθμός εμφανίσεων. count(_,[],0). count(a,[a L],N) :-!, count(a,l,n1), N is N1 + 1. count(a,[_ L],N) :- count(a,l,n).?- count(a,[a,b,c,a,d],n). N = 2 40

Ασκήσεις αποκοπής (count) (2/4) Πώς συμπεριφέρεται το count όταν η λίστα περιέχει μεταβλητές??- count(a,[a,x,b,a,y,d],n). X = a Y = a N = 4 Τα Χ και Υ της ερώτησης κατά την εκτέλεση ταυτοποιούνται με a (λόγω της 2η πρότασης). 41

Ασκήσεις αποκοπής (count) (3/4) Λύση: Η 2η πρόταση γίνεται: count(_,[],0). count(a,[b L],N) :- A == B,!, count(a,l,n1), N is N1 + 1. count(a,[_ L],N) :- count(a,l,n).?- count(a,[a,b,c,a,d],n). N = 2?- count(a,[a,x,b,a,y,d],n). X = _ Y = _ N = 2 42

Ασκήσεις αποκοπής (count) (4/4) Εναλλακτική Λύση: Η 2η πρόταση γίνεται: count(_,[],0). count(a,[b L],N) :- nonvar(a), nonvar(b), A=B,!, count(a,l,n1), N is N1 + 1. count(a,[_ L],N) :- count(a,l,n).?- count(a,[a,b,c,a,d],n). N = 2?- count(a,[a,x,b,a,y,d],n). X = _, Y = _, N = 2 43

Επανάληψη στην Prolog Ως τώρα έχουμε δει πώς θα «εκτελέσουμε» επαναληπτικά στην Prolog κάποιες ενέργειες μέσω αναδρομής. Η αναδρομή καταναλώνει μνήμη σε κάθε επανάληψη. Αν χρειαστούν χιλιάδες ή δεκάδες χιλιάδες επαναλήψεις (π.χ. ανάγνωση δεδομένων από αρχείο) μπορεί να εξαντληθεί η μνήμη. Μερική λύση δίνει η χρήση της ουραίας αναδρομής (tail-recursion) με βοηθητικό κατηγόρημα. Π.χ. ορισμός του «γρήγορου» reverse. 44

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

Εκτύπωση στοιχείων λίστας (1/2) Αναδρομικός ορισμός. write_list([]). write_list([x T]) :- write(x), nl, writelist(t). 46

Εκτύπωση στοιχείων λίστας (2/2) Επανάληψη μέσω οπισθοδρόμησης. write_list(l):- member(x,l), write(x), nl, fail. write_list(_). Θα «εκτελεστεί» μετά την έξοδο από το βρόχο. Δημιουργία εναλλακτικών λύσεων. Σημείο οπισθοδρόμησης. Μη-αναστρέψιμες ενέργειες. Αποτυχία. Εξαναγκασμός σε οπισθοδρόμηση. 47

Βρόχοι τύπου while Χρησιμοποιούμε κάποιο κατηγόρημα που παράγει (μέσω οπισθοδρόμησης) εναλλακτικές λύσεις (π.χ. member, append, κλπ.). Όταν εξαντλούνται οι εναλλακτικές λύσεις η οπισθοδρόμηση οδηγεί σε εναλλακτικό κανόνα. Αυτό το είδος της επανάληψης μοιάζει με while. Η είσοδος και η έξοδος στο βρόχο γίνεται από την κορυφή. Στη βάση της επανάληψης χρησιμοποιείται πάντα fail. 48

Βρόχοι τύπου repeat/until Χρησιμοποιούμε το κατηγόρημα repeat. To repeat ΠΑΝΤΑ πετυχαίνει και έχει ΠΑΝΤΑ εναλλακτικές λύσεις. Η έξοδος από το βρόχο ΔΕΝ γίνεται από την κορυφή αλλά ΜΟΝΟ από την βάση. ΔΕΝ χρησιμοποιούμε fail γιατί τότε θα έχουμε ατέρμονα βρόχο. Χρησιμοποιούμε κάποιο κατηγόρημα που συνεχώς αποτυγχάνει (για να προκαλέσει οπισθοδρόμηση). ΕΚΤΟΣ από 1 φορά την τελευταία. Έξοδος από το βρόχο. 49

Ατέρμονας βρόχος loop :- repeat, write(hello), nl, fail. repeat. repeat :- repeat.?- loop. hello hello Άπειρες φορές 50

Βρόχος repeat/until που τερματίζει loop :-!, repeat, write(hello), nl, read(a), A = stop, write(exit), nl. Αποτυχία εφόσον απαντηθεί οτιδήποτε εκτός από stop. Επιστροφή στο repeat. Επιτυχία εφόσον απαντηθεί stop. Έξοδος από το βρόχο. Εκτέλεση εντολών που υπάρχουν μετά. Καλό είναι να μπει ένα cut (!) αφού βγούμε από το βρόχο, ώστε να αποκοπεί το σημείο οπισθοδρόμησης του repeat. 51

Δένδρο εκτέλεσης repeat repeat true repeat true repeat true repeat repeat. repeat :- repeat. true repeat... 52

Μεικτοί Βρόχοι (1/2) Με συνδυασμό των δύο τεχνικών, μπορούμε να έχουμε μεικτούς βρόχους, δηλαδή βρόχους που μπορεί να τερματίσουν είτε από πάνω, είτε από κάτω. loop :- loop. member(x,[1,2,3,4,5]), write(x), nl, X > 2,!, write(exit), nl. Θα τυπωθούν οι αριθμοί 1, 2, 3 και η λέξη exit. Ο βρόχος θα τερματίσει από κάτω. 53

Μεικτοί Βρόχοι (2/2) loop :- loop. member(x,[1,2,3,4,5]), write(x), nl, X > 5,!, write(exit), nl. Θα τυπωθούν οι αριθμοί 1, 2, 3, 4, 5 (ΟΧΙ η λέξη exit). Ο βρόχος θα τερματίσει από πάνω. 54

Σημείωμα Αναφοράς Copyright, Νίκος Βασιλειάδης. «. Γλώσσα Prolog: Έλεγχος εκτέλεσης προγράμματος, Αποκοπή, Άρνηση». Έκδοση: 1.0. Θεσσαλονίκη 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://eclass.auth.gr/courses/ocrs163/

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά - Μη Εμπορική Χρήση - Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο [1] http://creativecommons.org/licenses/by-nc-sa/4.0/

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Τέλος ενότητας Επεξεργασία: Εμμανουήλ Ρήγας Θεσσαλονίκη, Εαρινό Εξάμηνο 2013-2014

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ Σημειώματα

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