ΤΕΧΝΗΤΗ ΝΟΗΜΟΣΥΝΗ ΚΑΙ ΕΥΦΥΗ ΣΥΣΤΗΜΑΤΑ Άνοιξη 2011 ΕΡΓΑΣΙΑ 1 η Άςκηςη 1 η : Βάςη δεδομζνων ταινιών Σαρ δίνεηαι ηο απσείο movies.ecl, ηο οποίο πεπιέσει μια βάζη δεδομένυν με ηαινίερ ζηη μοπθή: % movie(m,y) <- Η ηαινία M κςκλοθόπηζε ηο έηορ Y movie(american_beauty, 1999). % director(m,d) <- Η ηαινία M ζκηνοθεηήθηκε από ηον ζκηνοθέηη D director(american_beauty, sam_mendes). % actor(m,a,r) <- Ο ηθοποιόρ A έπαιξε ηο πόλο R ζηην ηαινία M actor(american_beauty, kevin_spacey, lester_burnham). % actress(m,a,r) <- Η ηθοποιόρ A έπαιξε ηο πόλο R ζηην ηαινία M actress(american_beauty, annette_bening, carolyn_burnham). α) Γπάτηε επυηήμαηα ζηην Prolog για να απανηήζεηε ζηιρ παπακάηυ επυηήζειρ: % Ποια σπονιά κςκλοθόπηζε η ηαινία American Beauty ; % Βπείηε μια ηαινία πος κςκλοθόπηζε ηο 2000. % Βπείηε μια ηαινία πος κςκλοθόπηζε ππιν ηο 2000. % Βπείηε ηο όνομα και ηη σπονιά μιαρ ηαινίαρ. % Βπείηε έναν ηθοποιό πος εμθανίζηηκε ζε πεπιζζόηεπερ από μία ηαινίερ. % Βπείηε έναν ζκηνοθέηη πος ζκηνοθέηηζε μια ηαινία όπος έπαιξε η ηθοποιόρ Scarlett Johansson. % Βπείηε έναν/μία ηθοποιό πος ζκηνοθέηηζε επίζηρ μια ηαινία. β) Γπάτηε έναν οπιζμό ζηην Prolog για κάθε ένα από ηα παπακάηυ καηηγοπήμαηα: % released_since(m,y) <- Η ηαινία M κςκλοθόπηζε μεηά ηο έηορ X % released_between(m,y1,y2) <- Η ηαινία M κςκλοθόπηζε μεηαξύ ηων εηών X και Y (ζςμπεπιλαμβανομένων) % same_year_as(m1,m2) <- Οι ηαινίερ M1 και M2 κςκλοθόπηζαν ηο ίδιο έηορ. % newer(m1,m2) <- Η ηαινία M1 κςκλοθόπηζε μεηά ηην ηαινία M2. 1
% cast_member(a,m) <- Το ππόζωπο A ήηαν έναρ/μία ηθοποιόρ ζηην ηαινία M % directed_by(x,y) <- Το ππόζωπο X ζςμμεηείσε ζε ηαινία πος ζκηνοθέηηζε ο Y Ελέγξηε ηα καηηγοπήμαηά ζαρ ςποβάλλονηαρ διάθοπα επυηήμαηα. γ) Ποια η διαθοπά μεηαξύ ηυν παπακάηυ επυηήζευν;?- actor(m1,d,_),actor(m2,d,_).?- actor(m1,d,_),actor(m2,d,_),m1\=m2.?- actor(m1,d,_),actor(m2,d,_),m1@<m2. δ) Γιαηί οι παπακάηυ επυηήζειρ επιζηπέθοςν ηιρ ίδιερ απανηήζειρ πολλέρ θοπέρ;?- director(_,d),actor(_,d,_).?- director(_,d),actress(_,d,_). Άςκηςη 2 η : Κατηγορήματα επεξεργαςίασ λιςτών τθν άςκθςθ αυτι καλείςτε να τροποποιιςετε τθ ςυμπεριφορά κάποιων πρότυπων κατθγορθμάτων επεξεργαςίασ λιςτϊν. ιγουρευτείτε πρϊτα ότι καταλαβαίνετε τθ λειτουργία των πρότυπων κατθγορθμάτων. Προςπακείςτε να κάνετε τισ ελάχιςτεσ αλλαγζσ για να πετφχετε τθ νζα λειτουργικότθτα. Σο επόμενο κατθγόρθμα ελζγχει τθ ςυμπερίλθψθ ςε λίςτα: % element(x,ys) <- Το X είναι ζηοισείο ηηρ λίζηαρ Ys element(x,[x Ys]). element(x,[_ Ys]):- element(x,ys). 1. Επεκτείνετε το κατθγόρθμα με ζνα τρίτο όριςμα το οποίο να περιζχει τθ λίςτα Ys χωρίσ το ςτοιχείο Χ. 2. τθ ςυνζχεια, προςαρμόςτε το κατθγόρθμα ζτςι ϊςτε να πετυχαίνει ακόμθ και αν το Χ δεν ανικει ςτθ λίςτα, οπότε και κα επιςτρζφει ςτο τρίτο όριςμα τθ λίςτα Ys. 3. Σζλοσ, προςαρμόςτε το κατθγόρθμα ζτςι ϊςτε να διαγράφει όλεσ τισ εμφανίςεισ του X. Σο επόμενο κατθγόρθμα ελζγχει για υποςφνολα: % subset(xs,ys) <- Κάθε ζηοισείο ηηρ λίζηαρ Xs εμθανίζεηαι και ζηη λίζηα Ys subset([],_). subset([x Xs],Ys):- element(x,ys), subset(xs,ys). 1. Σροποποιείςτε το κατθγόρθμα ζτςι ϊςτε να πετυχαίνει μόνο όταν θ λίςτα Xs είναι γνιςιο υποςφνολο τθσ λίςτασ Ys. 2. Σροποποιείςτε το κατθγόρθμα ζτςι ϊςτε να πετυχαίνει μόνο όταν κάκε ςτοιχείο τθσ λίςτασ Xs εμφανίηεται με τθν ίδια ακριβϊσ ςειρά (όχι όμωσ απαραίτθτα ςυνεχόμενα) ςτθ λίςτα Ys. Τπόδειξθ: Μθν χρθςιμοποιιςετε το element/2. 2
Σα επόμενα δφο κατθγοριματα ελζγχουν (και τα δφο) για μια υπο-ακολουκία (μια ςυνεχόμενθ ςειρά ςτοιχείων): % subseq1(xs,ys) <- Τα ζηοισεία ηηρ λίζηαρ Xs εμθανίζονηαι με ηην ίδια ζειπά και ζςνεσόμενα ζηη λίζηα Ys subseq1(b,abc) :- append(_,bc,abc), append(b,_,bc). % subseq2(xs,ys) <- Τα ζηοισεία ηηρ λίζηαρ Xs εμθανίζονηαι με ηην ίδια ζειπά και ζςνεσόμενα ζηη λίζηα Ys subseq2(xs,ys):- append(xs,_,ys). subseq2(xs,[_ Ys]):- subseq2(xs,ys). 1. Και τα δφο κατθγοριματα πετυχαίνουν πολλζσ φορζσ επιςτρζφοντασ τθν κενι λίςτα ςε ερωτιςεισ τθσ μορφισ subseq(xs,[1,2,3,4]). Διορκϊςτε το ϊςτε να μθν ςυμβαίνει. Άσκηση 3 η : Ταίριασμα προτύπων (pattern matching) Σο ταίριαςμα προτφπων χρθςιμοποιείται ςχεδόν ςε κάκε οριςμό κατθγοριματοσ για να διακρίνει μεταξφ διαφορετικϊν περιπτϊςεων, ςυνικωσ μεταξφ τθσ ςυνκικθσ τερματιςμοφ και τθσ αναδρομικισ κλιςθσ. Ζςτω οι παρακάτω κανόνεσ για ςυμβολικι παραγϊγιςθ (τα U και V είναι μακθματικζσ εκφράςεισ, το x είναι μια μεταβλθτι): dx/dx = 1 d(-u)/dx = -(du/dx) d(u+v)/dx = du/dx + dv/dx d(u-v)/dx = du/dx - dv/dx d(u*v)/dx = U*(dV/dx) + V*(dU/dx) Αυτοί οι κανόνεσ μποροφν να μεταφραςτοφν ςτθν Prolog, για παράδειγμα, ο τρίτοσ κανόνασ μπορεί να περιγραφεί ωσ εξισ: diff(plus(u,v),x,plus(ru,rv)):-diff(u,x,ru),diff(v,x,rv). Περιγράψτε με αντίςτοιχο τρόπο τουσ υπόλοιπουσ κανόνεσ. Δοκιμάςτε ερωτιςεισ τθσ μορφισ:?- diff(plus(times(x,x),x),x,result). Result = plus(plus(times(x, 1), times(x, 1)), 1) Προσοχή: Η Prolog ζχει ενςωματωμζνα ςυναρτθςιακά ςφμβολα όπωσ τα +, - και * που μποροφν να χρθςιμοποιθκοφν είτε ςε ζνκετθ (infix) ι ςε προκεματικι (prefix) ςθμειογραφία, ζτςι θ δοκείςα πρόταςθ Prolog μπορεί επίςθσ να γραφεί ωσ: diff(u+v,x,ru+rv):-diff(u,x,ru),diff(v,x,rv). 3
Να κυμάςτε ωςτόςο ότι ςφνκετοι όροι όπωσ ο U+V εξακολουκοφν να αντιμετωπίηονται από τθν Prolog ωσ δζνδρα με το ςυναρτθςιακό ςφμβολο ςτθ ρίηα, ενϊ θ αποτίμθςθ τζτοιων ςφνκετων όρων απαιτεί επιπλζον επεξεργαςία (δείτε επόμενεσ ερωτιςεισ). Γράψτε ζνα κατθγόρθμα που απλοποιεί μακθματικζσ εκφράςεισ όπωσ: U*1 = U U+0 = U U+U = 2*U U-U = 0 Τπόδειξθ: Πολλοί από τουσ κανόνεσ που κα γράψετε πρζπει να είναι αναδρομικοί. Φροντίςτε να υπάρχει πάντα ζνασ μθ αναδρομικόσ κανόνασ που να λειτουργεί ωσ ςυνκικθ τερματιςμοφ και κα αφινει τθν ζκφραςθ ανζγγιχτθ. Εδώ θαίνεηαι ένα παπάδειγμα επώηηζηρ:?- simp(plus(plus(times(x,1),times(x,1)),1),result). Result = plus(times(2, x), 1) θμείωςθ: Πολλζσ φορζσ μπορεί να παίρνετε μια ποικιλία απαντιςεων, μεταξφ των οποίων και τθν επικυμθτι. Αυτό ςυμβαίνει γιατί οι κανόνεσ ςασ δεν είναι αμοιβαία αποκλειόμενοι, ζτςι ςτθν ίδια αρχικι ζκφραςθ μποροφν να εφαρμοςτοφν πολλζσ διαφορετικζσ ακολουκίεσ τροποποιιςεων. Άσκηση 4 η : Ερεσνητικές εργασίες και αναυορές Μια ερευνθτικι εργαςία ζχει τίτλο, ζναν ι περιςςότερουσ ςυγγραφείσ (με ςυγκεκριμζνθ ςειρά) και ζχει δθμοςιευτεί ςε κάποιο περιοδικό ι ςυνζδριο. Μπορείτε να πάρετε μια ιδζα για τζτοιεσ εργαςίεσ από το Google Scholar. Μια εργαςία μπορεί να αναφζρει άλλεσ εργαςίεσ. Μια αναφορά από τθν εργαςία Α προσ τθν εργαςία Β ονομάηεται ετεροαναφορά, αν οι δφο εργαςίεσ δεν ζχουν κανζναν κοινό ςυγγραφζα, ειδάλλωσ ονομάηεται αυτοαναφορά (self-citation). ασ ηθτείται να καταςκευάςετε μια βάςθ δεδομζνων ςε Prolog, θ οποία να ζχει όλθ τθν πλθροφορία που αφορά ερευνθτικζσ εργαςίεσ (μπορείτε να γεμίςετε τθν βάςθ δεδομζνων ςασ με εικονικά ςτοιχεία). τθ ςυνζχεια, γράψτε κατθγοριματα τα οποία κα ςασ βοθκιςουν να απαντιςετε ςτισ παρακάτω ερωτιςεισ: I. Για δεδομζνο ερευνθτι βρείτε όλεσ τισ εργαςίεσ αυτοφ και το πλικοσ των ετεροαναφορϊν και αυτοαναφορϊν κάκε εργαςίασ του. II. Για δεδομζνο ερευνθτι βρείτε το ςυνολικό πλικοσ των ετεροαναφορϊν του (από όλεσ τισ εργαςίεσ του). 4
III. Βρείτε όλα τα ηεφγθ ερευνθτϊν που εμφανίηονται ωσ ςυγγραφείσ ςε κοινι εργαςία. Κάκε ηεφγοσ ερευνθτϊν πρζπει να επιςτρζφεται μία μόνο φορά. Με αυτό τον τρόπο ουςιαςτικά ορίηετε ζναν γράφο με κορυφζσ τουσ ερευνθτζσ και ακμζσ που να υποδθλϊνουν ποιοι ερευνθτζσ ζχουν ςυνεργαςτεί ζςτω και μία φορά ςτθ ςυγγραφι ερευνθτικισ εργαςίασ (με κατάλλθλα εργαλεία, όπωσ το GraphViz, αυτόσ ο γράφοσ μπορεί να οπτικοποιθκεί). Τπόδειξθ: Κοιτάξτε τα κατθγοριματα findall, setof και bagof τθσ Prolog. IV. Βρείτε όλα τα ηεφγθ ερευνθτϊν, μεταξφ των οποίων υπάρχει ετεροαναφορά. Κάκε ηεφγοσ ερευνθτϊν (Α,Β) πρζπει να επιςτρζφεται μία μόνο φορά, όπου ο Α αναφζρει ςε κάποια εργαςία του τον Β. Προςοχι, ςτθν περίπτωςθ αυτι το ηεφγοσ (Α,Β) είναι διαφορετικό από το ηεφγοσ (Β,Α). Και πάλι με αυτό τον τρόπο ορίηετε ζναν γράφο με κορυφζσ τουσ ερευνθτζσ και κατευκυνόμενεσ ακμζσ που να υποδθλϊνουν ποιοι ερευνθτζσ ζχουν αναφερκεί ο ζνασ ςτον άλλο. Τπόδειξθ: Κοιτάξτε τα κατθγοριματα findall, setof και bagof τθσ Prolog. 5