Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή raniah@hua.gr 1
Εισαγωγή Η PROLOG (PROgramming in LOGic) είναι μια συμβολική γλώσσα προγραμματισμού που βασίζεται στην κατηγορηματική λογική. Περιγράφεται η λογική του προς επίλυση προβλήματος, ο έλεγχος αφήνεται στο σύστημα. Η λογική είναι ένα σύνολο προτάσεων που περιγράφει τα δεδομένα του προβλήματος και τις σχέσεις που τα συνδέουν. Προτάσεις Horn (υποπερίπτωση προτάσεων Kowalski): λογικές ισοδυναμίες της μορφής q 1, q 2,, q n r Οι ατομικοί τύποι q j είναι σε σύζευξη Το r αποτελεί το συμπέρασμα της πρότασης, ενώ τα q j αποτελούν τις προϋποθέσεις της. 2
Γεγονότα και Κανόνες Δύο είδη προτάσεων σε ένα πρόγραμμα PROLOG: Γεγονότα (σχέσεις ανάμεσα σε αντικείμενα, δεδομένα του προβλήματος) flatmate(sheldon, leonard). Κανόνες (γενικότερες σχέσεις που ορίζονται με τη βοήθεια άλλων σχέσεων) friend(x,y) :- flatmate(x,y). friend(x,y) :- collegue(x,y), hangs_out(x,y). 3
Αλληλεπίδραση Διερμηνευόμενη (Interpreted) Backward chaining Ο χρήστης δίνει ερωτήσεις (queries) και το σύστημα μπορεί προσπαθεί να απαντήσει βάσει των γεγονότων και των κανόνων Απάντηση προγράμματος: true, false, ή αντικαταστάσεις μεταβλητών. Περισσότερες από μία απαντήσεις με το ; 4
Σύνταξη Ένα PROLOG πρόγραμμα είναι ένα σύνολο από Γεγονότα: Α. Κανόνες: A :- B 1, B 2,, B k, k>0 Ερωτήσεις:?- B 1, B 2,, B k, k>0 Α, Β i : ατομικοί τύποι της μορφής p(t 1, t 2,, t n ) όπου p κατηγόρημα και t i ορίσματα Τα ορίσματα είναι όροι: Σταθερές: άτομα (συμβολοσειρές), ή αριθμοί Μεταβλητές: ξεκινούν με κεφαλαίο ή με _ Σύνθετοι όροι της μορφής f(t 1, t 2,, t n ) όπου f συναρτησιακό σύμβολο και t i ορίσματα Κάθε πρόταση τελειώνει με τελεία. Α κεφαλή του κανόνα, Β i σώμα του κανόνα. :- έχει την έννοια του IF, τα κόμμα την έννοια του AND 5
Μεταβλητές Δεν αντιπροσωπεύουν θέσεις μνήμης, όπως στις κλασσικές γλώσσες προγραμματισμού, αλλά όρους οι οποίοι δεν είναι γνωστοί κατά τη στιγμή διατύπωσης της πρότασης. Δεν έχουν τύπο, μπορούν να παίρνουν διαφορετικού τύπου τιμές σε διαφορετικές κλήσεις της ίδιας πρότασης. Η εμβέλειά τους περιορίζεται στον κανόνα στον οποίον εμφανίζονται. 6
Διαδικαστική και Δηλωτική Σημασία Τα προγράμματα στην PROLOG μπορούν να γίνουν κατανοητά με δύο τρόπους: P :- Q, R Δηλωτικά (declaratively): Το P είναι αληθές εάν το Q και το R είναι αληθή Διαδικαστικά (procedurally): Για να αποδειχθεί ότι το P είναι αληθές πρέπει πρώτα να αποδειχθεί ότι το Q είναι αληθές και στη συνέχεια ότι και το R είναι αληθές. 7
Παράδειγμα composed(roger_waters, another_brick_in_the_wall). composed(david_gilmour, another_brick_in_the_wall). composed(roger_waters, hey_you). composed(syd_barrett, lucifer_sam). sang(david_gilmour, another_brick_in_the_wall). sang(roger_waters, hey_you). sang(david_gilmour, hey_you). sang(syd_barrett, lucifer_sam). belongs(pink_floyd, another_brick_in_the_wall). belongs(pink_floyd, hey_you). belongs(pink_floyd, lucifer_sam). created(x, Y) :- composed(x, Y). created(x, Y) :- sang(x, Y). band_member(band, X) :- composed(x, Y), belongs(band, Y). band_member(band, X) :- sang(x, Y), belongs(band, Y).?- consult( bands.pl ). 8
Παράδειγμα: Σύνθετοι όροι band_member(full_name(name(david), surname(gilmour)), band(pink_floyd), instrument(guitar)). band_member(full_name(name(steve), surname(harris)), band(iron_maiden), instrument(bass)). band_member(full_name(name(roger), surname(waters)), band(pink_floyd), instrument(bass)). band_member(full_name(name(alex), surname(turner)), band(arctic_monkeys), instrument(guitar)).?- band_member(full_name(name(_), surname(surname)), band(arctic_monkeys), instrument(guitar)).?- band_member(full_name(name(_), surname(surname)), band(_), instrument(bass)). 9
Παράδειγμα: Κατηγορήματα με τάξη μηδέν mg :- mgo, h2. h2o :- mgo, h2. co2 :- c, o2. h2co3 :- co2, h2o. mgo. h2. c. o2.?-h2co3. true. 10
Εκτέλεση προγράμματος Η εκτέλεση ενός προγράμματος στην PROLOG ξεκινάει με την ερώτηση του χρήστη, που μπορεί να αποτελείται από μία ή περισσότερες κλήσεις, και φτάνει σε λύση όταν έχουν εξαντληθεί όλες οι κλήσεις που αποτελούν την ερώτηση. Το αποτέλεσμα του προγράμματος είναι η απάντηση στην ερώτηση. Φόρτωση αρχείου: consult(file). Εμφάνιση τρέχοντος προγράμματος: listing. 11
Μηχανισμός ταυτοποίησης Μηχανισμός ταυτοποίησης (unification): καθιστά ταυτόσημες μια κλήση μιας ερώτησης και την κεφαλή μιας πρότασης του προγράμματος, με τις ελάχιστες απαραίτητες αναθέσεις τιμών σε μεταβλητές (πιο γενικός ταυτοποιητής mgu) Αν η κλήση ταυτοποιείται με γεγονός, απομακρύνεται από την ερώτηση. Αν η κλήση ταυτοποιείται με κανόνα, αντικαθίσταται στην ερώτηση από το σώμα του κανόνα. 12
Αλγόριθμος Ταυτοποίησης Μια μεταβλητή χωρίς τιμή ταυτοποιείται με οτιδήποτε (σταθερά, μεταβλητή ή σύνθετο όρο). Μια μεταβλητή χωρίς τιμή μπορεί να ταυτοποιηθεί με μια άλλη μεταβλητή χωρίς τιμή, αλλά από εκείνη τη στιγμή και μετά οι μεταβλητές ενοποιούνται και κάθε ανάθεση τιμής σε μία από αυτές έχει ως αποτέλεσμα την ανάθεση της ίδιας τιμής στην άλλη. Μια σταθερά ταυτοποιείται μόνο με τον εαυτό της. Ένας σύνθετος όρος ταυτοποιείται με έναν άλλον σύνθετο όρο μόνο εφόσον έχουν το ίδιο συναρτησιακό σύμβολο και τα αντίστοιχα ορίσματά τους μπορούν να ταυτοποιηθούν. 13
Οπισθοδρόμηση (backtracking) Αν στο πρόγραμμα υπάρχουν περισσότερες της μιας προτάσεις με τις οποίες ενοποιείται η κλήση της ερώτησης, τότε η κλήση ενοποιείται με την πρώτη κατά σειρά από αυτές. Σημείο οπισθοδρόμησης: εναλλακτικές απαντήσεις σε περίπτωση αποτυχίας εύρεσης λύσης ή σε περίπτωση απαίτησης επιπλέον λύσεων. Ο μηχανισμός οπισθοδρόμησης επιστρέφει στο σημείο ακυρώνοντας τα υπολογιστικά βήματα που έπονται και συνεχίζει από εκεί την εκτέλεση. 14
Παράδειγμα Δέντρο υπολογισμού greek(socrates). human(turing). human(socrates). fallible(x) :- human(x).?- fallible(y), greek(y).?- fallible(y), greek(y). {Y=X}?- human(y), greek(y). {Y=turing} {Y=socrates}?- greek(turing).?- greek(socrates). αποτυχία 15
family relations father(x,y) :- parent(x,y), man(x). mother(x,y) :- parent(x,y), woman(x). Κάποιο άτομο Χ είναι πατέρας (is_father/1) Ο Χ είναι αδερφός του (της) Υ. Ο Χ είναι παππούς του (της) Υ. Η Χ είναι θεία του (της) Υ 16
family relations father(x,y) :- parent(x,y), man(x). mother(x,y) :- parent(x,y), woman(x). is_father(x) :- father(x,_). brother(x,y) :- parent(z,x), parent(z,y), man(x), X\=Y. grandfather(x,y) :- father(x,z), parent(z,y). sister(x,y) :- parent(z,x), parent(z,y), woman(x), X\=Y. aunt(x,y) :- sister(x,z), parent(z,y). 17
Οδικό δίκτυο Thessaloniki Ioannina Larissa Lamia Patra Athina 18
Οδικό δίκτυο - δεδομένα road(thessaloniki,ioannina). road(thessaloniki,larissa). road(larissa,lamia). road(lamia,athina). road(athina,patra). road(lamia,patra). road(ioannina,patra). Ioannina Thessaloniki Larissa Lamia Patra Athina 19
Οδικό δίκτυο - ερωτήσεις Υπάρχει κάποια πόλη X που να έχει δρόμο προς μια πόλη Υ, η οποία έχει δρόμο προς την Χ; (αμφίδρομη σχέση)?-road(x,y), road(y,x). false. Υπάρχουν 2 πόλεις που έχουν δρόμο προς μία τρίτη πόλη;?-road(x,y), road(ζ,υ). true, BUT unexpexted asnwers! 20
Οδικό δίκτυο - κανόνες Αν μια πόλη Χ έχει δρόμο προς μια πόλη Υ, τότε και η πόλη Υ έχει δρόμο προς την Χ. road(x,y) :- road(y,x). Αν μια πόλη Χ έχει δρόμο προς μια πόλη Υ και η Υ έχει δρόμο προς μια Ζ, τότε και η Χ έχει δρόμο προς την Ζ. road(x,y), road(y,z) :- road(x,z). Αν δυο πόλεις Χ και Υ έχουν δρόμο προς μια πόλη Ζ, τότε έχουν και δρόμο μεταξύ τους. road(x,z), road(y,z) :- road(x,y). 21
students & classes student(nick,class(1)). student(jim,class(3)). student(susan,class(2)). student(sophie,class(5)). student(george,class(2)). student(helen,class(3)). is_taught(math,class(1)). is_taught(math,class(2)). is_taught(math,class(5)). is_taught(language,class(2)). is_taught(history,class(1)). is_taught(music,class(2)). is_taught(music,class(5)). likes(language,george). likes(math,sophie). likes(math,nick). likes(music,x) :- is_taught(music,class(t)), student(x,class(t)). friends(s1,s2) :- likes(subject,s1), likes(subject,s2). 22
students & classes Είναι η sophie μαθήτρια της 5 ης τάξης; Ποιοί είναι οι μαθητές της 2 ης τάξης; Διδάσκεται γλώσσα στην τάξη της susan; Σε ποιούς μαθητές αρέσει η μουσική; Ποιοί είναι οι φίλοι της sophie; Ποιοί είναι οι φίλοι των μαθητών που διδάσκονται μαθηματικά; 23
students & classes?- student(sophie,class(5)).?- student(s,class(2)).?- student(susan,t), is_taught(language,t).?- likes(music,s).?- friends(sophie,f).?- friends(m1,m2), is_taught(math,c), student(m1,c), M1\=M2. 24
Αναδρομή flight(athens, rome). flight(athens, london). flight(athens, paris). flight(rome, lisbon). flight(paris, brussels). flight(london, helsinki). connected_by_air(x,z) :- flight(x,z). connected_by_air(x,z) :- flight(x,y), flight(y,z). connected_by_air(x,z) :- flight(x,y1), flight(y1,y2), flight(y2,z). connected_by_air(x,z) :- flight(x,z). connected_by_air(x,z) :- flight(x,y), connected_by_air(y,z). 25
Αναδρομικές Δομές Δεδομένων (Λίστες) Οι σύνθετοι όροι χρησιμεύουν στην αναπαράσταση σύνθετων οντοτήτων ενός προβλήματος triangle(point(0,0), point(1,4), point(5,12)); Οι αναδρομικές δομές δεδομένων είναι σύνθετοι όροι οι οποίοι ορίζονται αναδρομικά εγκλείοντας όρους της ίδιας μορφής με τον εαυτό τους. Ειδική κατηγορία: λίστα Συναρτησιακό σύμβολο η τελεία. Τα ορίσματά της είναι οποιοιδήποτε όροι, ακόμα και λίστες Η κενή λίστα αναπαρίσταται ως [] Παράδειγμα λίστας με τρία στοιχεία:.(a,.(b,.(c, []))) Μπορεί επίσης να αναπαρασταθεί ως [a, b, c] 26
Λίστες Μια λίστα είτε είναι κενή [] αποτελείται από μια δομή με δύο όρους κεφαλή (head), που είναι το πρώτο στοιχείο της λίστας oυρά (tail), που είναι το υπόλοιπο τμήμα της λίστας Αναπαρίσταται ως [Η Τ] και αντιστοιχεί στον σύνθετο όρο.(η,τ) Η ουρά είναι πάντα μια λίστα. Η κεφαλή μπορεί να είναι οποιοσδήποτε απλός ή σύνθετος όρος, ή λίστα. Ο χειρισμός λιστών γίνεται συνήθως με αναδρομικούς κανόνες οι οποίοι επιτελούν κάποια λειτουργία στην κεφαλή της λίστας και στη συνέχεια καλούν τον εαυτό τους για την ουρά, ενώ συνήθως υπάρχει τερματικός κανόνας για την κενή λίστα. 27
Λίστες Μια λίστα μπορεί να αναπαρασταθεί σχηματικά σαν δένδρο με κόμβους το σύμβολο της λίστας και φύλλα τα στοιχεία της. π.χ. η λίστα [2, 4, 6, 8] μπορεί να αναπαρασταθεί σαν:. 2 4. 6.. 8 [] 28
lists Διαπίστωση εάν ένας όρος είναι λίστα is_list([]). is_list([head Tail]) :- is_list(tail). Έλεγχος αν ένα στοιχείο είναι μέλος μιας λίστας member(x, [X Y]). member(x, [Head Tail]) :- member(x, Tail). 29
Δέντρο υπολογισμού member?-member(b,[a,b,c,b,e]).?-member(b,[b,c,b,e]).?-member(b,[c,b,e]). member(x,[x Y]).?-member(b,[b,e]). member(x,[head Tail]) :- member(x, Tail).?-member(b,[e]).?-member(b,[]). fail 30
more lists Τελευταίο στοιχείο μιας λίστας last(h, [H]). last(s, [H T]) :- last(s,t). Συνένωση Λιστών append([],l,l). append([h L1],L2,[H L]) :- append(l1,l2,l). 31
even more lists Διαδοχικά στοιχεία λίστας consecutive(h1,h2,[h1,h2 T]). consecutive(h1,h2,[h T]) :- consecutive(h1,h2,t). Λίστα με στοιχεία λίστες (π.χ. αναπαράσταση πολυδιάστατων πινάκων) [[12,45,-3],[-7,6,23],[11,3,-9]] (αναπαράσταση και με κατηγόρημα t/3) 32
reverse list 1 ος τρόπος reverse([],[]). reverse([h T],RL) :- reverse(t,rt), append(rt,[h],rl). 2 ος τρόπος reverse(l,rl) :- rev(l,[],rl). rev([h T],S,RL) :- rev(t,[h S],RL). rev([],rl,rl). 33
initial part of a list 1 ος τρόπος initial([],l). initial([h T1],[H T2]) :- initial(t1,t2). 2 ος τρόπος initial(l1,l2) :- append(l1,l,l2). 34
final part of a list 1 ος τρόπος final(l,l). final(l1,[h L2]) :- final(l1,l2). 2 ος τρόπος final(l1,l2) :- append(l,l1,l2). 35
sublist 1 ος τρόπος sublist([],l). sublist([],l,0). sublist([h L1],[H L2]) :- sublist(l1,l2,0). sublist(l1,[h L2]) :- sublist(l1,l2). sublist([h L1],[H L2],0) :- sublist(l1,l2,0). 2 ος τρόπος sublist(sl,l) :- initial(sl,lt), append(l3,lt,l). 36
symmetrical list Ίδια είτε την διασχίσουμε από την αρχή προς το τέλος είτε από το τέλος προς την αρχή. symmetrical([x]). symmetrical([x,x]). symmetrical(s) :- append([x ST],[X],S), symmetrical(st). 37
same length in lists same_length([x],[y]). same_length([x T1],[Y T2]) :- same_length(t1,t2). 38
Ενσωματωμένα Κατηγορήματα Τα ενσωματωμένα κατηγορήματα προσθέτουν επιπλέον δυνατότητες στην γλώσσα και αφορούν μαθηματικές πράξεις και συναρτήσεις, είσοδο / έξοδο σε αρχεία και συσκευές, έλεγχο τύπου δεδομένων, διαχείριση λύσεων κτλ. Ενοποίηση και σύγκριση όρων: = και \= (συγκρίνει αν δύο όροι μπορούν να ταυτοποιηθούν) == και \== (συγκρίνει αν δύο όροι είναι ταυτόσημοι) π.χ. μεταβλητή και σταθερά: το = επιτυγχάνει, το == όχι. 39
Μαθηματικές διαδικασίες και συναρτήσεις sum(x,y,z), product(x,y,z), power(x,n,z) Διαφορά και πηλίκο με χρήση των παραπάνω αντίστροφα. Κατηγορήματα σύγκρισης <, > κτλ. (Ο τελεστής =< γράφεται ανάποδα) is: αποτιμάει αριθμητικές εκφράσεις και η τιμή τους ενοποιείται με κάποια μεταβλητή. Μπορούν να χρησιμοποιηθούν μεταβλητές οι οποίες έχουν πάρει προηγουμένως κάποια τιμή και οι τελεστές +,-,*,/,mod,^. double:- write('please input a number= '), read(x),nl, write('double is '), Y is 2*X, write(y),nl. 40
Παράδειγμα: Μαθηματικές διαδικασίες Fibonacci sequence: F 0 = 0, F 1 = 1, F n = F n-1 + F n-2 fib(0,0). fib(1,1). fib(n,r):- N >= 2, N1 is N-1, N2 is N-2, fib(n1,r1), fib(n2,r2), R is R1+R2. 41
list length length([],0). length([_ L],M) :- length(l,m1), M is M1 + 1. 42
n th element of a list nth(0,[x _],X). nth(n,[_ T],R):- M is N-1,nth(M,T,R). 43
Σύγκριση μαθηματικών όρων Κατηγορήματα σύγκρισης: =:= > < >= =< =\= Μέγιστο στοιχείο λίστας max([x], X). max([x Y],M) :- max(y,m1), max_two(x,m1,m). max_two(x,y,x) :- X > Y. max_two(x,y,y) :- X =< Y. 44
Ταυτοποίηση και σύγκριση = και \= συγκρίνουν αν δύο όροι μπορούν να ταυτοποιηθούν =:= και =\= συγκρίνουν αν δύο όροι είναι ταυτόσημοι π.χ. για μεταβλητή και σταθερά: το = επιτυγχάνει, το == όχι. parent(x,y) = parent(nick, maria) true parent(x,y) \= parent(nick, maria) false parent(x,jenny) \= parent(nick, maria) true 2+1 = 1+2 false 2+3 = 1+4 false 2+1 = 2+1 true 2+1 =:= 1+2 true 2+3 =:= 1+4 true 2+1 =:= 2+1 true 45
Διαδικασίες εισόδου / εξόδου Ανάγνωση όρων ή χαρακτήρων από το προκαθορισμένο κανάλι εισόδου (πληκτρολόγιο ή αρχείο) read(x) διαβάζει τον επόμενο όρο που εισάγεται (η τελεία δηλώνει το τέλος του όρου) Εκτύπωση στο προκαθορισμένο κανάλι εξόδου (οθόνη ή αρχείο) write(x) γράφει τον όρο Χ nl αλλάζει γραμμή Ανακατεύθυνση καναλιών με see, seen, tell, told κτλ. 46
Σύνθεση / διάσπαση σύνθετων όρων =.. (κατηγόρημα univ): πετυχαίνει όταν το πρώτο όρισμα είναι σύνθετος όρος και το δεύτερο λίστα Το πρώτο στοιχείο της λίστας είναι το συναρτησιακό σύμβολο του σύνθετου όρου και τα υπόλοιπα τα ορίσματά του.?- friend(sheldon, leonard) =.. List. List =.. [friend, sheldon, leonard] Το κατηγόρημα κάνει επίσης και σύνθεση όρων: P =.. [point, 2, 3]. P = point(2,3) 47
Έλεγχος τύπου δεδομένων Οι μεταβλητές στην PROLOG δεν έχουν τύπο. Μπορούν να ενοποιηθούν με οποιονδήποτε όρο. Παρέχεται σύνολο κατηγορημάτων για τον ορισμό και τον έλεγχο του τύπου των μεταβλητών var, novar, atom, integer κτλ. 48
Δυναμική τροποποίηση προγράμματος Τα γεγονότα και οι κανόνες ενός προγράμματος συνήθως φορτώνονται από ένα αρχείο και αποθηκεύονται στη μνήμη του συστήματος. Η PROLOG δίνει τη δυνατότητα τροποποίησης των περιεχομένων της μνήμης κατά τη διάρκεια εκτέλεσης του προγράμματος. asserta(x) προσθέτει στη μνήμη τον κανόνα ή γεγονός Χ πριν από τις υπάρχουσες προτάσεις με το ίδιο κατηγόρημα και ίσο αριθμό ορισμάτων assertz(x) προσθέτει τον κανόνα η γεγονός μετά τις υπάρχουσες προτάσεις retract(x) αφαιρεί από τη μνήμη τον κανόνα ή γεγονός Χ 49
Δυναμική τροποποίηση προγράμματος Παράδειγμα Στη μνήμη υπάρχει: friend(sheldon, leonard).?- friend(sheldon, X). X = leonard?- asserta(friend(sheldon, howard)). yes?- friend(sheldon, X). X = howard; X = leonard?- assertz(friend(sheldon, rajesh)). yes?- friend(sheldon, X). X = howard; X = leonard; X = rajesh 50
name(atom, CharCodes) Μετατρέπει ένα atom (που μπορεί να είναι και String), σε μια λίστα που περιέχει τους αντίστοιχους κωδικούς χαρακτήρων και αντίστροφα.?- name( test, X). X = [116, 101, 115, 116]. 51
Διαχείριση συνόλου λύσεων Ορισμένες φορές είναι χρήσιμο να βρεθούν όλες οι εναλλακτικές λύσεις σε μια κλήση και για να μπορούμε να τις επεξεργαστούμε όλες μαζί. Η PROLOG παρέχει τη δυνατότητα συλλογής των λύσεων bagof setof findall 52
Διαχείριση συνόλου λύσεων - Παράδειγμα H findall(var, Goal, List) πετυχαίνει όταν στην λίστα List ως στοιχεία υπάρχουν όλες οι εναλλακτικές τιμές που μπορεί να πάρει η μεταβλητή Var, έτσι ώστε ο στόχος Goal να αληθεύει. Αν υπάρχουν τα ακόλουθα γεγονότα wrote(jrr_tolkien, lord_of_the_rings). wrote(jrr_tolkien, hobbit). και εκτελεστεί η κλήση PROLOG?- findall(x, wrote(jrr_tolkien,x), List). List = [lord_of_the_rings,hobbit] δηλαδή η μεταβλητή List θα έχει σε λίστα όλα τα βιβλία του Tolkien. Η findall(x, wrote(writer,x), List). θα δώσει σε λίστα όλα τα βιβλία της βάσης γνώσης που έχουν γραφεί ποτέ από οποιονδήποτε Writer, ενώ η αντίστοιχη bagof θα τα χωρίσει ανά συγγραφέα. Η setof συμπεριφέρεται όπως η bagof αλλά αφαιρεί τα διπλότυπα. 53
Άρνηση ως αποτυχία (negation as failure) Διαφορά PROLOG από κατηγορηματική λογική: σημασία της άρνησης. Στην κατηγορηματική λογική μπορεί να υπάρξουν αρνητικά γεγονότα Στην PROLOG δε υπάρχει η δυνατότητα αναπαράστασης αρνητικής γνώσης Η ύπαρξη ενός γεγονότος δηλώνει την αλήθεια του, ενώ θεωρείται πως ό,τι δεν αναφέρεται ρητά στην μνήμη τότε δεν ισχύει (closed world assumption). Σύμφωνα με τα παραπάνω, οποιαδήποτε σχέση δεν μπορεί να αποδειχθεί από το σύστημα, θεωρείται ψευδής. Η υλοποίηση αυτή διαφέρει σαφώς από την έννοια της άρνησης στην κατηγορηματική λογική, ωστόσο απαλλάσσει τον προγραμματιστή από την υποχρέωση ορισμού όλης της αρνητικής πληροφορίας. 54
not - Παράδειγμα Το κατηγόρημα not δέχεται ως όρισμα μια οποιαδήποτε κλήση της PROLOG. Αν η κλήση μπορεί να αποδειχθεί, το κατηγόρημα αποτυγχάνει, αλλιώς πετυχαίνει.?- not(member(a,[a,b,c])). no?- not(member(d,[a,b,c])). yes 55
Παράδειγμα: Λογικά Κυκλώματα truth_value(0,0). truth_value(1,1). truth_value(and(x,y), 1) :- truth_value(x,1), truth_value(y,1). truth_value(and(x,y), 0) :- truth_value(x,0). truth_value(and(x,y), 0) :- truth_value(y,0). truth_value(or(x,y), 1) :- truth_value(x,1). truth_value(or(x,y), 1) :- truth_value(y,1). truth_value(or(x,y), 0) :- truth_value(x,0), truth_value(y,0). truth_value(not(x), 1) :- truth_value(x,0). truth_value(not(x), 0) :- truth_value(x,1). 56
Παράδειγμα: Λογικά Κυκλώματα Λογική Συνάρτηση Κυκλώματος: not(or(and(not(x),y),and(z,y))) Αναπαριστούμε το λογικό κύκλωμα με κατηγόρημα: circ(1, [X,Y,Z], not(or(and(not(x),y),and(z,y)))). Ορίζουμε τη σχέση: out(circ_code, Value_list, Output) :- circ(circ_code, Value_list, Log_function), truth_value(log_function, Output). Ερωτήσεις:?- out(1, [1,0,0], Output).?- out(1, [1,1,1], Output). 57
Παράδειγμα: Αναγραμματισμός start:- write('write a word='),read(x),nl, name(x,l),permut(l,r), name(cuv,r),write(cuv),tab(5),fail. add(x,l,[x L]). add(x,[l H],[L R]):- add(x,h,r). permut([],[]). permut([l H],R):- permut(h,r1),add(l,r1,r).?- start. Write a word= max. max amx axm mxa xma xam no 58
Ενδεικτική Βιβλιογραφία Ενότητα Π.1.1 του Παραρτήματος 1 του βιβλίου «Τεχνητή Νοημοσύνη», Ι. Βλαχάβας, Π. Κεφαλάς, Ν. Βασιλειάδης, Φ. Κόκκορας και Η. Σακελλαρίου. 59