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

‫מבחן בתכנות לוגי (פרולוג)‬
‫ד"ר נועם חזון‬
‫סמסטר ב'‪ ,‬מועד א'‪ ,‬תשע"ד‬
‫זמן הבחינה‪ 150 :‬דקות‬
‫מותר להשתמש רק בדפי הנוסחאות המצורפים‬
‫נא לכתוב בכתב ברור‬
‫שאלה ‪1‬‬
‫כתבו את הפרדיקט ‪ findFirst/4‬שמקבל רשימה ו‪ 2 -‬ביטויים‪ ,‬ומחזיר את האינדקס של המקום הראשון‬
‫ברשימה בו מופיעים ‪ 2‬הביטויים אחד אחרי השני‪ .‬במידה ולא קיים מקום כזה ברשימה יש להחזיר ‪.false‬‬
‫האינדקסים ברשימה מתחילים מאפס‪ .‬יש לכתוב רקורסיית זנב‪ .‬דוגמת ריצה‪:‬‬
‫‪?- findFirst([a,3,4,7,d,3,7,3,7],3,7,X).‬‬
‫‪X = 5.‬‬
‫‪?- findFirst([a,a,b,b,a,a,b,a],a,a,X).‬‬
‫‪X= 0.‬‬
‫‪?- findFirst([3,4,5,6,7],3,6,X).‬‬
‫‪false.‬‬
‫שאלה ‪2‬‬
‫כתבו את הפרדיקט ‪ countNums/2‬שמקבל ביטוי מורכב (‪ )complex term‬ומחזיר את מספר הפעמים‬
‫שמופיע מספר כלשהו כארגומנט של הביטוי המורכב‪ .‬דוגמת ריצה‪:‬‬
‫‪?- countNums(term(1,4,t,y,6),R).‬‬
‫‪R = 3.‬‬
‫‪?- countNums(mia(a,t,l,a,s,t),R).‬‬
‫‪R = 0.‬‬
‫שאלה ‪3‬‬
‫א‪ .‬מה תהיה התשובה של פרולוג לשאילתא‪:‬‬
‫‪?- atom_codes(X,[p,u,l,p,f,i,c,t,i,o,n]).‬‬
‫ב‪ .‬מה תהיה התשובה של פרולוג לשאילתא‪:‬‬
‫‪?- findall(1,(*(7,(3+2)) == 7*(+(3,2))),L).‬‬
‫ג‪ .‬נתונה התוכנית הבאה‪:‬‬
‫‪many_lists([],_,[]).‬‬
‫‪many_lists(LS,L2,L1):-member(L1,LS),append(_,L2,L1).‬‬
‫‪ )a‬מה תהיה התשובה הראשונה של פרולוג לשאילתא‪:‬‬
‫‪?- many_lists([[1,2,3,4],[4,3,2,1],[2,3,4],[3,4]],[3,4],L).‬‬
‫‪ )b‬מה תהיה התשובה השניה של פרולוג לאותה שאילתא?‬
‫‪ )c‬אם נשנה את התוכנית ונוסיף ! באופן הבא‪:‬‬
‫‪many_lists([],_,[]).‬‬
‫‪many_lists(LS,L2,L1):-member(L1,LS),!,append(_,L2,L1).‬‬
‫מה תהיה התשובה השניה של פרולוג לאותה שאילתא?‬
‫שאלה ‪4‬‬
‫לפניכם מאגר מידע שמתאר מספר משפחות‪ .‬כל משפחה במאגר מכילה איש‪ ,‬אישה ורשימה של ילדים‪.‬‬
‫כל אדם במאגר מתואר ע"י שם פרטי‪ ,‬שם משפחה‪ ,‬תאריך לידה והעבודה שלו‪ .‬הוגדרו גם פרדיקטים‬
‫לגישה קלה יותר למאגר‪.‬‬
‫(‪family‬‬
‫‪person(tom,fox,date(7,may,1960),work(cnn,15200)),‬‬
‫‪person(ann,fox,date(9,may,1961),unemployed),‬‬
‫‪[person(pat,fox,date(5,may,1983),unemployed),‬‬
‫‪person(jim,fox,date(5,may,1985),unemployed)]).‬‬
‫(‪family‬‬
‫‪person(nom,ros,date(30,may,1976),work(abc,16200)),‬‬
‫‪person(shi,ros,date(22,july,1981),work(cbs,19000)),‬‬
‫‪[person(mat,ros,date(5,aug,2005),unemployed),‬‬
‫‪person(har,ros,date(5,jan,2007),unemployed),‬‬
‫‪person(teh,ros,date(20,aug,2011),unemployed)]).‬‬
‫(‪family‬‬
‫‪person(zvi,ha,date(21,jan,1980),work(cnn,11200)),‬‬
‫‪person(haya,shu,date(19,aug,1979),work(fox,15000)),‬‬
‫‪[person(isi,ha,date(15,aug,1987),unemployed),‬‬
‫‪person(riv,ha,date(3,jan,2011),unemployed)]).‬‬
‫‪husband(X):-family(X,_,_).‬‬
‫‪wife(X):-family(_,X,_).‬‬
‫‪child(X):-family(_,_,Children),member(X,Children).‬‬
‫א‪.‬‬
‫ב‪.‬‬
‫ג‪.‬‬
‫ד‪.‬‬
‫כתבו שאילתא שתחזיר את השמות הפרטיים של כל הילדים שנולדו לפני ‪ .1111‬יש להחזיר את‬
‫כל השמות ברשימה אחת‪.‬‬
‫מה תהיה תוצאת הרצת השאילתא מסעיף א' על מאגר המידע הנתון?‬
‫כתבו שאילתא שתחזיר את מספר הנשים שמרוויחות פחות מ‪.11000 -‬‬
‫כתבו שאילתא שתחזיר את השמות המלאים של כל הנשים שלא עובדות‪ .‬יש להחזיר את כל‬
‫השמות ברשימה אחת‪ .‬יש להפריד בין השם הפרטי לשם המשפחה באמצעות מקף (לדוגמא‪,‬‬
‫אם השם הפרטי הוא ‪ ruti‬ושם המשפחה הוא ‪ ,levi‬יש לכתוב ‪ ruti-levi‬ברשימה)‪.‬‬