תכנות לוגי, התשע``ד, סמסטר ב, מועד ב.pdf

‫מבחן בתכנות לוגי (פרולוג)‬
‫ד"ר נועם חזון‬
‫סמסטר ב'‪ ,‬מועד ב'‪ ,‬תשע"ד‬
‫זמן הבחינה‪ 150 :‬דקות‬
‫מותר להשתמש רק בדפי הנוסחאות המצורפים‬
‫נא לכתוב בכתב ברור‬
‫שאלה ‪1‬‬
‫כתבו את הפרדיקט ‪ add_up_list/2‬שמקבל רשימה של מספרים שלמים‪ ,‬ומחזיר רשימה בה האיבר‬
‫במקום ה‪ i -‬הוא סכום כל האיברים עד המקום ה‪ i -‬ברשימה המקורית‪ .‬דוגמת ריצה‪:‬‬
‫‪?- add_up_list([3,4,7,1,1],X).‬‬
‫‪X = [3,7,14,15,16].‬‬
‫‪?- add_up_list([1,2,3,-2,0],X).‬‬
‫‪X= [1,3,6,4,4].‬‬
‫)]‪?- add_up_list([3,3,3],[3,6,9‬‬
‫‪true.‬‬
‫שאלה ‪2‬‬
‫כתבו את הפרדיקט ‪ complete/2‬שמקבל רשימה ומספר שלם‪ ,‬ומחזיר ‪ true‬אם הרשימה מכילה את כל‬
‫המספרים מ‪ 0-‬עד המספר שניתן כקלט‪ .‬הרשימה לא תהיה מסודרת בסדר מסוים‪ .‬דוגמת ריצה‪:‬‬
‫‪?- complete([0,3,5,2,1,4],3).‬‬
‫‪true.‬‬
‫‪?- complete([6,1,2,0,4,5,6],6).‬‬
‫‪false.‬‬
‫שאלה ‪3‬‬
‫א‪ .‬מה תהיה התשובה של פרולוג לשאילתא‪:‬‬
‫‪?- X=5, X is X+1, Y is X+2.‬‬
‫ב‪ .‬מה תהיה התשובה של פרולוג לשאילתא‪:‬‬
‫‪?- member(X,[1,2,3]),assert(mia(X)),member(X,[3,2,1]),write(X),fail.‬‬
‫ג‪ .‬נתונה התוכנית הבאה‪:‬‬
‫‪prog([],[]).‬‬
‫‪prog([X],[X]).‬‬
‫‪prog([F,_|T], [F|T1]):- prog(T, T1).‬‬
‫מה תהיה התשובה של פרולוג לשאילתא‪:‬‬
‫‪?- prog([1,2,3,4,5],R).‬‬
‫ד‪ .‬מה תהיה התשובה של פרולוג לשאילתא‪:‬‬
‫‪?- \+ (member(X, [0,1,2])), X=3, !.‬‬
‫ה‪ .‬מה תהיה התשובה של פרולוג לשאילתא‪:‬‬
‫‪?- [1,2|3] = [X|Y].‬‬
‫שאלה ‪4‬‬
‫לפניכם מאגר מידע שמאכסן מידע על הקניות של מספר אנשים‪ .‬כל קונה מוגדר ע"י שמו הפרטי‪,‬‬
‫התקציב שלו‪ ,‬ורשימת המוצרים אותם קנה‪ .‬ברשימת המוצרים של כל אחד מהאנשים נשמרים שם‬
‫המוצר והכמות בה הוא נקנה‪ .‬בנוסף‪ ,‬מאגר המידע מאכסן ברשימה נפרדת את המחיר עבור כל מוצר‪.‬‬
‫הוגדר גם פרדיקט עזר בשם ‪.sum/2‬‬
‫‪buyer(shira,100,[amount(rice,2),amount(sugar,5)]).‬‬
‫‪buyer(yoram,200,[amount(flour,10),amount(sugar,4)]).‬‬
‫‪buyer(yosef,50,[amount(bread,2)]).‬‬
‫‪buyer(anat,100,[amount(creamcheese,3),amount(milk,4),amount(bread,5)]).‬‬
‫‪buyer(guy,120,‬‬
‫‪[amount(sugar,6),amount(rice,4),amount(flour,5),amount(bread,4),amount(creamcheese,3)]).‬‬
‫‪price(sugar,5).‬‬
‫‪price(rice,10).‬‬
‫‪price(flour,5).‬‬
‫‪price(bread,7).‬‬
‫‪price(milk,6).‬‬
‫‪price(creamcheese,15).‬‬
‫‪sum(Name,Sum):-buyer(Name,_,List),sumList(List,Sum,0).‬‬
‫‪sumList([],Acc,Acc):-!.‬‬
‫‪sumList([H|T],Sum,Acc):-H=amount(Name,A),price(Name,Price),AccN is A*Price+Acc,‬‬
‫‪sumList(T,Sum,AccN).‬‬
‫א‪.‬‬
‫ב‪.‬‬
‫ג‪.‬‬
‫ד‪.‬‬
‫ה‪.‬‬
‫כתבו שאילתא שתחזיר את השמות של כל מי שקנה יותר מ‪ 4-‬יחידות של סוכר‪ .‬יש להחזיר את‬
‫כל השמות ברשימה אחת‪.‬‬
‫מה תהיה תוצאת הרצת השאילתא מסעיף א' על מאגר המידע הנתון?‬
‫מה עושה פרדיקט העזר ‪?sum‬‬
‫כתבו שאילתא שתחזיר את השמות של כל האנשים שקנו בסכום גבוה יותר מסכום התקציב‬
‫שלהם‪ .‬יש להחזיר את כל השמות ברשימה אחת‪.‬‬
‫כתבו שאילתא שתחזיר את השמות של כל האנשים שקנו מוצר אחד בלבד ואת שם המוצר‪ .‬אין‬
‫להשתמש בפרדיקט ‪ .length‬יש להחזיר את כל הנתונים ברשימה אחת‪ ,‬ולהפריד בין שם האדם‬
‫ושם המוצר באמצעות נקודתיים (לדוגמה‪ ,‬במאגר המידע הנתון התשובה צריכה להיות‬
‫]‪.)[yosef:bread‬‬