Εργαστήριο μαθήματος «Τεχνολογία Γνώσης» Σαντιπαντάκης Γιώργος
assert/retract Μπορούμε να προσθέσουμε γεγονότα ή κανόνες (δυναμικά) στο πρόγραμμα (βάση γνώσης) της prolog – asserta/1 : προσθήκη στην αρχή του προγράμματος – assertz/1 : προσθήκη στο τέλος του προγράμματος ή να αφαιρέσουμε γεγονότα ή κανόνες (δυναμικά) στο πρόγραμμα της prolog – retract/1 : διαγράφει το πρώτο γεγονός/κανόνα που ταιριάζει με το όρισμα του – retractall/1 : διαγράφει όλα τα γεγονότα/κανόνες που ταιριάζουν με το όρισμα του
Παραδείγματα asserta(test(a)). – προσθέτει στην αρχή του προγράμματος το γεγονός test(a). assertz(test1(X):-test2(X)). – προσθέτει στο τέλος του προγράμματος τον κανόνα test1(X):-test2(X). retract(test(a)). – αφαιρεί το γεγονός test(a). retractall(test(X)). – αφαιρεί όλα τα γεγονότα που ταιριάζουν με το test(X) (π.χ. test(a), test(b), test(c), … κλπ)
Εισαγωγή στην αναδρομή Αναδρομή: η διαδικασία κλήσης ενός κανόνα από τον εαυτό του. Οι κανόνες που χρησιμοποιούν αναδρομή ονομάζονται αναδρομικοί, ενώ αυτοί που δεν χρησιμοποιούν μη αναδρομικοί. Συχνά χρειάζεται να επαναλάβουμε κάποια λειτουργία, είτε μέχρι να εξαντληθούν κάποια γεγονότα, είτε μέχρι να φτάσουμε σε συγκεκριμένη κατάσταση. Στη Prolog αυτό γίνεται με αναδρομικούς κανόνες (recursion). Ένας κανόνας καλεί τον εαυτό του μέχρι να ικανοποιηθεί κάποια συνθήκη (συνθήκη τερματισμού), η συνθήκη αυτή συνήθως βρίσκεται πριν τον αναδρομικό κανόνα.
Παράδειγμα edge(a,b).path(X,Y):- edge(X,Y).
Παράδειγμα edge(a,b). edge(b,c). path(X,Y):- edge(X,Y). path(X,Y):- edge(X,Z),edge(Z,Y).
Παράδειγμα edge(a,b) edge(b,c). edge(c,d). path(X,Y):- edge(X,Y). path(X,Y):- edge(X,Z),edge(Z,Y). path(X,Y):- edge(X,Z1),edge(Z1,Z2),edge(Z2,Y).
Παράδειγμα edge(a,b) edge(b,c). edge(c,d). … path(X,Y):- edge(X,Y). path(X,Y):- edge(X,Z),edge(Z,Y). path(X,Y):- edge(X,Z1),edge(Z1,Z2),edge(Z2,Y). …
Παράδειγμα edge(a,b) edge(b,c). edge(c,d). … path(X,Y):- edge(X,Y). path(X,Y):- edge(X,Z), edge(Z,Y). path(X,Y):- edge(X,Z1), edge(Z1,Z2), edge(Z2,Y). …
Εύρεση διαδρομής (απλή περίπτωση) hasDoor(a,c). hasDoor(a,b). hasDoor(c,d). hasDoor(b,d). hasDoor(c,g). hasDoor(d,f). hasDoor(f,i). hasDoor(d,h). hasDoor(b,e). hasDoor(e,h). canGoTo(X,Y):- hasDoor(X,Y). canGoTo(X,Y):- hasDoor(X,Z),canGoTo(Z,Y).
Παράδειγμα at(rome). at(Place):- move(Place,Method,NewPlace), write('from '), write(Place),write(' take '), write(Method), write(' to '), write(NewPlace), nl, at(NewPlace). move(airport,plane,rome). move(home,taxi,metro). move(home,taxi,bus_station). move(metro,train,airport). travel.pl
Παράδειγμα μετρητή με αναδρομή counter(0). counter(X):- X>0, write(X),nl,X1 is X-1, counter(X1). counter(X):- X<0, write(X),nl,X1 is X+1, counter(X1). counter.pl
Υπολογισμός παραγοντικού factorial(0,1). factorial(X,Y):- X>0, X1 is X-1, factorial(X1,N), Y = X*N. Ερώτηση: ?- factorial(3,N). N = 3 * (2 * (1 * 1)) factorial.pl