KANONIKH ΕΞΕΤΑΣΗ ΦΕΒΡΟΥΑΡΙΟΣ 1999 ΘΕΜΑ 3 [20] - PROLOG Έστω ότι έχουµε τις τιµές διαφόρων προϊόντων εκφρασµένες µε το κατηγόρηµα price(item,price) όπως φαίνεται και στα παρακάτω παραδείγµατα: price(bmw316_car,1240). price(sail_boat,1580). price(bear,850). Ορίστε επίσης το κατηγόρηµα q(list) το οποίο να αληθεύει όταν στην λίστα List υπάρχει ένα προϊόν το οποίο στοιχίζει περισσότερο απ όλα τα υπόλοιπα προϊόντα µαζί. Το κατηγόρηµα δεν πρέπει να αληθεύει αν η λίστα List περιέχει λιγότερο από τρία στοιχεία.
Λύση Φεβρουάριου 1999 value([],0). value([h T],Sum):- price(h,price), value(t,tsum), Sum is Tsum + Price. q([s1,s2,s3 T]):- value([s1,s2,s3 T],Sum), member(x,[s1,s2,s3 T]), price(x,price), Dif is Sum - Price, Price >= Dif.
ΚΑΝΟΝΙΚΗ ΕΞΕΤΑΣΗ ΦΕΒΡΟΥΑΡΙΟΥ 1998 ΘΕΜΑ 3 [20] - PROLOG Ορίστε το κατηγόρηµα value(list, Price) το οποίο να αληθεύει όταν το Price είναι ένας αριθµός που αποτελεί την αξία της λίστας List. Η κάθε λίστα List είναι µια διάταξη από τα άτοµα x και y. Το µήκος της είναι άγνωστο και η αξία της είναι ο αριθµός των x που βρίσκονται ακριβώς πριν από κάποιο y. Για παράδειγµα η λίστα [x, y, x, x, x, x, y] έχει αξία 2 και η λίστα [ y, y, y, x, x, y, y, x, y, x, y, x] έχει αξία 3.
Λύση Φεβρουαρίου 1998 value([],0). value([x,y T],P):-!,value(T,P2), P is P2 + 1. Value([_ T],P):- value(t,p).
ΕΠΑΝΑΛΗΠΤΙΚΗ ΕΞΕΤΑΣΗ - ΣΕΠΤΕΜΒΡΙΟΣ 1996 ΘΕΜΑ 5 -PROLOG ώστε έναν ορισµό του κατηγορήµατος double_list(list, Double_list). Το κατηγόρηµα αυτό πρέπει να αληθεύει όταν το Double_list είναι µια λίστα τα στοιχεία της οποίας είναι ακριβώς δυο φορές τα στοιχεία της λίστας List. Τα στοιχεία πρέπει να εµφανίζονται µε την ίδια σειρά και τα όµοια πρέπει να είναι το ένα δίπλα στο άλλο όπως φαίνεται στα παρακάτω παραδείγµατα :?- double_list([a,b,c], [a,a,b,b,c,c]). yes?- double_list([a,b,c],x). X=[a,a,b,b,c,c] yes?- double_list(x,[a,a,a,a,test,test,23,23]). X=[a,a,test,23] yes
Λύση Σεπτεµβρίου 1996 double_list([x],[x,x]). double_list([x T],[X,X T2]):- double_list(t,t2).
Άσκηση 1.1 1. ΟΓιάννης, ο Φώτης και ο Χάρης είναι άνδρες. 2. ΗΜαρία, ηγιάννα, η Ειρήνη και η Άννα είναι γυναίκες. 3. Ο Γιάννης είναι ξανθός, ο Φώτης και ο Χάρης µελαχρινός. 4. H Γιάννα και η Ειρήνη είναι ξανθές, ενώ η Μαρία και η Άννα είναι µελαχρινές. 5. Φώτης και η Γιάννα έχουν χρυσάφι. 6. Πλούσιος είναι όποιος έχει χρυσάφι. 7. Στους άνδρες αρέσουν µόνο οι γυναίκες και στις γυναίκες µόνο οι άντρες. 8. Στον Γιάννη και στον Χάρη αρέσουν οι πλούσιοι (άντρες και γυναίκες). 9. Στον Γιάννη αρέσουν και οι ξανθές ενώ στον Φώτη αρέσουν οι µελαχρινές. 10. Στην Μαρία και στην Γιάννα αρέσουν οι µελαχρινοί (άντρες και γυναίκες). 11. Στην Γιάννα αρέσουν και οι πλούσιοι (άντρες και γυναίκες). 12. Η Άννα έχει σπίτι και ο Γιάννης έχει αυτοκίνητο.
Λύση άσκησης 1.1 /* 1 */ male(yannis). male(fotis). male(haris). /* 2 */ female(maria). female(yanna). female(eirini). female(anna). /* 3 */ blonde(yannis). dark(fotis). dark(haris). /* 4 */ blonde(yanna). blonde(eirini). brunette(maria). brunette(anna). /* 5 */ owns(fotis,gold). owns(yanna,gold). /* 6 */ rich(x):- owns(x,gold). /* 7 */ likes(x,y):- maylike(x,y),doeslike(x,y). maylike(x,y):-male(x),female(y). maylike(x,y):-female(x),male(y). /* 8 */ doeslike(yannis,y):- rich(y). doeslike(haris,y):-rich(y). /* 9 */ doeslike(yannis,y):- blonde(y),female(y). doeslike(fotis,y):- brunette(y),female(y).
Λύση άσκησης 1.1 /* 10 */ doeslike(maria,y):-brunette(y). doeslike(maria,y):-dark(y). doeslike(yanna,y):-brunette(y) doeslike(yanna,y):-dark(y). Ερωτήσεις:?-setof(X,male(X),R).?-setof(X,likes(yannis,X),R). /* 11 */ doeslike(yanna,y):-rich(y). /* 12 */ owns(yannis,car). owns(anna,house).?-setof(x,likes(maria,x),r).?-likes(yanna,_).?-likes(x,y),likes(y,x).
Άσκηση 1.2 ώστε τα παρακάτω κατηγορήµατα διαχείρισης λιστών: α) first_two(l): επιστρέφει TRUE αν τα 2 πρώτα στοιχεία της λίστας L είναι ίδια. β) nested_member(e,l): επιστρέφει TRUE αν το Ε περιέχεται στην L(η L θα µπορεί να είναι και λίστα λιστών). γ) remove(e,l,r): επιστρέφει την λίστα R, που είναι η λίστα L χωρίς όµως το στοιχείο E όσες φορές και αν εµφανίζεται. Αν η λίστα L είναι λίστα λιστών, τότε το κατηγόρηµα αφαιρεί το στοιχείο Ε µόνο για το πρώτο επίπεδο.
Λύση άσκησης 1.2 α) first_two([x,x _]). β) nested_member(h,[h _]). nested_member(h,[h1 _]):-is_list(h1),nested_member(h,h1). nested_member(h,[_ T]):-nested_member(H,T). γ) remove(_,[],[]). remove(h,[h T],T1):-remove(H,T,T1). remove(h,[h1 T],[H1 T1]):- H\=H1, remove(h,t,t1)