Prolog Επεξεργασία και Αναπαράσταση Γνώσης ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολογίας Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο: Τεχνητή Νοημοσύνη
Αναδρομή Με τον όρο αναδρομή εννοούμε τη δυνατότητα ένας κανόνας να περιέχει στο σώμα του μια κλήση προς τον εαυτό του. Οι κανόνες που χρησιμοποιούν αναδρομή ονομάζονται αναδρομικοί, ενώ αυτοί που δεν χρησιμοποιούν μη αναδρομικοί. Είναι ο μόνος τρόπος δημιουργίας μιας δομής επανάληψης
Παράδειγμα Αναδρομής (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), ο οποίος να αληθεύει αν ο Χ είναι πρόγονος του Υ.
Παράδειγμα Αναδρομής (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
Παράδειγμα Αναδρομής (3/3) Λύση με αναδρομικούς κανόνες: predecessor(X,Z):- parent(X,Z). predecessor(X,Z):- parent(X,Y),predecessor(Y,Z). Παρατήρηση: Όταν ένα κατηγόρημα ορίζεται αναδρομικά, εμφανίζεται πάντα με τουλάχιστον δύο κανόνες. Ο πρώτος συνήθως δεν περιέχει αναδρομική κλήση, λειτουργώντας σαν τερματική συνθήκη.
Παραγοντικό 0! = 1 N! = N * (N-1)! factorial(0,1). factorial(N,F) :- N>0, N1 is N-1, factorial(N1,F1), F is N * F1.
Η αναδρομή στις δυνάμεις a^0 = 1 a^n = a * a^(n-1) raise(B, 0, 1). raise(B, E, Y) :- E1 is E - 1, raise(B, E1, Y1), Y is B*Y1.
H αναδρομή στον αριθμό Fibonacci fib(N, Y) :- N >2, N2 is N – 2, fib(N2, Y2), N1 is N – 1, fib(N1, Y1), Y is Y1 + Y2. fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(N) = fibonacci(N-1) + fibonacci(N-2)