PPL Moed A

מסמכים קשורים
סדנת תכנות ב C/C++

מבוא למדעי המחשב

מבוא למדעי המחשב

PowerPoint Presentation

PowerPoint Presentation

מבוא למדעי המחשב

תרגול 1

Slide 1

מבוא למדעי המחשב

תכנות מונחה עצמים א' – תש"ע

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

אוניברסיטת בן גוריון בנגב תאריך המבחן: שקולניק אלכסנדר שם המרצה: מר בשפת JAVA מבוא לתכנות מבחן ב: מס' הקורס : הנדסת תעשיה וניהול מ

Homework Dry 3

PowerPoint Presentation

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

מקביליות

הגשה תוך שבוע בשעת התרגול

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

אוניברסיטת בן גוריון בנגב תאריך המבחן: שם המרצה: מר אלכסנדר שקולניק, בשפת JAVA מבחן ב: מבוא לתכנות מס' הקורס : מיועד לתלמידי : הנד

מבוא לתכנות ב- JAVA תרגול 7

מהוא לתכנות ב- JAVA מעבדה 3

Slide 1

PowerPoint Presentation

שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים ע

מצגת של PowerPoint

תורת החישוביות תרגול הכנה לוגיקה ותורת הקבוצות מה יש כאן? בקורס תורת החישוביות נניח ידע בסיסי בתורת הקבוצות ובלוגיקה, והכרות עם מושגים בסיסיים כמו א"ב

מבוא לתכנות ב- JAVA תרגול 11

אוניברסיטת חיפה החוג למדעי המחשב מבוא למדעי המחשב מועד א' סמסטר ב', תשע"ג, משך המבחן: שעתיים וחצי חומר עזר: אסור הנחיות: וודאו כי יש בידיכם

שאלהIgal : מערכים דו מימדיים רקורסיה:

Slide 1

פייתון

Microsoft Word B

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

מקביליות

מבוא למדעי המחשב - חובלים

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

תרגול מס' 7: תרגילים מתקדמים ברקורסיה

Microsoft PowerPoint - T-10.ppt [Compatibility Mode]

מטלת מנחה (ממ"ן) 11 הקורס: חשבון אינפיניטסימלי II חומר הלימוד למטלה: יחידות 2,1 4 מספר השאלות: 7 משקל המטלה: נקודות סמסטר: ב 2007 מו

תאריך פרסום: תאריך הגשה: מבנה נתונים תרגיל 5 )תיאורטי( מרצה ומתרגל אחראים: צחי רוזן, דינה סבטליצקי נהלי הגשת עבודה: -את העבודה יש לה

PowerPoint Presentation

Microsoft Word - c_SimA_MoedB2005.doc

Microsoft Word - Ass1Bgu2019b_java docx

מקביליות

שאלהIgal : מערכים דו מימדיים רקורסיה:

PowerPoint Presentation

Microsoft PowerPoint - rec3.ppt

Slide 1

דוגמאות שהוצגו בהרצאה 10 בקורס יסודות מערכות פתוחות דוגמה 1 דוגמאות של פונקציות ב- awk שמראות שהעברת פרמטרים של משתנים פשוטים היא by value והעברת פרמט

PowerPoint Presentation

ex1-bash

מבוא לאסמבלי

מתכונת עיצוב 3013

Slide 1

Microsoft Word - ExamA_Final_Solution.docx

Slide 1

סיכום הוראות Touch touchend יקרא לפונקציה כשיסתיים המגע עם הסמארטפון. - touchmove יקרא לפונקציה במהלך תזוזת המגע עם הסמארטפון. touchstart יקרא לפונקצי

Microsoft PowerPoint - rec1.ppt

Slide 1

מבוא למדעי המחשב - חובלים

הטכניון מכון טכנולוגי לישראל הפקולטה למדעי המחשב הוראות הגשה: ההגשה בזוגות. הוסיפו שמות, ת.ז., אי-מייל, תא אליו יש להחזיר את התרגיל ואת תשובותיכם לתרג

Slide 1

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

משימה תכנית המתרגמת קטעי טקסט לשפה אחרת הקלט: קובץ המכיל את קטעי הטקסט וכן את השפה אליה רוצים לתרגם תרגול מס' 4: המתרגם שימוש במחלקות קיימות תכנות מתק

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

1

PowerPoint Presentation

שעור 6

תכנון אלגוריתמים עבודת בית 4: תכנון אלגוריתמים תאריך הגשה: 02: , בצהריים,תא מספר 66 בקומת כניסה של בניין 003 מתרגל אחראי: אורי 0

Tutorial 11

מבוא למדעי המחשב, סמסטר א', תשס"ח תרגול מס' 2

מספר נבחן / תשס"ג סמסטר א' מועד א' תאריך: שעה: 13:00 משך הבחינה: 2.5 שעות בחינה בקורס: מבחנים והערכה א' מרצה: ד"ר אבי אללוף חומר עזר

PowerPoint Presentation

תרגול 1

מבחן בפיתוח מערכות תוכנה בשפת Java ( )

Microsoft PowerPoint - meli-iso.ppt

פקולטה: מחלקה: שם הקורס: קוד הקורס: מדעי הטבע מדעי המחשב ומתמטיקה מתמטיקה בדידה תאריך בחינה: _ 07/07/2015 משך הבחינה: 3 שעות סמ' _ב' מועד

Programming

תרגול מס' 4: המתרגם שימוש במחלקות קיימות מחרוזות, קבצים, וקבלת קלט מהמשתמש

PRESENTATION NAME

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

PowerPoint Presentation

תרגיל 9 מבוא ללוגיקה ותורת הקבוצות, סתיו תשע"ד 1. תהי L השפה בעלת סימן פונקצייה דו מקומי G, סימן פונקציה חד מקומי T, סימן יחס תלת מקומי.c, d וקבועים L

Microsoft PowerPoint - lec10.ppt

שאלהIgal : מערכים דו מימדיים רקורסיה:

תרגול 3 - מערכים

Microsoft PowerPoint - YL-05.ppt

הטכניון מכון טכנולוגי לישראל תורת הקומפילציה , סמסטר חורף תשע"ו מבחן סוף סמסטר מועד א' מרצה אחראי: מתרגלים: ד ר אוהד שחם אבנר אליזרוב

PowerPoint Presentation

2019 שאלות מומלצות לתרגול מס' דיפרנציאביליות של פונקציה סקלרית )המשך(. כלל השרשרת. S = ( x, y, z) z = x + 3y על המשטח מצאו נקודה בה מישור משיק

שקופית 1

תרגיל בית מספר 1#

תמליל:

הנחיות כלליות: )1 )2 )3 )4 )5 )6 )7 תאריך הבחינה: 5.7.2017 שעה: 09:00 שם המרצה: מני אדלר,מיכאל אלחדד, מירה בלבן, ירון גונן, דנה פישמן מבחן בקורס: עקרונות שפות תכנות מס' קורס: 202-1-2001 מיועד לתלמידי: מדעי המחשב והנדסת תוכנה שנה: ב' סמסטר: ב' מועד א' משך הבחינה: 3 שעות חומר עזר: אסור. ההוראות במבחן מנוסחות בלשון זכר, אך מכוונות לנבחנים ולנבחנות כאחד. מבחן הכתוב בעיפרון חלש המקשה על הקריאה, לא יבדק נא לוודא כי בשאלון זה 13 עמודים יש לענות על כל השאלות בגוף המבחן בלבד )בתוך השאלון(. מומלץ לא לחרוג מהמקום המוקצה. מומלץ להשתמש בטיוטא לפני כתיבת התשובה בתוך השאלון. אם אינך יודע את התשובה, ניתן לכתוב "לא יודע" ולקבל 22% מהניקוד על הסעיף/השאלה. הניקוד במבחן הוא כדלהלן: שאלה 1: טיפוסים ופונקציות high-order 25 נק' 26 נק' 22 נק' 12 נק' = = = = שאלה 2: רשימות עצלות שאלה 3: דחיית חישוב ואופרטורים מיוחדים שאלה 4: מודל הסביבות שאלה 5: תכנות לוגי 22 נק' ---------- = ------------------------------------------------------------------------- סה"כ: 125 נק' = בהצלחה!!! 1

52 נק'[ שאלה [ 1 טיפוסים ופונקציות high-order מבנה הנתונים Map ב JavaScript- מממש את הממשק הבא: let m = new Map(); m.has(x): determines whether m contains an entry <x,s(x)> m.set(x, y): adds an entry <x,y> to the map m, or update <x,s(x)> to <x,y> if such an entry exists. m.get(x): returns the value of x in m if it exists. 3 נק'[ א. [ השלם את הטיפוסים של הפונקציות בעזרת אנוטציות ב- TypeScript : Map<T1,T2>: has(key: T1): Boolean; // assuming Map<T1,T2> is mutable set(key: T1, value: T2): void; // assuming Map<T1,T2> is immutable this is also possible: set(key: T1, value: T2): Map<T1,T2>; get(key: T1): T2; const memoize = (fn) => { let cache = new Map(); return (x) => { if (!cache.has(x)) { cache.set(x, fn(x)) return cache.get(x) ב. [ 4 נק'[ התבונן בהגדרה הבאה: const fib = memoize((n:number) : number => { return (n === 0)? 0 : (n === 1)? 1 : fib(n-1) + fib(n-2); ) הסבר מה הפונקציה memoize מחשבת ומה היתרון שהפעלת memoize מעניקה להגדרת :fib 2

memoize is a higher-order function: it receives a function of one parameter and returns a closure of one parameter which remembers a map (x, fn(x)) for all arguments already computed. memoize improves runtime efficiency at the cost of memory consumption. As a result, repeated invocations with the same parameter are computed only once. In the case of fib, without memoize the runtime complexity is T n = T n-1 + T n-2 which is proportional to fib(n) ~ O(1.6 n ). With memoize, the runtime complexity is O(n) since each call to fib(i) is performed only once. Common errors: - Answer both parts of the question (what does memoize do in general and how does its specific application to fib help) - Indicate clearly that memoize constructs a closure which behaves in a specific way memoize itself does not fill the cache the closure that it computes does this. :memoize 2 נק'[ ג. [ השלם את הטיפוסים בהגדרת const memoize : <T1,T2>(fn:(x:T1)=>T2) => ((x:t1)=>t2) = <T1,T2>(fn:(x:T1)=>T2) : ((x:t1)=>t2) => { let cache = new Map<T1,T2>(); return (x:t1) : T2 => { if (!cache.has(x)) { cache.set(x, fn(x)) return cache.get(x) 3 ד. [ 2 נק'[ מגדירים פונקציות higher-order לעבודה מעל maps ב- TypeScript : prop: given a key, return an accessor function for a map that returns the value of this key. propeq: given a key and a value, return a predicate which tests whether a map has an entry <key,value>. const students = [ {name: 'John', age: 23, dob: {year: 1994, month: 10, day: 10, {name: 'Mary', age: 24, dob: {year: 1993, month: 07, day: 28 ]; students.map(prop('age')); ==> [23, 24] students.filter(propeq('name', 'John')); ==> [{name: 'John', age: 23, dob: {year: 1994, month: 10, day: 10] למשל:

const prop : (key:string) => ((map:{) => any) = (key: string) : ((map:{)=> any) => { return (map: {) => map[key]; השלם את הטיפוסים של הפונקציות ואת הקוד של :propeq Common errors: - The function must return a function type const propeq : <T>(key: string, value: T) => ((map:{) => boolean) = <T>(key: string, value: T) => { return (map : {) => map[key] === value; Common errors: - The function must return a function type (map: {) => Boolean - The returned closure must test equality with value. ה. [ 8 נק'[ מרחיבים את הפונקציה prop לפונקציה שיכולה לעבור על מסלול של מפתחות בתוך ערך מסוג.map path: Returns a function that when supplied an object returns the nested property of that object, if it exists. students.map(path(['dob', 'year'])) כתוב את הפונקציה path והגדר עם טיפוסים מלאים. ==> [ 1994, 1993 ] תזכורת: כאשר עובדים על מערך ב,JavaScript- ניתן להשתמש ב: const arr = [1,2,3]; arr[0] // ==> 1 (same as car) arr.length // ==> 3 arr.slice(1) // [2,3] (same as cdr) - returns a new array const path : (keys: string[]) => ((map:{) => any) = (keys: string[]) : ((map:{) => any) => { return (map : {) => keys.reduce( (acc, curr) => acc[curr], map); Alternative solution without reduce: 4

const path : (keys: string[]) => ((map:{) => any) = (keys: string[]) : ((map:{) => any) => { if (keys.length === 0) return (map : {) => map; else return (map:{) => { let key0 = keys[0], rkeys = keys.slice(1); if (map[key0] === undefined) return undefined; else return path(rkeys)(map[key0]); Common errors / Attention points: - The return type must be a function from a map { to any - The return type is NOT a generic type T or an array T[] or a function to T[]. - The function must build a closure (map : {) => - When keys is empty, the function behaves as identity (it is not an error) - The function must traverse the map down (map[key[0]][key[1]].) 5

52 נק'[ שאלה [ 5 רשימות עצלות 3 נק'[ [ ציין, 1..5 [ א. ב. שימוש ברשימות עצלות או הדגם, שני מקרים בהם רצוי להשתמש ברשימות עצלות. הסבר את היתרונות. כאשר יש כמות לא מוגבלת של נתונים, וכאשר יש נתונים לא זמינים או שהגישה אליהם יקרה/סבוכה/לא בטוחה. מהו החיסרון בשימוש ברשימות עצלות? טיפוס נתונים חדש, דומה מאד לרשימות רגילות, דורש הכפלה של כל הפעולות. מקור נוסף לשגיאות טיפוס.. טעויות נפוצות: לא ניתן להגיע בצורה ישירה לאיברים ברשימה )גם ברשימה רגילה אי אפשר(, שימוש מסורבל )יש ממשק, והעבודה דרכו היא כמו רשימות רגילות( 7 נק'[ למערכת ריאקטיבית יש מספר ערוצי קלט שבהם נקלטים אירועים (events) באופן המשכי. על מנת לתחזק את המערכת הוחלט להתממשק עם ערוץ קלט דרך רשימה עצלה, ולתחזק את המערכת כרשימה של רשימות עצלות לכל ערוצי הקלט. לצורך קליטת אירוע מפעילים פונקציה לקריאה מערוץ: (i (read-channel קוראת את האירוע הבא בערוץ i. לצורך הדוגמה, נניח שהאירועים המתקבלים מקריאת הערוצים הם מספרים. (define make-event-feed (lambda (i) (cons-lzl (read-channel i) (lambda () (make-event-feed i))))) > (make-event-feed 1) ; Channel 1: 1, 2 '(1. #<procedure:...>) (define start-reactive-system (lambda (n) (map make-event-feed (enumerate-interval 1 n)))) > (start-reactive-system 3) ; Channel 1: 1, 2 ; Channel 2: 1, 2 ; Channel 3: 100, 200 '((1. #<procedure:...>) (1. #<procedure:...>) (100. #<procedure:...>)) המימוש שלעיל לא מאפשר להבחין, בהינתן ערך של אירוע, באיזה ערוץ האירוע הופיע. תקן את המידול של המערכת הריאקטיבית, כך שליד כל אירוע יצוין מספר הערוץ שבו הוא הופיע: > (start-reactive-system 3) ; Channel 1: 1, 2 6

לצורך התיקון, השתמש בפרוצדורה ; Channel 2: 1, 2 ; Channel 3: 100 '(((1. 1). #<procedure:...>) ((2. 1). #<procedure:...>) ((3. 100). #<procedure:...>)) lzl-map למיפוי על רשימות עצלות: (define start-reactive-system (letrec ((make-channel-event-feed (lambda (i) (lzl-map (lambda (e) (cons i e)) (make-event-feed i))))) (lambda (n) (map make-channel-event-feed (enumerate-interval 1 n)))) ) טעויות נפוצות: o העברה של רשימה רגילה כפרמטר ל lzl-map, במקום רשימה עצלה. o ערך חוזר של רשימה עצלה )במקום רשימה רגילה שכל איבר בה הוא רשימה עצלה( o אי שימוש כלל ב lzl-map )בניגוד להוראות מפורשות שכן להשתמש( ג. [ 2 נק'[ רשימה עצלה יכולה לכלול מספר לא מוגבל )אינסופי( של נתונים. רשימה היא מוגדרת היטב כאשר כל איבר של הרשימה ניתן לשליפה על ידי הפעלת מספר סופי של פעולות: לכל איבר e קיים n כך ש: (nth lzl n) e מעוניינים לזהות, או, למצוא את ההופעה הראשונה של ערך כאירוע בערוץ כלשהו. לצורך זה, הוצע לאסוף את האירועים מכל הערוצים ולהפעיל פרוצדורת סינון lzl-filter על התוצאה. למשל: > (lzl-filter (lambda (x) (= (cdr x) 2)) (lzl-flatten (start-reactive-system 3))) ; Channel 1: 1, 3 ; Channel 2: 1, 2 ; Channel 3: 100, '((2. 2). #<procedure:...>) לצורך זה, נכתבה פרוצדורה bad-lzl-flatten ל"שיטוח" רשימה של רשימות עצלות: ; Type: [List(Lzl) -> Lzl] (define bad-lzl-flatten (lambda (lst) (if (empty? lst) empty-lzl (let ((lz1 (first lst)) 7

(rest-lzs (cdr lst))) (cond ((empty? rest-lzs) lz1) ((empty-lzl? lz1) (bad-lzl-flatten rest-lzs)) (else (cons-lzl (head lz1) (lambda () (bad-lzl-flatten (cons (tail lz1) rest-lzs)))))))))) אבל הפעלתה על הנתונים שלעיל גרמה לולאה אינסופית: > (lzl-filter (lambda (x) (= (cdr x) 2)) (bad-lzl-flatten (start-reactive-system 3))) ; Channel 1: 1, 3, 4, 5, 6 (continue with increasing numbers) ; Channel 2: 1, 2, 3, 4, 5 (continue with increasing numbers) ; Channel 3: 100, 101, 102 (continue with increasing numbers) ERROR: out-of-stack הסבר למה הקריאה ל lzl-filter- לא מסתיימת: הפרוצדורה bad-lzl- flatten יוצרת רשימה עצלה המורכבת קודם כל מכל האירועים בערוץ 1, שמספרם אינו חסום, והאירוע המבוקש, "2", לא הופיע בו. ציין האם הרשימה העצלה הנוצרת על ידי פרוצדורת השיטוח היא מוגדרת היטב. הרשימה אינה מוגדרת היטב מאחר ולא ניתן לשלוף את האירועים בערוצים אחרים. טעות נפוצה מאוד: חזרה על הגדרת המושג "רשימה מוגדרת היטב" ללא הסבר מדוע הרשימה מתאימה להגדרה. 8 ד. [ 11 נק'[ תקן את הפרוצדורה כך שתיצור רשימה עצלה מוגדרת היטב: (define lzl-flatten (lambda (lst) (if (empty? lst) empty-lzl (let ((lz1 (first lst)) (rest-lzs (cdr lst))) (cond ((empty? rest-lzs) lz1) ((empty-lzl? lz1) (lzl-flatten rest-lzs)) (else (cons-lzl (head lz1) (lambda () (lzl-flatten (cons (second lst) (append (cdr rest-lzs) (list (tail lz1)))))))) ))) ))

51 נק'[ דחיית חישוב ואופרטורים מיוחדים שאלה [ 3 א. [ 3 נק'[ דחיית חישוב היא טכניקה חישובית מקובלת. ציין שתי מטרות )הקשרים(, שבהם משתמשים בדחיית חישוב. בניית ערכים מורכבים אינסופיים, מניעת חישוב של ארגומנטים לפרוצדורות טרם שימושם, קריאה מ i/o באופן שאינו,blocking טיפול בלקוח בשרת כאשר יגיע תורו. 3 נק'[ ב. [ ציין והדגם אופני דחיית חישוב בכל אחת מהשפות: Scheme, JavaScript CPS,normal eval 'עטיפת' חישוב ב- lambda,)lambda abstraction( generators ו Promise, callback ג. [ 2 נק'[ ד. מהו ההבדל בין אופרטור מיוחד form) (special לפרוצדורה פרימיטיבית? הסבר והדגם בשפת.Scheme לאופרטור מיוחד יש כלל חישוב מיוחד, כמו חישוב ביטויי,if,define השונה מדרך חישוב פרוצדורות )בפרט, לא כל תתי הביטויים בביטוי יחושבו בהכרח מראש(. פרוצדורה פרימיטיבית היא חלק מהפרימיטיבים של השפה, אך חישובה נעשה באותו אופן כמו שאר פרוצדורות משתמש order( )applicative/normal [ 2 נק'[ ה. תארו את חוק ה חישוב של אופרטור המיוחד OR בשפת.Scheme מדוע האופרטור איננו יכול להיות מוגדר כפרוצדורת משתמש ב- applicative-eval? הסבר והדגם. בחוק החישוב של or מחושבים כל תתי -הביטויים עד אשר מתקבל ערך שאינו.false ערך זה הוא הערך של הביטוי כולו )ערך הביטוי אינו בהכרח t#(. כלומר, לא נדרש לחשב את כל תתי הביטויים. ב applicative-eval יחושבו בכל מקרה כל הפרמטרים / תתי - הביטויים. [ 2 נק'[ אחד הסטודנטים בקורס טען כי אין צורך באופרטור מיוחד, עם חוק חישוב משלו, בשביל פעולה כמו,OR והציע את פרוצדורת המשתמש הבאה: ; Signature: or(val1, val2) (define or (lambda (val1 val2) (if val1 val1 val2))) 9

האם הגדת ה- or )עם פרוצדורת המשתמש( תואמת את סמנטיקת חוק החישוב שתואר בסעיף ד'? נמק והדגם לא. בפרוצדורה זו val1 ו val2 חושבו כבר, מתוקף היותם פרמטרים של פרוצדורה ב applicative-,eval בניגוד לחוק החישוב המיוחד של or שתואר לעיל: - חישוב מיותר של val2 במידה ו val1 אינו false - במידה ויש לחישוב val2 איזשהו side effect התוצאה תהיה אף שונה ו. [ 4 נק'[ הגדירו מחדש את פרוצדורת המשתמש,or כך שתתאים לסמנטיקת חוק החישוב בסעיף ג', תוך שימוש בטכניקה של דחיית חישוב. )אין לשנות את החתימה, אך ניתן לאלץ עם תנאי התחלה את אופי הפרמטרים(: ;Signature: or(arg1,arg2) ;Type: [T1*T2 -> T1 T2 Boolean] ;Pre-condition: arg1 and arg2 evaluate to ; <closure () T1 T2 Boolean> (define or (lambda (arg1 arg2) (let ((arg1-val (arg1))) (if arg1-val arg1-val (arg2))) )) ירדה נקודה לפתרון בו חושב val1 פעמיים. ירדו שתי נקודות להבנה שצריך להפעיל closure עם מימוש שגוי ירדו כל הנקודות לפתרונות ששינו את החתימה, סתם הגדירו lambda expression באופן מוזר, או התמקדו בהחזרת #t/#f OR כאופרטור מיוחד, לעומת פרוצדורת משתמש: 4 נק'[ ז. [ מהם החסרונות והיתרונות של הגדרת אופרטור מיוחד: יתרון: אין תנאי-קדם מסוכן שיכול לגרום טעויות זמן ריצה. חיסרון: ריבוי אופרטורים מיוחדים חיסרון.1 פרוצדורת משתמש: יתרון: אין כלל חישוב מיוחד. אין תלות במימוש מוקדם של האופרטור.2 חיסרון: תנאי-קדם מסוכן שיכול לגרום טעויות זמן ריצה. תנאי אין אפשרות להבחנה משאר ביטויי 10

(define make-pair (lambda (x y) (lambda (sel) (sel x y)))) שאלה [ 4 15 נק'[ מודל הסביבות ניתנות ההגדרות למימוש מבוסס closures של מבנה נתונים :pair (define p1 (make-pair 5 10)) (p1 (lambda (a b) (+ a b))) השלם את דיגרמת הסביבות המתקבל בהרצה של הביטוי: 11

שאלה [ 2 א. [ 2 נק'[ נק'[ תיכנות לוגי לשני המקרים הבאים - חשב את הunifier של שתי הנוסחאות. פרט את צעדי החישוב ואת התוצאה: unify[ t(x,f(a),x), t(g(u),u,w) ] 1. s={,a = t(x,f(a),x), B = t(g(u),u,w) 2. s={x=g(u), A s= t(g(u),f(a), g(u)) B s= t(g(u),u,w) 3. s={x=g(f(a)), U=f(a), A s= t(g(f(a)),f(a), g(f(a))) B s= t(g(f(a)), f(a),w) 4. s={x=g(f(a)), U=f(a), W= g(f(a), A s= t(g(f(a)),f(a), g(f(a))) B s= t(g(f(a)), f(a), g(f(a)) unify[ t(x,f(x),x), t(g(u),u,w) ] 1. s={,a = t(x,f(x),x), B = t(g(u),u,w) 2. s={ X=g(U),A = t(g(u),f(g(u)), g(u)), B = t(g(u),u,w) 3. s={ X=g(U), U=f(g(U)) OCCUR CHECK FAIL! ב. [ 8 נק'[ ניתנות הפרוצדורות הבאות המגדירות את קידוד מספרים טיבעיים בתיכנות לוגית: % Signature: natural_number(n)/1 % Purpose: N is a natural number. natural_number(0). natural_number(s(x)) :- natural_number(x). % N1 % N2 % Signature: Plus(X,Y,Z)/3 % Purpose: Z is the sum of X and Y. plus(x, 0, X) :- natural_number(x). plus(x, s(y), s(z)) :- plus(x, Y, Z). % P1 % P2 % Signature: times(x,y,z)/3 % Purpose: Z = X*Y times(0, X, 0) :- natural_number(x). % T1 times(s(x), Y, Z) :- times(x, Y, XY), plus(xy, Y, Z). % T2 % Signature: exp(x,n,z)/3 % Purpose: Z = X N (power) exp(x, 0, s(0)) :- natural_number(x). exp(x, s(y), Z) :- exp(x, Y, XY), times(x, XY, Z). % Signature: fact(n,f)/2 % Purpose: F = N! (factorial) fact(0, s(0)). times(s(x),y) :- fact(x,z), times(s(x), Z, Y). הגדר את הפרוצדורות הבאות: % T1 % T2 % T1 % T2 12

ג. [ 8 נק'[ השלם את עץ ההוכחה החלקי שלהלן לחישוב כל התשובות. הקפד על שינוי שמות משתנים. על כל קשת בעץ, ציין מהי הצבת המשתנים עבורה, ומיהו הכלל שהופעל. ציין את התשובה בעלי הצלחה. 13