Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Prolog Επεξεργασία και Αναπαράσταση Γνώσης ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολογίας Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο: Τεχνητή Νοημοσύνη.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Prolog Επεξεργασία και Αναπαράσταση Γνώσης ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολογίας Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο: Τεχνητή Νοημοσύνη."— Μεταγράφημα παρουσίασης:

1 Prolog Επεξεργασία και Αναπαράσταση Γνώσης ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολογίας Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο: Τεχνητή Νοημοσύνη

2 Περιβάλλον προγραμματισμού Editor Για να γράψετε ένα πρόγραμμα Prolog πρέπει να χρησιμοποιήσετε έναν Editor. Μπορείτε να χρησιμοποιήσετε έναν οποιοδήποτε Εditor όπως το Notepad ή κάποιον άλλο επεξεργαστή κειμένου όπως το WordPad Οι περισσότερες σύγχρονες εκδόσεις Prolog (SWI-Prolog, SICStus, AMZI κ.α.) διαθέτουν το δικό τους ολοκληρωμένο περιβάλλον ανάπτυξης κώδικα. H SWI-Prolog, την οποία και χρησιμοποιούμε στο μάθημά μας, διαθέτει τον ενσωματωμένο Editor PceEmac. Για να δουλέψετε σε αυτόν θα πρέπει πρώτα να έχετε κατεβάσει και εγκαταστήσει την SWI-Prolog από http://www.swi-prolog.org/. Για να δημιουργήσετε ένα καινούργιο αρχείο, επιλέξτε από το μενού της Prolog File --> New και μετά εισάγετε το όνομα του αρχείου που θέλετε να δημιουργηθεί (για παράδειγμα test.pl).

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

4 Προγραμματιστικό περιβάλλον Το πρόγραμμα της Prolog το σώζουμε σαν Όνομα_file.pl Στην SWI-Prolog ακολουθούμε File  consult  επιλογή αρχείου & άνοιγμα

5 Προγράμματα στην Prolog Πρόγρ αμ μα Prolog : ένα σύνολο προτάσεων που περιγράφουν τα δεδομένα του προβλήματος και τις σχέσεις μεταξύ τους. Οι προτάσεις αυτές λέγονται προτάσεις Horn και αποτελούν υποσύνολο της λογικής πρώτης τάξης. Προτάσεις Horn A ← A 0,A 1,…,A n : Για να δείξεις το Α πρέπει να δείξεις το Α 0 και το Α 1,…,και το Α ν

6 Γεγονότα και Κανόνες Υπάρχουν δύο είδη προτάσεων σε ένα πρόγραμμα Prolog, τα γεγονότα και οι κανόνες. Τα γεγονότα (= κάτι που ισχύει πάντα) εκφράζουν σχέσεις ανάμεσα στα αντικείμενα και αποτελούν κατά ένα τρόπο τα δεδομένα του προβλήματος, π.χ. father(george, mary). Οι κανόνες εκφράζουν γενικότερες σχέσεις ανάμεσα στα αντικείμενα οι οποίες ορίζονται με τη βοήθεια άλλων σχέσεων, π.χ. parent(X,Y):- father(X,Y). parent(X,Y):- mother(X,Y). Τα X, Y είναι μεταβλητές. Το σύμβολο :- εκφράζει το λογικό «ΑΝ» Σημαντικό: Κάθε γεγονός και κανόνας τερματίζεται ΠΑΝΤΑ με μια τελεία η οποία εκφράζει το λογικό «Ή»

7 Επεξήγηση κανόνων Το αριστερό μέλος κάθε κανόνα ονομάζεται head ενώ το δεξί ονομάζεται body parent(X,Y):- father(X,Y). Το αριστερό μέλος θεωρείται ως το συμπέρασμα ενός κανόνα Το δεξί μέλος θεωρείται ως τα γεγονότα Έτσι η σημασιολογία ενός κανόνα είναι η εξής: το συμπέρασμα ισχύει αν ισχύουν τα γεγονότα headbody if

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

9 Παράδειγμα προγράμματος (1/3) father(george,mary). father(george,nick). father(peter,marina). mother(helen,mary). mother(helen,nick). mother(ann,marina). parent(X,Y):- father(X,Y). parent(X,Y):- mother(X,Y). Γεγονότα Κανόνες Τι σημαίνει το πρόγραμμα μας; Γεγονότα: father(george, mary)  ο george είναι πατέρας της mary father(george, nick)  ο george είναι πατέρας του nick κ.ο.κ. Κανόνες: parent(X,Y) :- father(X,Y)  o X είναι γονιός του Υ αν ο Χ είναι πατέρας του Υ Ή (τελεία του πρώτου κανόνα) parent(X,Y) :- mother(X,Y)  o X είναι γονιός του Υ αν ο Χ είναι μητέρα του Υ

10 Παράδειγμα προγράμματος (2/3) Θεωρούμε ότι οι παραπάνω προτάσεις είναι αποθηκευμένες σε ένα απλό αρχείο κειμένου και ότι «φορτώθηκαν» σε κάποιο διερμηνευτή της Prolog. Πιθανές ερωτήσεις - απαντήσεις που μπορούν να γίνουν με βάση το παραπάνω πρόγραμμα είναι: ?- father(george,mary). - yes ?- father(george,marina). - no ?- father(peter,X). - X=marina

11 Παράδειγμα προγράμματος (3/3) ?- mother(X,marina). - X=ann ?- parent(george,X). - X=mary; - X=nick ?- parent(paul,X). - no ?- mother(X,Y). - X=helen, Y=mary; X=helen, Y=nick; X=ann, Y=marina; no

12 Σύνταξη της Prolog Τα στοιχεία της γλώσσας είναι οι όροι τα γεγονότα οι κανόνες οι ερωτήσεις Σχόλια Τα σχόλια στην Prolog εισάγονται είτε με τον χαρακτήρα “%”, είτε περικλείονται στους χαρακτήρες /* και */.

13 Σύνταξη της Prolog 1. Όροι 2. Γεγονότα 3. Κανόνες 4. Ερωτήσεις

14 Όροι Όροι στην Prolog Μεταβλητές ΑπλοίΣύνθετοι ΣταθερέςΣυναρτησιακό σύμβολοΟρίσματα άτομααριθμοίΑπλοί όροι Σύνθετοι όροι

15 Απλοί όροι Το μοναδικό data type στην Prolog είναι οι όροι (term). Οι απλοί όροι είναι οι αριθμοί, τα άτομα και οι μεταβλητές. Οι αριθμοί έχουν τη συνηθισμένη μορφή, κοινή με τις υπόλοιπες γλώσσες προγραμματισμού (floats ή integers). Τα άτομα (σταθερές) είναι συμβολοσειρές, οι οποίες πρέπει απαραίτητα να ξεκινούν από μικρό γράμμα ή να περιλαμβάνονται σε μονά εισαγωγικά, π.χ. anna, x25, x_25, x_, ‘Tom’, ‘cd player’

16 Μεταβλητές (1/2) Οι μεταβλητές είναι συμβολοσειρές που μπορεί να περιέχουν γράμματα, ψηφία ή τον χαρακτήρα «_». Υποχρεωτικά ξεκινούν με κεφαλαίο γράμμα ή με τον χαρακτήρα «_», π.χ. X, Result, Object2, _a23 Οι μεταβλητές που ξεκινούν με τον χαρακτήρα «_» ονομάζονται ανώνυμες μεταβλητές. Οι ανώνυμες μεταβλητές χρησιμοποιούνται όταν δεν μας ενδιαφέρει η τιμή που θα λάβει η συγκεκριμένη μεταβλητή, π.χ. ?- father(peter,_).

17 Μεταβλητές (2/2) Στην Prolog, σε μία μεταβλητή η οποία έχει πάρει μία τιμή δεν μπορεί να δοθεί νέα (non destructive assignment). Οι μεταβλητές στην Prolog δεν έχουν τύπο (typeless) και γιαυτό δεν απαιτούν δηλώσεις. Μπορούν να πάρουν σαν τιμή οποιοδήποτε όρο αλφαβητικό, αριθμητικό η αλφαριθμητικό. Οι μεταβλητές είναι τοπικές με εμβέλεια μέσα στο κανόνα που εμφανίζονται. Μπορούμε να γράψουμε πρόγραμμα με 1 ή 2 μεταβλητές  κακός προγραμματισμός

18 Σύνθετοι Όροι Οι σύνθετοι όροι είναι σύνθετες δομές με γενική μορφή f(k1,k2,…,kn) To f ονομάζεται συναρτησιακό σύμβολο (functor) τάξης n και τα k1,k2,…,kn λέγονται ορίσματα. Η τάξη είναι το πλήθος των ορισμάτων του σύνθετου όρου. Τα ορίσματα μπορεί να είναι είτε απλοί ή σύνθετοι όροι, π.χ. date(2,august,1997) triangle(point(4,2),point(6,4),point(7,1))

19 Σύνταξη της Prolog 1. Όροι 2. Γεγονότα 3. Κανόνες 4. Ερωτήσεις

20 Γεγονότα Η πιο απλή μορφή προτάσεων Horn είναι τα γεγονότα. Ένα γεγονός εκφράζει την απευθείας σχέση που συνδέει κάποια αντικείμενα. Αποτελείται από μία σχέση ή κατηγόρημα (predicate), το οποίο είναι ένα άτομο, ακολουθούμενο από έναν οποιοδήποτε αριθμό παραμέτρων ή ορισμάτων σε παρενθέσεις. Σαν ορίσματα μπορούμε να έχουμε οποιοδήποτε όρο είτε απλό είτε σύνθετο. Το πλήθος των ορισμάτων ονομάζεται τάξη του γεγονότος. Παραδείγματα: student(john,class(a),grade(b)). Γεγονός τάξης 3 με κατηγόρημα student. room(48,top_floor). Γεγονός τάξης 2 με κατηγόρημα room. day_sunny. Γεγονός μηδενικής τάξης με κατηγόρημα day_sunny.

21 Σύνταξη γεγονότων Ένα γεγονός ακολουθείται πάντα από τελεία. Το τμήμα του γεγονότος που προηγείται της τελείας, δηλαδή το κατηγόρημα και τα ορίσματά του είναι ο ατομικός τύπος. Γεγονός Ορίσματα Ατομικός τύποςΤελεία Κατηγόρημα + +

22 Σύνταξη της Prolog 1. Όροι 2. Γεγονότα 3. Κανόνες 4. Ερωτήσεις

23 Κανόνες Οι κανόνες (rules) είναι προτάσεις που ορίζουν νέες σχέσεις με τη βοήθεια άλλων σχέσεων που έχουν ήδη οριστεί. Οι κανόνες έχουν τη γενική μορφή: A:- B1,B2,…,Bn. (n>=1) Το Α ονομάζεται κεφαλή (head) του κανόνα και μπορεί να είναι οποιοσδήποτε ατομικός τύπος. Η κεφαλή διαχωρίζεται από το σώμα με τους χαρακτήρες « :- » οι οποίοι μπορούν να διβαστούν ως «αν». Τα Β1,Β2,…,Βn ονομάζονται σώμα (body) του κανόνα και είναι και αυτοί ατομικοί τύποι. Οι ατομικοί τύποι στο σώμα του κανόνα χωρίζονται συνήθως με κόμμα, ο οποίος δηλώνει λογική σύζευξη (λογικό «και»). Παράδειγμα brother(X,Y):- parent(Z,X),parent(Z,Y).

24 Σύνταξη της Prolog 1. Όροι 2. Γεγονότα 3. Κανόνες 4. Ερωτήσεις

25 Ερωτήσεις Οι ερωτήσεις (queries) είναι η μέθοδος που χρησιμοποιείται στην Prolog για την εξαγωγή γνώσης από το πρόγραμμα. Η σύνταξη τους είναι ?- ατομικός τύπος. Ο ατομικός τύπος ονομάζεται κλήση (call) της ερώτησης Οι ερωτήσεις μπορούν να θεωρηθούν ως λογικές προτάσεις προς απόδειξη. Αν η προς απόδειξη ερώτηση ικανοποιείται, η απάντηση στην ερώτηση είναι θετική, και περιλαμβάνει τις τιμές για τις μεταβλητές που περιλαμβάνονται σε αυτή. Διαφορετικά το σύστημα απαντάει αρνητικά.

26 Απλές Ερωτήσεις Οι απλές ερωτήσεις περιέχουν μία μόνο κλήση. Παράδειγμα προγράμματος και απλών ερωτήσεων: big(bear). big(elephant). small(cat). brown(bear). gray(elephant). black(cat). Ερωτήσεις ?- brown(elephant). - no ?- big(X). - X=bear; X= elephant

27 Σύνθετες Ερωτήσεις Οι σύνθετες ερωτήσεις περιέχουν παραπάνω από μία κλήσεις. Οι κλήσεις αυτές χωρίζονται με κόμμα που εκφράζει το λογικό «και». Η απάντηση σε μία σύνθετη ερώτηση είναι καταφατική μόνο αν αληθεύουν οι επιμέρους κλήσεις που την αποτελούν. Παραδείγματα ?- small(X),gray(X). - no ?- big(X),gray(X). - X=elephant ?- big(X),black(Y). - X=bear Y=cat; X=elephant Y=cat

28 Εκτέλεση Προγραμμάτων Η εκτέλεση ενός προγράμματος ξεκινά με μία ερώτηση που υποβάλλει ο χρήστης και φτάνουμε σε λύση όταν έχουν εξαντληθεί όλες οι κλήσεις που αποτελούν την ερώτηση. Η απάντηση στην ερώτηση είναι το αποτέλεσμα του προγράμματος. Η ερώτηση που υποβάλλει ο χρήστης μπορεί να είναι απλή (να περιέχει μία κλήση) ή σύνθετη (σύζευξη πολλαπλών κλήσεων), π.χ. ?- friend(X,nick). ?- friend(X,nick), friend(X,john).

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

30 Αναζήτηση προτάσεων (1/2) Για να ελέγξει η Prolog αν μία κλήση ικανοποιείται από μία πρόταση, χρησιμοποιεί ένα μηχανισμό ταυτοποίησης. Αυτός προσπαθεί να καταστήσει ταυτόσημες μία κλήση μιας ερώτησης και την κεφαλή μίας πρότασης, εκτελώντας τις ελάχιστες απαραίτητες αναθέσεις τιμών σε μεταβλητές (most general unifier). Όταν μία κλήση ταυτοποιείται με ένα από τα γεγονότα του προγράμματος τότε αυτή ικανοποιείται και απομακρύνεται από την ερώτηση. Αν η κλήση ταυτοποιείται με έναν κανόνα, τότε αυτή απομακρύνεται από την ερώτηση και τη θέση της παίρνει το σώμα του κανόνα αυτού.

31 Αναζήτηση προτάσεων (2/2) Αν στο πρόγραμμα υπάρχουν περισσότερες της μία προτάσεις με τις οποίες μπορεί να ταυτοποιηθεί μία κλήση, τότε ταυτοποιείται με την πρόταση που εμφανίζεται πρώτη στο πρόγραμμα. Το σημείο αυτό ονομάζεται σημείο οπισθοδρόμησης. Σε περίπτωση αποτυχίας εύρεσης λύσης ή σε περίπτωση που ο χρήστης ζητά και άλλη λύση, ο μηχανισμός οπισθοδρόμησης επιστρέφει στο τελευταίο σημείο οπισθοδρόμησης.

32 Κανόνες Ταυτοποίησης (1/2) Μία μεταβλητή που δεν έχει πάρει τιμή μπορεί να ταυτοποιηθεί με σταθερή, μεταβλητή ή σύνθετο όρο. Μία σταθερά μπορεί να ταυτοποιηθεί μόνο με τον εαυτό της. Ένας σύνθετος όρος μπορεί να ταυτοποιηθεί με έναν άλλο σύνθετο μόνο εφόσον έχουν το ίδιο συναρτησιακό σύμβολο και την ίδια τάξη, και με την προϋπόθεση ότι τα αντίστοιχα ορίσματά τους μπορούν να ταυτοποιηθούν.

33 Κανόνες Ταυτοποίησης (2/2) c1 X1 f(t1,…,tν) c2 επιτυχές αν η c1 είναι ίδια με τη c2 η μεταβλητή X1 παίρνει την τιμή c2 {Χ1=c2} αποτυγχάνει X2 η μεταβλητή X2 παίρνει την τιμή c1 {Χ2=c1} η μεταβλητή X1 ενοποιείται με τη X2 {Χ1=Χ2} επιτυχές αν {Χ2=f(u1,…,um)} f(u1,…,uμ) αποτυγχάνει επιτυχές αν {Χ1=f(t1,…,tn)} επιτυχές αν ν==μ και u1==t1,…,uμ==tν

34 Παράδειγμα εκτέλεσης προγράμματος (1/2) Έστω το πρόγραμμα greek(socrates). human(turing). human(socrates). fallible(X):- human(X). και έστω ότι τίθεται το ερώτημα. ?- fallible(Y),greek(Y).

35 Παράδειγμα εκτέλεσης προγράμματος (2/2) ?-fallible(Y),greek(Y). {Y=X} ?-human(Y),greek(Y). ?-greek(turing).?-greek(socrates). {Y=socrates} {Y=turing} αποτυγχάνει yes greek(socrates). human(turing). human(socrates). fallible(X):- human(X).

36 Αναδρομή Με τον όρο αναδρομή εννοούμε τη δυνατότητα ένας κανόνας να περιέχει στο σώμα του μια κλήση προς τον εαυτό του. Οι κανόνες που χρησιμοποιούν αναδρομή ονομάζονται αναδρομικοί, ενώ αυτοί που δεν χρησιμοποιούν μη αναδρομικοί.

37 Παράδειγμα Αναδρομής (1/3) Έστω τα γεγονότα: parent(john,george). parent(john,nick). parent(jim,bill). parent(jim,jack). parent(gregory,john). parent(gregory,jim). parent(bob,gregory). parent(joseph,bob). Θέλουμε να ορίσουμε έναν κανόνα predecessor(X,Y), ο οποίος να αληθεύει αν ο Χ είναι πρόγονος του Υ.

38 Παράδειγμα Αναδρομής (2/3) Λύση με μη αναδρομικούς κανόνες: predecessor(X,Z):- parent(X,Z). predecessor(X,Z):- parent(X,Y),parent(Y,Z). predecessor(X,Z):- parent(X,Y1),parent(Y1,Y2), parent(Y2,Z). … Με αυτόν τον τρόπο δεν μπορούμε να ορίσουμε τη σχέση για πολύ μακρινούς απογόνους. Π.χ. στην ερώτηση ?- predecessor(X,george). X=john X=gregory X=bob

39 Παράδειγμα Αναδρομής (3/3) Λύση με αναδρομικούς κανόνες: predecessor(X,Z):- parent(X,Z). predecessor(X,Z):- parent(X,Y),predecessor(Y,Z). Παρατήρηση: Όταν ένα κατηγόρημα ορίζεται αναδρομικά, εμφανίζεται πάντα με τουλάχιστον δύο κανόνες. Ο πρώτος συνήθως δεν περιέχει αναδρομική κλήση, λειτουργώντας σαν τερματική συνθήκη.

40 Λίστες Μία λίστα είναι μια ακολουθία από οποιονδήποτε αριθμό στοιχείων. Τα στοιχεία αυτά μπορεί να είναι απλοί όροι, σύνθετοι όροι ή ακόμα και άλλες λίστες. Τα στοιχεία μίας λίστας τοποθετούνται μέσα σε αγκύλες και χωρίζονται μεταξύ τους με κόμμα, π.χ. [dog,3,f(a,b),X,[1,2],s] Μία λίστα μπορεί να είναι: Κενή: μία δομή χωρίς όρους που συμβολίζεται με [] Μία δομή με δύο όρους: την κεφαλή (head) που είναι το πρώτο στοιχείο της λίστας και την ουρά (tail) που είναι το υπόλοιπο τμήμα της λίστας. Η κεφαλή μίας λίστας μπορεί να είναι οτιδήποτε. Η ουρά όμως πρέπει να είναι πάντα λίστα είτε κενή ή με τη δικιά της κεφαλή και ουρά, π.χ. στην παραπάνω λίστα dog είναι η κεφαλή και [3,f(a,b),X,[1,2],s] η ουρά.

41 Ταυτοποίηση λιστών Δύο λίστες ταυτοποιούνται εφόσον έχουν τον ίδιο αριθμό στοιχείων και τα αντίστοιχα στοιχεία μπορούν να ταυτοποιηθούν,π.χ. Λίστα1Λίστα2Ταυτοποίηση [a,b,c][a,b,c,d]αποτυγχάνει [a,b,c][X,Y]αποτυγχάνει [a,b][a,X]{X=b} [a,b][a|X]{X=[b]} [f(l),k,[l]][f(X),Y,Z]{X=l,Y=k,Z=[l]} [f(l),k,[l]][f(X),Y|Z]{X=l,Y=k,Z=[[l]]} [[a]][X|Y]{X=[a],Y=[]}

42 Χειρισμός Λιστών (1/4) Εύρεση τελευταίου στοιχείου last(X,[X]). last(X,[Head|Tail]):-last(X,Tail). ?-last(c,[a,b,c]). Πρόταση 2 ?-last(c,[b,c]). Πρόταση 2 ?-last(c,[c]). Πρόταση 1 YES ?-last(c,[]). fail Πρόταση 2

43 Χειρισμός Λιστών (2/4) Έλεγχος συμπερίληψης member(X,[X|Y]). member(X,[Head|Tail]):- member(X,Tail). Συνένωση λιστών append([],L,L). append([X|L1],L2,[X|L3]):- append(L1,L2,L3). Η συνένωση μίας λίστας L με μία κενή λίστα έχει ως αποτέλεσμα την ίδια τη λίστα. Αν η πρώτη λίστα δεν είναι κενή, μπορεί να χωριστεί σε κεφαλή και ουρά: [X|L1]. Τότε η συνένωση της λίστας [X|L1] και της L2 είναι η [X|L3] όπου L3 είναι το αποτέλεσμα της συνένωσης των λιστών L1 και L2.

44 Χειρισμός Λιστών (3/4) Προσθήκη στοιχείου στην αρχή μίας λίστας add(List,Element,[Element|List]). π.χ. ?-add([a,b,c,d],q,L). L=[q,a,b,c,d]; Προσθήκη στοιχείου σε οποιαδήποτε θέση στη λίστα add(List,Element,NewList):-append(List1,List2,List), append(List1,[Element|List2],Newlist). Έτσι: ?-add([a,b,c],q,L). L=[q,a,b,c]; L=[a,q,b,c]; L=[a,b,q,c]; L=[a,b,c,q]; no

45 Χειρισμός Λιστών (4/4) Αφαίρεση στοιχείων από μία λίστα delete(Element,List,NewList):- append(List1,[Element|List2],List), append(List1,List2,NewList). Αναστροφή λιστών reverse([],[]). reverse([Head|Tail],ReversedList):- reverse(Tail,ReversedTail), append(ReversedTail,[Head],ReversedList).

46 Τελεστές Σύγκρισης (1/2) Οι τελεστές σύγκρισης χρησιμοποιούνται στα σώματα κανόνων, με σκοπό τον έλεγχο συνθηκών μεταξύ αριθμών και μεταβλητών ΤελεστήςΕξήγηση X > Y μεγαλύτερο X < Y μικρότερο X >= Y μεγαλύτερο / ίσο X =<Y μικρότερο / ίσο X =:= Y ισότητα X =/= Y ανισότητα

47 Τελεστές Σύγκρισης (2/2) =:= (συντακτική ισότητα – identical) = (ταυτοποίησης – unification) Διαφορά μεταξύ = και =:= ?- 1+2 =:= 2+1. yes ?- 1+2 = 2+1. no ?- 1+A = B+2. A=2 B=1

48 Παραδείγματα χρήσης τελεστών σύγκρισης Έλεγχος για το αν μία λίστα είναι ταξινομημένη sorted([]). sorted([_]). sorted([X,Y|List]):- X=<Y,sorted([Y|List]). Εύρεση μέγιστου στοιχείου λίστας list_max([X],X). list_max([X|Tail],M):-list_max(Tail,M1),max(X,M1,M). max(X,Y,X):-X>Y. max(X,Y,Y):-X=<Y.

49 Τελεστές αριθμητικών πράξεων ΤελεστήςΕξήγηση + πρόσθεση - αφαίρεση * πολλαπλ/μός / διαίρεση mod υπόλοιπο διαίρεσης ^ δύναμη

50 Τελεστής απόδοσης τιμής Η απόδοση των τιμών αριθμητικών εκφράσεων σε μεταβλητές δεν μπορεί να γίνει χρησιμοποιώντας των τελεστή = ?- X=3+4 X=3+4 Για απόδοση τιμής χρησιμοποιούμε τον τελεστή is ?- X is 3+4 X=7 Είναι προφανές ότι μπορούμε να χρησιμοποιούμε και μεταβλητές στην έκφραση που ακολουθεί στα δεξιά του τελεστή is. Σε αυτήν την περίπτωση θα πρέπει όλες οι μεταβλητές να έχουν πάρει τιμές τη στιγμή που θα εκτελεστεί ο τελεστής.

51 Παραδείγματα χρήσης τελεστών Μέγιστός Κοινός Διαιρετής gcd(X,X,X). gcd(X,Y,D):-X<Y, Y1 is Y-X, gcd(X,Y1,D). gcd(X,Y,D):-X1 is X-Y, gcd(X1,Y,D). Άθροισμα στοιχείων λίστας sum_list([],0). sum_list([X|T],Sum):-sum_list(T,Sum1),Sum is Sum1+X. Εύρεση ν-οστού στοιχείου λίστας n_elem(1,[X|T},X). n_elem(N,[H|T],X):-N1 is N-1, n_elem(N1,T,X).

52 Διαδικασίες εισόδου / εξόδου Στην Prolog, η επικοινωνία μεταξύ χρήστη και προγράμματος γίνεται συνήθως με τη μορφή ερωτήσεων από την πλευρά του χρήστη και απαντήσεων από την πλευρά του συστήματος. Η Prolog όμως περιέχει και ειδικές ενσωματωμένες διαδικασίες (built-in procedures), οι οποίες διαβάζουν όρους ή χαρακτήρες από το προκαθορισμένο κανάλι εισόδου (πληκτρολόγιο / αρχείο) και επιστρέφουν το αποτέλεσμα στο προκαθορισμένο κανάλι εξόδου (οθόνη / αρχείο).

53 Είσοδος από το πληκτρολόγιο get(X): Διαβάζει τον επόμενο χαρακτήρα που πληκτρολογεί ο χρήστης. read(X): Διαβάζει τον επόμενο όρο που εισάγεται από το πληκτρολόγιο. Παραδείγματα: ?- get(X),get(Y). Αν ο χρήστης πληκτρολογήσει ab η απάντηση που θα επιστραφεί είναι: X=a, Y=b. ?- read(X). a.X=a ano (λείπει η τελεία) [l,k].X=[l,k] ‘a bc.No (λείπει η δεξιά απόστροφος)

54 Έξοδος στην οθόνη put(X): Τυπώνει στην οθόνη τον χαρακτήρα Χ. write(X): Τυπώνει στην οθόνη τον όρο Χ. nl: Προκαλεί αλλαγή γραμμής. Παραδείγματα: ?- write(aaa),nl,write([1,2,3]),nl,write(f(k,l)). aaa [1,2,3] f(k,l) yes

55 Είσοδος / Έξοδος σε αρχεία Για την είσοδο / έξοδο όρων και χαρακτήρων σε αρχεία χρησιμοποιούνται τα ίδια κατηγορήματα. Το μόνο που απαιτείται είναι η ανακατεύθυνση των καναλιών εισόδου / εξόδου. see(filename): Ορίζει ως κανάλι εισόδου το αρχείο filename. seen: Ακυρώνει το κανάλι επικοινωνίας που ορίστηκε με την εντολή see και κλείνει όλα τα αρχεία εισόδου.. seeing: Επιστρέφει το τρέχον κανάλι εισόδου. tell(filename): Ορίζει ως κανάλι εξόδου το αρχείο filename. told: Ακυρώνει το κανάλι επικοινωνίας που ορίστηκε με την εντολή tell και κλείνει όλα τα αρχεία εξόδου.. telling: Επιστρέφει το τρέχον κανάλι εξόδου.

56 Παράδειγμα εισόδου / εξόδου σε αρχείο Το κατηγόρημα που ακολουθεί δέχεται σαν είσοδο μία λίστα με στοιχεία και τα γράφει σε ένα προκαθορισμένο αρχείο. out(L):- tell(‘myfile.txt’),write_list(L),told. write_list([]). write_list([H|T]):- write(H),nl,write_list(T).

57 Χειρισμός συμβολοσειρών Στην Prolog, η τακτική που ακολουθείται για το χειρισμό συμβολοσειρών είναι η μετατροπή τους σε λίστες και η χρήση κατηγορημάτων επεξεργασίας λιστών. Το κατηγόρημα που μετατρέπει μία συμβολοσειρά σε λίστα ASCII κωδικών είναι το: name(String,List). ?- name(abc,X). X=[97,98,99] Η συμβολοσειρά μπορεί να είναι άτομο ή αριθμός Αν το άτομο αρχίζει με κεφαλαίο ή περιέχει κενά, πρέπει να είναι τοποθετημένο σε απλά εισαγωγικά. Ένα άτομο ή αριθμός μέσα σε διπλά εισαγωγικά ισοδυναμεί με λίστα ASCII κωδικών.

58 Παράδειγμα χειρισμού συμβολοσειρών Το παρακάτω κατηγόρημα δέχεται σαν είσοδο δύο συμβολοσειρές και τις συνενώνει: strings_concatenate(Str1,Str2,Str):- name(Str1,L1),name(Str2,L2),append(L1,L2,L ), name(Str,L).

59 Αποκοπή Η αποκοπή παρέχει στον προγραμματιστή τη δυνατότητα να «κλαδέψει» δυναμικά το δένδρο υπολογισμού που δημιουργεί η Prolog. Είναι ένας τρόπος ελέγχου του μηχανισμού οπισθοδρόμησης, ο οποίος απαγορεύει τη δημιουργία κλαδιών που ξέρουμε ότι δεν θα οδηγήσουν σε λύση. Η αποκοπή συμβολίζεται με το χαρακτήρα «!» και πετυχαίνει πάντα. Όταν ο μηχανισμός αναζήτησης της Prolog συναντήσει μία αποκοπή Αγνοούνται όλες οι προτάσεις που ανήκουν στη διαδικασία και έπονται της πρότασης που περιέχει την αποκοπή. Αγνοούνται όλες οι εναλλακτικές λύσεις των ατομικών τύπων που βρίσκονται πριν από την αποκοπή μέσα στο σώμα του κανόνα που εμφανίζεται.

60 Παράδειγμα με Αποκοπή ?-uncle(bob,Y). ?-brother(bob,Z),!,father(Z,Y). ?- father(john,Y). {Y=ann} {Z=john} uncle(X,Y):-brother(X,Z),!,father(Z,Y). uncle(X,Y):-brother(X,Z),mother(Z,Y). brother(bob,john). brother(bob,nick). father(john,ann). ?-!,father(john,Y).

61 Αποφυγή άσκοπων ελέγχων Έστω ότι θέλουμε να υλοποιήσουμε τη συνάρτηση: f(x)=0 if x<3 f(x)=2 if 3=<x<6 f(x)=4 if x>=6 Στο πρόγραμμα που ακολουθεί αποφεύγονται οι περιττοί έλεγχοι κατά την οπισθοδρόμηση αφού γνωρίσουμε εκ των προτέρων ότι μόνο μία από τις τρεις προτάσεις μπορεί να είναι αληθής κάθε φορά. f(X,0):- X =3, X<6, !. f(X,2):- X<6, !. f(X,4):- X>=6, !. f(X,4). Πρόγραμμα1 Πρόγραμμα2

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

63 Αποκοπή και Άρνηση Μία από τις σημαντικότερες χρήσεις της αποκοπής είναι η υλοποίηση της άρνησης σαν αποτυχία (negation as failure). Αυτό επιτυγχάνεται με τη χρήση του ενσωματωμένου κατηγορήματος fail της Prolog, το οποίο αποτυγχάνει πάντα. Ο συνδυασμός αποκοπής και επιτυχίας κάνει δυνατή την υλοποίηση κατηγορημάτων που περιέχουν την άρνηση. Για παράδειγμα το παρακάτω πρόγραμμα επιτυγχάνει όταν ένα στοιχείο δεν είναι μέλος μίας λίστας. not_member(X,[]). not_member(X,[X|_]):-!,fail. not_member(X,[_|Rest]):-not_member(X,Rest).

64 Υπόθεση του Κλειστού Κόσμου Η αρχή της άρνησης σαν αποτυχία βασίζεται στην Υπόθεση του Κλειστού Κόσμου (Closed World Assumption). Σύμφωνα με αυτή όλη η απαραίτητη πληροφορία για την επίλυση του προβλήματος περιέχεται στο πρόγραμμα και οτιδήποτε δεν περιέχεται σε αυτό θεωρείται λάθος (οποιαδήποτε σχέση δεν μπορεί να αποδειχθεί από το σύστημα θεωρείται ως εσφαλμένη). Η υλοποίηση του τελεστή άρνησης του λογικού προγραμματισμού (άρνηση σαν αποτυχία) γίνεται με τη βοήθεια του συνδυασμού αποκοπής και άρνησης. not(X):- X,!,fail. not(X).

65 Prolog engines XSB (http://xsb.sourceforge.net/) SWI-Prolog (http://www.swi-prolog.org) SISCtus Prolog (http://www.sics.se/isl/sicstuswww/site/index.html) ECLiPSe Prolog (http://eclipse.crosscoreop.com/) Quintus Prolog (http://www.sics.se/quintus/) YAP Prolog (http://www.ncc.up.pt/~vsc/Yap/) etc…


Κατέβασμα ppt "Prolog Επεξεργασία και Αναπαράσταση Γνώσης ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολογίας Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο: Τεχνητή Νοημοσύνη."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google