ΧΑΡΟΚΟΠΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΗΛΕΜΑΤΙΚΗΣ ΤΕΧΝΗΤΗ ΝΟΗΜΟΣΥΝΗ ΛΟΓΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η ΓΛΩΣΣΑ PROLOG ΤΟ ΣΥΣΤΗΜΑ ΚΑΝΟΝΩΝ CLIPS Καραγιώργου Σοφία
Βασικά στοιχεία γλώσσας Prolog Ορισμοί (statements): Επιτελούν το ρόλο εντολών στις κλασσικές γλώσσες προγραμματισμού Γεγονότα Κανόνες Ερωτήσεις Όροι (terms): Μοναδική δομή δεδομένων Prolog
Γεγονός Είναι το απλούστερο είδος ορισμού, που υποστηρίζει η Prolog Παρέχει τρόπο έκφρασης της σχέσης, που ισχύει ανάμεσα σε οντότητες
Παράδειγμα γεγονότος Το γεγονός?-father (john, mary). Εκφράζει ότι ο john είναι πατέρας της mary ή ότι η σχέση father ισχύει ανάμεσα στα άτομα john και mary
Ορισμοί Σχέσεις όπως το father ονομάζονται κατηγορήματα Οι οντότητες mary και john ονομάζονται ορίσματα του κατηγορήματος Ένα κατηγόρημα μαζί με τα ορίσματα, που περιλαμβάνει ονομάζεται ατομικός τύπος
Μεταβλητές Η Prolog επιτρέπει τη χρήση μεταβλητών σε Γεγονότα, κανόνες και ερωτήσεις Οι μεταβλητές αρχίζουν πάντα με κεφαλαίο γράμμα Παράδειγμα: plus(0,x,x). Εκφράζει την ιδιότητα του ουδέτερου στοιχείου της πρόσθεσης Η χρήση μεταβλητών επιτρέπει την έκφραση συνόλου γεγονότων
Ερωτήσεις Παρέχουν τη δυνατότητα εξαγωγής πληροφορίας από ένα λογικό πρόγραμμα Διερευνούν την ισχύ μιας σχέσης ανάμεσα σε ορισμένες οντότητες
Βασικά στοιχεία PROLOG Γεγονότα father(george,mary). Κανόνες parent(x,y):-father(x,y). parent(x,y):-mother(x,y). Ερωτήματα?-parent(X,Y). Χ=george,Y=mary; yes
Βασικά στοιχεία PROLOG Υπάρχουν προτάσεις σε μια βάση γνώσης, κάποιες μπορεί να είναι γεγονότα και κάποιες άλλες κανόνες Στο τέλος κάθε πρότασης υπάρχει τελεία «.» Κατηγορήματα, πχ parent, father κτλ Το κόμμα (,) υποδηλώνει σύζευξη κατηγορημάτων Το ερωτηματικό (;) υποδηλώνει διάζευξη κατηγορημάτων Μεταβλητές και συγκεκριμενοποίηση (instantiation)?- woman(x). X=mia
Μεταβλητές και ερωτήσεις Ερώτηση:?-father(X,mary). Διαβάζεται ως: «Υπάρχει κάποιο πρόσωπο Χ το οποίο είναι πατέρας της mary;»
Μεταβλητές και ερωτήσεις Μία ερώτηση μπορεί να επιστρέψει περισσότερες από μία απαντήσεις Παράδειγμα: Αν έχουμε δώσει στην Prolog δύο γεγονότα?-father(john, mary).?-father(john, ann). Τότε η ερώτηση:?-father(john, X). Θα επιστρέψει δύο λύσεις X=mary και X=ann
Παράδειγμα Ερώτηση:?-father(john, mary). Διερευνά αν η σχέση father ισχύει ανάμεσα στα άτομα john και mary
Παράδειγμα Γνώση 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). Αποθηκεύεται σε ένα αρχείο, π.χ. family.pl Φορτώνεται:?-consult( family.pl ).
Παράδειγμα Ερωτήματα Είναι ο george πατέρας της mary??-father(george,mary). yes Ποιος (Χ) έχει πατέρα τον peter??-father(peter,x). X=marina Ποια είναι τα ζεύγη (Χ Υ) για τα οποία το Χ είναι mother του Υ??-mother(X,Y). X=helen,Y=mary; X=helen,Y=nick; X=ann,Y=marina; no
Παράδειγμα Αν έχει δοθεί στην Prolog το γεγονός:?-father(john, mary). Τότε η απάντηση στην παραπάνω ερώτηση θα είναι yes
Σύνθετες ερωτήσεις Ερώτηση:?-father(X,mary), father(x,ann) Αναζητά το πρόσωπο που είναι πατέρας της mary και της ann Η σύνθετη ερώτηση αποτελείται από υποερωτήσεις (κλήσεις). Οι κλήσεις σε μία σύνθετη ερώτηση χωρίζονται μεταξύ τους με κόμμα, που έχει την έννοια λογικού «και» Για να αληθεύει μία σύνθετη ερώτηση πρέπει να αληθεύουν όλες οι απλούστερες ερωτήσεις, που την αποτελούν
Κανόνες Επιτρέπουν τον ορισμό νέων σχέσεων ως συνάρτηση άλλων σχέσεων Παράδειγμα:?-son(X,Y):-father(Y,X), male(x). Ορίζει τη σχέση son ως συνάρτηση των σχέσεων father και male. Διαβάζεται ως: «Ο Χ είναι γιός του Υ αν ο Υ είναι πατέρας του Χ και ο Χ είναι γένους αρσενικού». Το σύμβολο «:-» διαβάζεται σαν «εάν», ενώ το «,» ως «και»
Αναδρομικοί κανόνες?-ancestor(x,y):-parent(x,y).?-ancestor(x,y):-parent(x,z), ancestror(z,y). Η σχέση ancestor (πρόγονος) μπορεί να ορισθεί με χρήση δύο κανόνων, εκ των οποίων ο ένας είναι αναδρομικός Γενικά, ένας κανόνας έχει τη μορφή Η:-Β1,,Βn, όπου το Η λέγεται κεφαλή του κανόνα και οι ατομικοί τύποι Β1,,Βn, αποτελούν το σώμα του κανόνα
Παράδειγμα - Αναδρομή Παράδειγμα 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,z)
Παράδειγμα - Αναδρομή Λύση πρώτη predecessor(x,z):-parent(x,z). predecessor(x,z):-parent(x,y),parent(x,z). predecessor(x,z):-parent(x,y),parent(y,w),parent(w,z). Λύση δεύτερη predecessor(x,z):-parent(x,z). predecessor(x,z):-parent(x,y),predecessor(υ,z)
Όροι Βασική δομή στον λογικό προγραμματισμό Σταθερά (όπως john), μεταβλητή (όπως Χ) ή σύνθετος όρος Ο σύνθετος όρος αποτελείται από ένα συναρτησιακό σύμβολο (functional symbol), που εφαρμόζεται σε ακολουθία από όρους Παράδειγμα: list(a,nil) όπου list το συναρτησιακό σύμβολο και a,nil σταθερές
Όροι Χρήση για κωδικοποίηση σύνθετων μορφών πληροφορίας Παράδειγμα: Ορισμός κατηγορήματος book, που λαμβάνει σαν παραμέτρους όρους για περιγραφή των χαρακτηριστικών της έννοιας βιβλίο. Με τον τρόπο αυτό δημιουργείται μία απλή βάση δεδομένων:?-book(author(surname(stoll), name(robert)), subject(logic)).?-book(author(surname(kleene), name(steven)),subject(mathematics)).
Όροι Διαφορά ανάμεσα στο book (όνομα κατηγορήματος) και στα author, surname, name, subject (συναρτησιακά σύμβολα)
Δομές δεδομένων Σύνθετες δομές δεδομένων triangle(point(0,0),point(1,4),point(5,12))..(a,.(b,.(c,[]))). Παραδείγματα λιστών member/2 append/3 [a b c]. [[a,b],c]. [mia,vincent,jules,yolanda] [mia,robber(honeybunny),x,2,mia] [] [mia,[vincent,jules],[butch,friend(butch)]] [[], dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]]
Ενσωματωμένα κατηγορήματα Μαθηματικές πράξεις ==/2 Ίσο =/2 Ανάθεση \==/2 Διάφορο is/2 αποτιμά αριθμητικές εκφράσεις?-x is 3 + 4 X=7?-9 is 3 * 3. Yes Διαδικασίες εισόδου εξόδου?-read(x). :hello. X=hello?-write(hello),nl,write(world),nl. hello world yes
Παράδειγμα Αναζήτηση ονοματεπωνύμων, που έχουν γράψει βιβλία σε λογική Ερώτηση:?-book(author(surname(X), name(y), subject(logic)). Αν δεν ενδιαφέρουν τα μικρά ονομάτων συγγραφέων, η ερώτηση μπορεί να τεθεί:?-book(author(surname(x), _), subject(logic)). Όπου με «_» συμβολίζονται οι όροι των οποίων η τιμή δεν μας ενδιαφέρει (ανώνυμη μεταβλητή)
Όροι Γράφουμε προγράμματα όχι μόνο με χρήση κανόνων και γεγονότων Συνδυάζουμε δομικά στοιχεία, αναδρομή, κτλ
Ορίσματα Στην Prolog δεν γίνεται καθορισμός ποια από τα ορίσματα ενός κατηγορήματος είναι είσοδοι και ποια έξοδοι Πολλά προγράμματα έχουν διαφορετικές χρήσεις
Modules και αρχεία Modules :- module(printmovies,[printmovies/1]). Ορισμός :- use_module(library(lists)). Χρήση Αρχεία at_end_of_stream(s) open/3, write/2, close/1 εγγραφή σε αρχείο open/3, read/2, close/1 ανάγνωση από αρχείο
Εκτέλεση προγραμμάτων Prolog Έστω το πρόγραμμα?-grandparent(x,y):-parent(x,z), parent(z,y).?-parent(tom,jim).?-parent(jim,george). Όταν τεθεί η ερώτηση:?-grandparent(a,b). Ο μηχανισμός εκτέλεσης της Prolog εκτελεί αναζήτηση λύσεων της μορφής του δέντρου, που ακολουθεί
Δέντρο εκτέλεσης της ερώτησης?-grandparent(a,b)
Εκτέλεση προγραμμάτων Prolog Αρχικά ο μηχανισμός της Prolog αναζητά στο πρόγραμμα κατηγόρημα με το όνομα grandparent ώστε να ταιριάζει με τη δεδομένη ερώτηση Μόλις βρεθεί πρόταση, που αφορά αυτό το κατηγόρημα, αντικαθιστά την δεδομένη ερώτηση με το σώμα της πρότασης και δημιουργείται νέα (σύνθετη) ερώτηση parent(a,z), parent(z,b)
Μηχανισμός εκτέλεσης Prolog Έστω ότι έχουμε ένα πρόγραμμα και μία ερώτηση της μορφής?-α1,, Αn. Τότε: Η Prolog εξετάζει εάν ικανοποιούνται όλοι οι στόχοι Α1,, Αn ξεκινώντας από το Α1 και πηγαίνοντας προς το Αn Για να ικανοποιήσει ένα από τα Αi, η Prolog διαλέγει την πρώτη πρόταση στο πρόγραμμα της οποίας η κεφαλή ταιριάζει με το Αi, και αντικαθιστά το Αi με το σώμα της πρότασης αυτής (αφού πρώτα το τροποποιήσει κατάλληλα) Η διαδικασία συνεχίζεται μέχρι να μην υπάρχει πλέον άλλη κλήση, που να πρέπει να ικανοποιηθεί
Μαθηματικές σχέσεις φυσικών αριθμών Με χρήση του ορισμού του πολλαπλασιασμού δίνεται η σχέση για το παραγοντικό ενός φυσικού αριθμού?-factorial(0,s(0)).?-factorial(s(n),f):-factorial(n,f1),times(s(n),f1,f).
Μαθηματικές σχέσεις φυσικών αριθμών Σχέση between(x,y,z): αληθεύει όταν Χ είναι ένας φυσικός αριθμός μικρότερος ή ίσος από τον Υ και ο Υ είναι μικρότερος ή ίσος από τον Ζ.?-between(0,0,Z).?-between(0,s(Y),s(Z)):-between(0,Y,Z).?-between(s(X),s(Y),s(Z)):-between(X,Y,Z).
Σχόλια Οι φυσικοί αριθμοί αναπαρίστανται με πολύ πιο βολικό τρόπο στην Prolog (όπως και στις υπόλοιπες γλώσσες προγραμματισμού) Η αναπαράσταση, που χρησιμοποιήθηκε στα παραπάνω προγράμματα δεν είναι γενικά βολική και αποτελεσματική. Υιοθετήθηκε για να δειχθούν οι αρχικές δυνατότητες της Prolog
Αναδρομικός προγραμματισμός με λίστες Λίστα Πολύ χρήσιμη δομή δεδομένων για προγραμματισμό σε Prolog Κενή - συμβολίζεται με [ ] Περιέχει στοιχεία, πχ η [a,b,c] είναι μη κενή λίστα Το πρώτο στοιχείο λίστας ονομάζεται κεφαλή (head) Η λίστα που προκύπτει αν αφαιρέσουμε την κεφαλή, ονομάζεται ουρά (tail) Ο τελεστής αποτελεί ειδική αναπαράσταση, που δείχνει άμεσα την κεφαλή και την ουρά μιας λίστας. Η λίστα [a,b,c] γράφεται ως [a [b,c]] και η [a] ως [a [ ]].
Παράδειγμα Οι λίστες Prolog μπορούν να περιέχουν σαν στοιχεία τους και άλλες λίστες, αλλά και πολύπλοκους όρους, όπως [[ ]] επιτρεπτή λίστα [[1,Χ], s(s(x))] Οι [a [1 [2]]] και [Χ,Υ [a]] είναι ισοδύναμες με τις λίστες [a,1,2] και [X,Y,a] αντίστοιχα.
Παράδειγμα Η σχέση member (X,Y) είναι αληθής, όταν το Χ είναι στοιχείο της λίστας Υ?-member(X,[X Y]).?-member(X,[Y Z]):-member(X,Z). Το νόημα του προγράμματος είναι: «Το Χ είναι μέλος μιας λίστας αν είναι η κεφαλή της λίστας ή αν είναι μέλος της ουράς της λίστας»
Παράδειγμα Η σχέση append(x,y,z) είναι αληθής, όταν το Z είναι η λίστα, που προκύπτει από την συνένωση των λιστών Χ και Υ?-append([],Y,Y).?-append([X Xs],Ys,[X Zs]):-append(Xs,Ys,Zs). Η δομή του παραπάνω προγράμματος είναι παρόμοια με αυτή του προγράμματος για τον ορισμό της σχέσης plus
Παράδειγμα Συχνά στον προγραμματισμό σε Prolog χρησιμοποιούνται απλές σχέσεις, ήδη ορισμένες για να γραφούν πιο πολύπλοκα προγράμματα Σχέσεις όπως η member και η append χρησιμοποιούνται σχεδόν σε οποιοδήποτε μεγάλο πρόγραμμα γραφτεί σε Prolog
Παράδειγμα Σχέση reverse(x,y) ορίζεται σα συνάρτηση της append. Είναι αληθής, όταν η λίστα Υ είναι η αντίστροφη της λίστας Χ:?-reverse([],[]).?-reverse([X Xs],Ys):-reverse(Xs,Rs), append(rs, [X], Ys). Το νόημα του παραπάνω προγράμματος είναι: «Η αντίστροφη της κενής λίστας είναι η κενή λίστα. Η αντίστροφη μη-κενής λίστας μπορεί να παραχθεί αντιστρέφοντας την ουρά της και προσκολλώντας στο τέλος της αντεστραμμένης ουράς την κεφαλή της αρχικής λίστας»
Παράδειγμα Το προηγούμενο παράδειγμα μπορεί να γραφεί και χωρίς τη χρήση της append, αλλά με προσθήκη ενός βοηθητικού κατηγορήματος του reverse1, που διαθέτει ένα επιπλέον όρισμα:?-reverse(xs, Ys):-reverse1(Xs,[],Ys).?-reverse1([],Ys, Ys).?-reverse1([X Xs],A,Ys):-reverse1(Xs,[X A],Ys). Το όρισμα Α ονομάζεται συσσωρευτής (accumulator) διότι συσσωρεύει βήμα-βήμα το τελικό αποτέλεσμα (δηλαδή την αντίστροφη λίστα)
Αναδρομικός προγραμματισμός με δέντρα Δέντρα Πολύ χρήσιμος τύπος δεδομένων Αναπαρίστανται με χρήση όρων (μοναδική δομή δεδομένων Prolog) Χρήση του συναρτησιακού συμβόλου tree με τρεις παραμέτρους: tree(element, Left, Right) Το στοιχείο Element είναι η ρίζα του συγκεκριμένου δέντρου, το Left το αριστερό υπόδεντρο και το Right το δεξί υποδέντρο Το κενό δέντρο αναπαρίσταται με τη σταθερά void
Παράδειγμα Δέντρο με κορυφή a, αριστερό παιδί b και δεξί παιδί c γράφεται ως:?-tree(a, tree(b,void,void), tree(c,void, void))
Παράδειγμα Πρόγραμμα για έλεγχο του αν ένας δεδομένος όρος είναι πράγματι δυαδικό δέντρο (ανάλογο του κατηγορήματος nat)?-binary_tree(void).?-binary_tree(tree(e,l,r)):-binary_tree(l),binary_tree (R).
Παράδειγμα Πρόγραμμα για έλεγχο του αν ένα δεδομένο στοιχείο ανήκει σε ένα δέντρο ή όχι. Το πρόγραμμα είναι ανάλογο με το member, που ορίσθηκε για τις λίστες:?-tree_member(x, tree(x,_,_)).?-tree_member(x, tree(y,l,r)):-tree_member(x,l).?-tree_member(x, tree(y,l,r)):-tree_member(x,r).
Παράδειγμα Το παραπάνω πρόγραμμα ελέγχει αν ένα δεδομένο στοιχείο είναι ταυτόσημο με την κορυφή του δεδομένου δέντρου. Αν ναι, το πρόγραμμα σταματά με επιτυχία. Αν όχι, το πρόγραμμα συνεχίζει αναδρομικά τη διερεύνηση στο αριστερό και το δεξί υποδέντρο.
Κατηγορήματα Ουσιαστικά «διασχίζουν» ένα δεδομένο δέντρο με μία προκαθορισμένη σειρά Το αποτέλεσμα της διάσχισης επιστρέφεται σε μία λίστα
Παράδειγμα Η preorder διάσχιση ενός δυαδικού δέντρου ορίζεται από το ακόλουθο κατηγόρημα: preorder(void,[]). preorder(tree(x,l,r), Xs):-preorder(L,Ls), preorder(r,rs), append([x Ls],Rs,Xs). Κατά την preorder διάσχιση ενός δέντρου καταγράφεται αρχικά η ρίζα του δέντρου και κατόπιν επισκεπτόμαστε αναδρομικά πρώτα το αριστερό υποδέντρο και μετά το δεξί.
Παράδειγμα Με ανάλογο τρόπο γράφεται πρόγραμμα, που υλοποιεί την διάσχιση inorder: inorder(void,[]). inorder(tree(x,l,r), Xs):-inorder(L,Ls), inorder(r,rs), append(ls,[x Rs],Xs).
Παράδειγμα postorder(void,[]). postorder(tree(x,l,r),xs):-postorder(l,ls), postorder(r,rs), append(ls,rs,ms),append(ms,[x],xs). Τα παραπάνω προγράμματα διαφέρουν μόνο ως προς τον τρόπο, που γίνεται η συνένωση των επιμέρους αποτελεσμάτων (append)
Τελεστές Συναρτησιακά σύμβολα Χρήση σε επεξεργασία πιο πολύπλοκων δομών από ότι οι λίστες και τα δέντρα Στην έκφραση 1+3, το + είναι τελεστής Ισοδύναμη έκφραση +(1,3) και όχι ο αριθμός 4, όπως συμβαίνει σε άλλες γλώσσες προγραμματισμού Η πρόσθεση θα πραγματοποιούταν αν ο όρος 1+3 ήταν όρισμα στο ειδικό κατηγόρημα is της Prolog για υπολογισμό αριθμητικών εκφράσεων
Τελεστές Οι τελεστές +,-,*,/,... δεν λαμβάνουν συγκεκριμένο νόημα από την Prolog Χρησιμοποιούνται για να γραφούν εφαρμογές με κομψό και συνοπτικό τρόπο Στο επόμενο παράδειγμα οι τελεστές χρησιμοποιούνται, για τη διατύπωση της διαδικασίας παραγώγισης συναρτήσεων
Αριθμητικές πράξεις και Prolog Κάθε γλώσσα προγραμματισμού παρέχει ιδιαίτερες ευκολίες στη χρήση και επεξεργασία αριθμών Η Prolog διαθέτει Ειδικά κατηγορήματα, γνωστά ως κατηγορήματα συστήματος (system predicates)
Κατηγορήματα Prolog Βασικό κατηγόρημα το is, που χρησιμοποιείται στη μορφή V is E H Prolog υπολογίζει την τιμή του Ε και αν αυτή η τιμή συμφωνεί με το V, τότε επιτυγχάνει Αν V μεταβλητή, τότε λαμβάνει την τιμή του Ε Όταν Ε περιέχει μεταβλητές με άγνωστη τιμή τη στιγμή της εκτέλεσης, ο διερμηνέας της Prolog δίνει μήνυμα λάθους
Παράδειγμα Η ερώτηση?-8 is 5+3 επιτυγχάνει Ενώ η ερώτηση?-5+3 is 8 αποτυγχάνει Διότι η Prolog βλέπει το αριστερό μέλος της σαν τον όρο +(5,3) και δεν υπολογίζει την τιμή του.
Παράδειγμα Η ερώτηση?-χ is 5+3 θα δώσει την απάντηση Χ = 8 Η ερώτηση?-χ is 2+Y θα δώσει μήνυμα λάθους, διότι η αριθμητική τιμή του δεξιού μέλους δεν μπορεί να υπολογισθεί λόγω της μεταβλητής Υ
Κατηγορήματα της Prolog Για αριθμητικές πράξεις Χ = : = Υ (Οι αριθμητικές τιμές των Χ και Υ είναι ίδιες) Χ = \ = Υ (Οι αριθμητικές τιμές των Χ και Υ είναι διαφορετικές)
Κατηγορήματα της Prolog Χ < Υ (Η αριθμητική τιμή του Χ είναι μικρότερη από αυτή του Υ) Χ=<Υ (Η αριθμητική τιμή του Χ είναι μικρότερη ή ίση από αυτή του Υ)
Κατηγορήματα της Prolog Χ > Υ (Η αριθμητική τιμή του Χ είναι μεγαλύτερη από αυτή του Υ) Χ >= Υ (Η αριθμητική τιμή του Χ είναι μεγαλύτερη ή ίση από αυτή του Υ)
Κατηγορήματα Με χρήση των προηγούμενων κατηγορημάτων μπορούν να ξαναγραφούν κατηγορήματα, που ορίσθηκαν με χρήση των όρων
Κατηγορήματα Η ερώτηση?-plus(a,b,8) Θα δώσει μήνυμα λάθους (και όχι όλα τα ζεύγη φυσικών με άθροισμα 8) Αυτό συμβαίνει γιατί η παραπάνω ερώτηση ανάγεται από το μηχανισμό της Prolog στην ερώτηση?-8 is A+B
Κατηγορήματα Με χρήση κατηγορημάτων συστήματος μπορούν να γραφούν προγράμματα, που εκτελούν αριθμητικές πράξεις με το συνηθισμένο τρόπο:?-sumlist([],0).?-sumlist([i L],Sum):-sumlist(L,S), Sum is S+I.
Αποκοπή Προγράμματα Prolog Αναποτελεσματικά, γιατί το δένδρο αναζήτησης είναι αρκετά μεγάλο Ενδιαφέρον Ύπαρξη λύσης προβλήματος Όχι για την ποσότητα ή είδος λύσεων
Αποκοπή Δεν είναι απαραίτητο ο μηχανισμός εκτέλεσης της Prolog να διασχίσει ολόκληρο το δέντρο αναζήτησης, αλλά ένα μέρος του Ο προγραμματιστής καθοδηγεί το μηχανισμό αναζήτησης προς αποφυγή περιττών αναζητήσεων με τη βοήθεια της αποκοπής (cut) (σύμβολο (!))
Παράδειγμα Έστω ερώτηση της μορφής? A, B, C. Και το ακόλουθο τμήμα προγράμματος Β: -Α1,...Αk,!, Ak+1,, An. B: -Do,, Dm. B: -Fo,, Fk.
Ρόλος αποκοπής Όταν ο μηχανισμός εκτέλεσης της Prolog περάσει από την αποκοπή, τότε τα Α1,..., Ak δεν πρόκειται να ξαναεξεταστούν για επιπλέον λύσεις οι εναλλακτικές προτάσεις για το Β, που υπάρχουν στο πρόγραμμα μετά την πρόταση, που περιέχει την αποκοπή, δεν πρόκειται να εξεταστούν Κάποιες λύσεις αποκόπτονται από τη διαδικασία
Παράδειγμα Έστω το πρόγραμμα: father(tom,jim). male(jim). son(x,y):-father(y,x), male(x). son(george, jim). son(john, nick). Και η ερώτηση?-son(s,f).
Παράδειγμα Ο μηχανισμός της Prolog θα δώσει τρεις λύσεις: {S=jim, F=tom} {S=george, F=jim} {S=john, F=nick}
Παράδειγμα Αν το πρόγραμμα αντικατασταθεί με το: father(tom,jim). male(jim). son(x,y):-father(y,x),!,male(x). son(george, jim). son(john, nick).
Παράδειγμα Ο μηχανισμός εκτέλεσης της Prolog δίνει τη λύση {S=jim, F=tom}. Οι άλλες δύο λύσεις αποκόπτονται λόγω του συμβόλου!, που δεν επιτρέπει την εξέταση των εναλλακτικών προτάσεων για το son(s,f)
Παράδειγμα Η αποκοπή χρησιμοποιείται συνήθως όταν γνωρίζουμε ότι το πρόβλημα έχει μία και μοναδική λύση και επιθυμούμε τον περιορισμό άσκοπου ψαξίματος. Τα προγράμματα είναι έτσι πιο αποτελεσματικά. Η αποκοπή δεν ανήκει στο λογικό τμήμα της Prolog και για αυτό ενδέχεται να δημιουργήσει δυσνόητα προγράμματα. Λανθασμένη χρήση της περικόπτει λύσεις χρήσιμες και επιθυμητές.
Το σύστημα κανόνων CLIPS Λίστα Γεγονότων (facts list) (name george) Βάση κανόνων (rule/knowledge base) (defrule rain in case of rain (weather rain) => (assert (action take umbrella ))) Μηχανισμός Εξαγωγής Συμπερασμάτων (Inference Engine) Στρατηγικές Eπίλυσης Ανταγωνισμού (Conflict Resolution Strategies)
Εκτέλεση Προγράμματος Πρόγραμμα Ένα σύνολο από κανόνες και γεγονότα Εκτέλεση Ακολουθία από πυροδοτήσεις κανόνων των οποίων οι συνθήκες ικανοποιούνται Ικανοποίηση συνθηκών Ταυτοποίηση με γεγονότα Η εκτέλεση τερματίζεται όταν: Δεν υπάρχουν άλλοι κανόνες προς πυροδότηση Κληθεί συγκεκριμένη εντολή τερματισμού (halt)
Κύκλος Λειτουργίας CLIPS Εύρεση όλων των κανόνων των οποίων οι συνθήκες ικανοποιούνται και προσθήκη τους στην agenda (agenda - conflict set) Αν η ατζέντα είναι κενή τότε η εκτέλεση τερματίζεται Επιλογή ενός κανόνα με βάση τη στρατηγική επίλυσης ανταγωνισμού (conflict resolution) και εκτέλεσή του Επιστροφή στο βήμα 1, εκτός αν υπάρχει εντολή τερματισμού (halt)
Σύνταξη του CLIPS Θυμίζει LISP Είναι Case-Sensitive Δομικά Στοιχεία: Σύμβολα, π.χ. you, why_this, good-morning Αλφαριθμητικά, π.χ. This is a String Αριθμοί, π.χ. 24,-45.6, 8e11 Σχόλια: ότι ακολουθεί τον χαρακτήρα ; Μεταβλητές Μονότιμες π.χ.?var,?x Πολλαπλών Τιμών π.χ. $?fruits, $?shopping
Μεταβλητές Εμφανίζονται Στις συνθήκες ενός κανόνα Στις ενέργειες ενός κανόνα Παίρνουν τιμές Κυρίως στις συνθήκες των κανόνων μέσω της διαδικασίας ταυτοποίησης Η ανάθεση τιμής σε μεταβλητή στις ενέργειες ενός κανόνα είναι δυνατή με τη χρήση κατάλληλης συνάρτησης, αλλά καλό είναι να αποφεύγεται Η εμβέλεια των μεταβλητών περιορίζεται στον κανόνα που αυτές εμφανίζονται
Γεγονότα Λίστες από σύμβολα που περικλείονται σε παρενθέσεις π.χ. (name John Papas) (shopping_list cheese wine bread book) (days Monday Friday Sunday) Κάθε γεγονός έχει μοναδικό αριθμό-ταυτότητα (fact index) που καθορίζεται αυτόματα Εμφάνιση γεγονότων CLIPS> (facts) f-0 (name John Papas) for a total of 1 fact.
Εισαγωγή Γεγονότων Με τη χρήση της εντολής assert (assert <fact>) CLIPS> (assert (gift book)) <Fact-0> CLIPS> (facts) f-0 (gift book) for a total of 1 fact. CLIPS> (assert (day Monday) (phone 891363)) CLIPS> (facts) f-0 (gift book) f-1 (day Monday) f-2 (phone 891363) for a total of 3 facts.
Εισαγωγή Γεγονότων Με τη χρήση της εντολής deffacts (μαζί με reset) (deffacts <name> comments (<fact1>) (<fact2>) (<fact n>) )
Εντολή deffacts CLIPS> (deffacts colours this is to insert some colours (colour red)(colour blue)(colour green)) CLIPS> (reset) CLIPS> (facts) f-0 (initial-fact) f-1 (colour red) f-2 (colour blue) f-3 (colour green) for a total of 4 facts. CLIPS> (facts 2) f-2 (colour blue) f-3 (colour green) for a total of 2 facts.
Επιτρέπονται διπλά γεγονότα? CLIPS> (assert (name nick)) <Fact-0> CLIPS> (facts) f-0 (name nick) For a total of 1 facts. CLIPS> (assert (name nick)) FALSE CLIPS> (facts) f-0 (name nick) For a total of 1 facts.
Διαγραφή Γεγονότων Χρήση της εντολής (retract) (retract <fact-index>) CLIPS> (retract 1 3) CLIPS> (facts) f-0 (initial-fact) f-2 (colour blue) for a total of 2 facts. CLIPS> (retract 1) [PRNUTIL1] Unable to find fact-1 Χρήση της εντολής (clear)
Παρακολούθηση Προσθήκης και Διαγραφής Γεγονότων Χρήση της εντολής (watch facts) CLIPS> (watch facts) CLIPS> (assert (age 23)) ==> f-0 (age 23) <Fact-0> CLIPS> (reset) <== f-0 (age 23) ==> f-0 (initial-fact) CLIPS> (assert (mobile 0977233445)) ==> f-1 (mobile 0977233445) <Fact-1> CLIPS> (retract 1) <== f-1 (mobile 0977233445) CLIPS> (facts) f-0 (initial-fact) for a total of 1 fact.
Κανόνες Μορφή: if (Συνθήκες) then (Ενέργειες) Συνθήκες: Γεγονότα & Μεταβλητές Ενέργειες: Πράξεις (εντολές) μετά την ενεργοποίηση του κανόνα Σημασία: Εάν ικανοποιούνται οι συνθήκες (δηλαδή ταυτοποιούνται με τη λίστα γεγονότων) Τότε εκτέλεσε τις ενέργειες
Κανόνες Σύνταξη: (defrule <όνομα κανόνα> <σχόλια> (<συνθήκη 1>) (<συνθήκη n>) => (<εντολή 1>) (<εντολή m>) )
Κανόνες Παράδειγμα (defrule soccer-time Warns for your soccer time (day sunday) (time afternoon) => (assert (go for soccer)))
Ταυτοποίηση
Ταυτοποίηση
Build-in Συναρτήσεις Βασικές Αριθμητικές Συναρτήσεις (+ <ορίσματα>) (- <ορίσματα>) (* <ορίσματα>) (/ <ορίσματα>) Συναρτήσεις σύγκρισης αριθμών (= <ορίσματα>) (< <ορίσματα>) (>= <ορίσματα>) (> <ορίσματα>) (<= <ορίσματα>) (<> <ορίσματα>) Οι ακόλουθες συναρτήσεις επιστρέφουν TRUE (>= 5 5 4 2 2 1) (<= 2 3 3 4 6) (<> 3 5)
Λογικές Συναρτήσεις Δυνατότητα να εκφραστούν πολύπλοκες συνθήκες κανόνων (and <ορίσματα>) (or <ορίσματα>) (not <όρισμα>) (eq <ορίσματα>) (neq <ορίσματα>) Οι ακόλουθες συναρτήσεις επιστρέφουν TRUE (and (>= 5 5) (> 3 2 1) (= 10 10)) (and (not (= 10 7)) (= 9 9))
Λογικές Συναρτήσεις (defrule days (month Jan mon) (or (hour 12) (hour 13)) => (assert (day is Monday noon time)) ) (defrule days (month Jan mon) (or (and (hour 12) (lunch break)) (and (hour 17) (departure time)) ) => (assert (office closed at this hour)) )
Συναρτήσεις εισόδου - εξόδου (printout <device> <expression>) Αποστέλλει την έκφραση <expression> στη συσκευή <device> Η συσκευή μπορεί να είναι ένα αρχείο ή η οθόνη Για οθόνη, χρησιμοποιούμε t (terminal) (printout t "The day was "?type crlf) The day was sunny Το σύμβολο crlf δηλώνει αλλαγή γραμμής
Συναρτήσεις εισόδου - εξόδου (read) Eισάγει σύμβολο από τo πληκτρολόγιο Συνήθως χρησιμοποιείται σε συνδυασμό με την εντολή bind, για ανάθεση τιμής σε μεταβλητή στις ενέργειες ενός κανόνα (defrule get-user-answer (initial-fact) => (printout t "What s your name: ") (bind?name (read)) (assert (user-name?name)) )
Ανάθεση τιμής σε μεταβλητή (bind <variable> <value>) Ανατίθεται η τιμή <value> σε μια μεταβλητή <variable> στις ενέργειες των κανόνων (defrule rule1 "example rule" (oldcost?oldcost) (newcost?newcost) => (bind?total_cost (+?newcost?oldcost)) (assert (cost?total_cost)) (printout t "The total cost is "?total_cost crlf) )
Έλεγχος ροής προγράμματος (while) Έστω ότι υπάρχει ένα γεγονός (num 1) Τύπωσε όλους τους αριθμούς από το 1 μέχρι το 9, με τη φράση "the num is:" σαν πρόθεμα (defrule test (num?n) => (while (<?n 10) do (printout t "the num is: "?n crlf) (bind?n (+ 1?n)) ) )
Έλεγχος ροής προγράμματος (if-else) Τύπωσε positive, negative ή zero, αν ο αριθμός?n είναι μεγαλύτερος, μικρότερος ή ίσος με μηδέν (defrule sign (num?n) => (if (>?n 0) then (printout t "positive" crlf)) else (if (<?n 0) then (printout t "negative" crlf) else (printout t "zero" crlf)) ) )
Η χρήση του not Aν εμφανίζονται μεταβλητές μέσα σε κάποιο (not...) τότε δε γίνεται ανάθεση τιμών σε αυτές (defrule wrong-rule (not (element?b)) => (printout t "not element"?b crlf) )
Μεγάλα/Σύνθετα Γεγονότα Σε μεγάλα προγράμματα χρειάζεται να αναπαρασταθεί η πληροφορία με μεγάλα ή σύνθετα γεγονότα Π.χ. βάση δεδομένων μαθητών: (student name <name> surname <surname> sex <sex> age <age> classes <classes>) (student name john surname ref sex male age 28 classes math physics chem)
Agenda και Εκτέλεση Κανόνων Όλοι οι κανόνες των οποίων οι συνθήκες ικανοποιούνται εισάγονται στην agenda Σύνολο συγκρούσεων (conflict set) Από την agenda επιλέγεται κάθε φορά 1 μόνο κανόνας, ο οποίος και πυροδοτείται με βάση 2 κριτήρια: την προτεραιότητα των κανόνων τη στρατηγική επίλυσης συγκρούσεων
Η Agenda ως Στοίβα Η ατζέντα συμπεριφέρεται σαν στοίβα (stack) όπου όσο μεγαλύτερη προτεραιότητα έχει ένας κανόνας τόσο πιο ψηλά βρίσκεται σε αυτή Κάθε φορά εκτελείται ο κανόνας που βρίσκεται στην κορυφή της στοίβας Ένας νέος κανόνας τοποθετείται στην ατζέντα σύμφωνα με τα ακόλουθα κριτήρια: Προτεραιότητα (salience) Στρατηγική Επίλυσης Συγκρούσεων Αυθαίρετη σειρά
Τοποθέτηση Κανόνα στην Agenda Οι νέοι κανόνες μπαίνουν "πάνω" από όλους τους κανόνες με μικρότερη ή ίση προτεραιότητα (salience) και "κάτω" από όλους τους κανόνες με μεγαλύτερη προτεραιότητα Στους κανόνες με ίδια προτεραιότητα χρησιμοποιείται η τρέχουσα στρατηγική επίλυσης συγκρούσεων για να καθοριστεί η σειρά τους
Τοποθέτηση Κανόνα στην Agenda Εάν κάποιοι κανόνες ενεργοποιήθηκαν από το ίδιο σύνολο γεγονότων και τα προηγούμενα βήματα δεν μπόρεσαν να ορίσουν μία σειρά, τότε δίνεται σε αυτούς μια αυθαίρετη σειρά (όχι τυχαία), η οποία εξαρτάται από την υλοποίηση του συστήματος
Προτεραιότητα Κανόνων Σύνταξη (μέσα στον ορισμό του κανόνα) (declare (salience <number>)) Παράδειγμα: (defrule cartesian (declare (salience 30)) (element?a) (element?b) => (printout t "Elements: "?a " "?b crlf))
Ιδιότητες Προτεραιότητας Κανόνα Είναι ακέραια αριθμητική τιμή Όσο μεγαλύτερη είναι, τόσο μεγαλύτερη είναι και η προτεραιότητα του κανόνα Οι επιτρεπτές τιμές είναι από -10000 έως 10000 Εάν δεν υπάρχει δήλωση, ο κανόνας θεωρείται ότι έχει την προκαθορισμένη τιμή μηδέν
Χρήση προτεραιότητας (defrule MAIN::start (declare (salience 10000)) => (set-fact-duplication TRUE) (focus QUESTIONS CHOOSE-QUALITIES WINES PRINT-RESULTS) ) (defrule MAIN::combine-certainties "" (declare (salience 100))?rem1 <- (attribute (name?rel) (value?val) (certainty?per1))?rem2 <- (attribute (name?rel) (value?val) (certainty?per2)) (test (neq?rem1?rem2)) => (retract?rem1) (modify?rem2 (certainty (/ (- (* 100 (+?per1?per2)) (*?per1?per2)) 100))) )