מבחן בקורס: עקרונות שפות תכנות, מועד: א תאריך: 13/7/2020 שמות המרצים: מני אדלר, בן אייל, גיל אינציגר, מיכאל אלחדד מיועד לתלמידי: מדעי המחשב

מסמכים קשורים
מבוא למדעי המחשב

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

PowerPoint Presentation

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

PPL Moed A

תרגול 1

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

PowerPoint Presentation

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

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

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

סדנת תכנות ב C/C++

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

Slide 1

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

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

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

PowerPoint Presentation

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

PowerPoint Presentation

Slide 1

תורת הקומפילציה

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

Microsoft Word B

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

Microsoft PowerPoint - rec1.ppt

PowerPoint Presentation

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

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

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

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

Microsoft PowerPoint - rec3.ppt

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

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

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

Slide 1

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

Slide 1

פייתון

Microsoft PowerPoint - lec2.ppt

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

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

יוםראשון, 02 ליולי 2014 סמסטר סוף מבחן )236703( עצמים מונחה תכנות - א' מועד 2014, אביב סמסטר קמחי יחיאל ד"ר מרצה: מסינג מיטל עבדאלקאדר, כרם גלעד, ערן

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

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

Microsoft PowerPoint - lec9.ppt

מצגת של PowerPoint

תשע"דד אביב תוכנה 1 תרגיל מספר 4 עיבוד מחרוזות וקריאה מקבצים הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס..(

Slide 1

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

לנץ קרן מרצה: תכנותמונחהעצמים) ( יוםשישי 15 אוקטובר 0202 ב מועד 0202, אביב סמסטר סמסטר סוף מבחן גוטמן אייל רביב, אריאל משנה, אלון מתרגלים: הנחי

Microsoft Word - c_SimA_MoedB2005.doc

PowerPoint Presentation

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

Microsoft PowerPoint - lec9.ppt

PowerPoint Presentation

תוכן העניינים

Tutorial 11

תרגול 1

תוכן העניינים

Microsoft Word - pitaron222Java_2007.doc

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

מקביליות

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

תוכנה 1 אביב תשע"ח תרגיל מספר 8 אוספים גנריים ו- framework collection הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגשת ה

Slide 1

Microsoft PowerPoint - lec10.ppt

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

Slide 1

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

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

1 תבניות טקסט מהי תבנית טקסט? שימוש ב- Characters Meta שימוש ב- Expression Grouping שימוש ב- Quantifiers תת תבניות הפונקציה preg_match הפונקציה preg_m

PRESENTATION NAME

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

שקופית 1

מבוא לאסמבלי

Slide 1

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

תרגול 1

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

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

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

ex1-bash

Microsoft Word - Ass1Bgu2019b_java docx

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

1 תוכנה 1 תרגיל מספר 7 מנשקים Interfaces הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגשת התרגיל תעשה במערכת ה- moodle ב

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

Slide 1

Microsoft Word - c_SimA_MoedA2006.doc

איטרטורים: 1 תוכנה 1 סתיו תשע"ג תרגיל מספר 9 הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגשת התרגיל תעשה במערכת ה moodl

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

234114

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

Microsoft PowerPoint - rec8.ppt

תרגול 1

PowerPoint Presentation

Slide 1

תמליל:

מבחן בקורס: עקרונות שפות תכנות, 202-1-2051 מועד: א תאריך: 13/7/2020 שמות המרצים: מני אדלר, בן אייל, גיל אינציגר, מיכאל אלחדד מיועד לתלמידי: מדעי המחשב והנדסת תוכנה, שנה ב', סמסטר ב' משך המבחן: 3 שעות חומר עזר: אסור הנחיות כלליות: יש לענות על כל השאלות בגיליון התשובות. מומלץ לא לחרוג מן המקום המוקצה. - אם אינכם יודעים את התשובה, ניתן לכתוב 'לא יודע' ולקבל 20% מהניקוד על הסעיף/השאלה. - נק 20 נק 30 נק 20 נק 20 נק 15 נק 105 שאלה 1: תכנות פונקציונלי שאלה 2: תחביר וסמנטיקה שאלה 3: מערכת טיפוסים שאלה 4: מבני בקרה שאלה 5: תכנות לוגי סה"כ בהצלחה! ------------------------------------------------------------------------------------------------------------------- 1

שאלה 1: תכנות פונקציונלי [20 נקודות] בסעיפים הבאים (א. ו-ב.) אין להגדיר פונקציות עזר. אל תשכחו לכתוב את הטיפוס וחתימה של כל הפונקציות. א. [10 נק] כתבו ב- Scheme את הפונקציה scan המקבלת פונקציה של שני ארגומנטים, ערך התחלתי ורשימה, ומחזירה רשימה של reduced values משמאל. דוגמאות: > (scan * 1 '(1 2 3 4)) '(1 1 2 6 24) > (scan * 1 '(1 2 3 4 5)) '(1 1 2 6 24 120) > (scan + 0 '(1 2 3 4 5)) '(0 1 3 6 10 15) > (scan / 1 '(1 2 3 4 5)) '(1 1 1/2 1/6 1/24 1/120) > (scan + 0 '()) '(0) ;; Signature: ;; Type: _ (define scan 2

ב. [10 נק] כתבו ב- TypeScript פונקציה גנרית zipwith המקבלת פונקציה f של שני ארגומנטים ושתי רשימות באותו אורך, ומחזירה Result של הרשימה הנוצרת ע"י הפעלת f על איברים מתאימים ברשימות. אין להשתמש במוטציה או לולאות. ניתן להשתמש בפונקציות העזר של רשימות שראינו בכיתה: isempty <T>(list: T[]): boolean first <T>(list: T[]): T rest <T>(list: T[]): T[] cons <T>(f: T, r: T[]): T[] makeok <T>(value: T): Result<T> makefailure <T>(message: string): Result<T> bind <T, U>(r: Result<T>, f: (x: T) => Result<U>): Result<U> zipwith((x, y) => x + y, [1, 2, 3], [4, 5, 6]); // => { tag: 'Ok', value: [ 5, 7, 9 ] } zipwith((x, y) => x + y, [1, 2, 3], [4, 5]); // => { tag: 'Failure', message: "Lists are not the same length" } דוגמאות: const zipwith = => 3

שאלה 2: תחביר וסמנטיקה [30 נקודות] נתונה המחלקה Pair ב ++C (לא נדרשת כל היכרות עם ++C בשאלה, זו רק דוגמא להמחשה): float den = 2; class Pair { int a,b; public: Pair(int i, int j) { a = i; b = j; } }; int getfirst() { return a; } int getsecond() { return b; } float f() { return (a + b) / den; } בשאלה זו נתמקד במימוש הגדרת מחלקות, כמו המחלקה,Pair בשפה L4 א. [5 נקודות] השלימו את מימוש הפרוצדורה make-pair ב- L4, כפי שנלמדה בכיתה, המייצרת מופע של מעין 'אובייקט' מסוג Pair (דוגמא לשימוש בו מופיע מיד אחרי הפרוצדורה) (define den 2) (define make-pair (lambda (a b) (lambda (msg) ) ) ) (define p34 (make-pair 3 4)) (p34 first) 3 (p34 second) 4 4

(p34 f) 3.5 ב. [5 נקודות] הוחלט להוסיף צורה מיוחדת form) (special חדשה לשפה L4 לשם הגדרת מחלקות במנותק מהגדרת המופעים שלהם -.class מבנה ה class כולל את רשימת השדות של המחלקה, ואת המתודות שלה (במבנה של - bindings זוגות של שם המתודה והגדרת הפרוצדורה שלה). המחלקה,Pair לדוגמא, תוגדר כך: (define den 2) (define Pair (class (a b) ( (first (lambda () a)) (second (lambda () b)) (f (lambda () (/ (+ a b) den))) ) ) ) התוספת לתחביר המופשט והקונקרטי מודגשת : <program> ::= (L4 <exp>+) / Program(exps:List(exp)) <exp> ::= <define> <cexp> / DefExp CExp <define> ::= ( define <var> <cexp> ) / DefExp(var:VarDecl, val:cexp) <var> ::= <identifier> / VarRef(var:string) <cexp> ::= <number> / NumExp(val:number) <boolean> / BoolExp(val:boolean) <string> / StrExp(val:string) ( lambda ( <var>* ) <cexp>+ ) / ProcExp(args:VarDecl[], body:cexp[])) ( class ( <var>+ ) ( <binding>+ ) ) / ClassExp(args:VarDecl[], bindings:binding[])) ( if <cexp> <cexp> <cexp> ) / IfExp(test: CExp, then: CExp, alt: CExp) ( let ( <binding>* ) <cexp>+ ) / LetExp(bindings:Binding[], body:cexp[])) ( quote <sexp> ) / LitExp(val:SExp) ( <cexp> <cexp>* ) / AppExp(operator:CExp, operands:cexp[])) ( letrec ( binding*) <cexp>+ ) / LetrecExp(bindings:Bindings[], body: CExp) <binding> ::= ( <var> <cexp> ) / Binding(var:VarDecl, val:cexp) <prim-op> ::= + - * / < > = not eq? string=? cons car cdr list pair? list? number? boolean? symbol? string? <num-exp> ::= a number token <bool-exp> ::= #t #f <str-exp> ::= "tokens*" <var-ref> ::= an identifier token 5

<var-decl> ::= an identifier token <sexp> ::= symbol number bool string ( <sexp>* ) השלימו את מימוש הייצוג התחבירי (ה (AST של הצורה המיוחדת החדשה בקוד של הפארסר: export interface ClassExp { } export const makeclassexp = ( ): ClassExp => ; export const isclassexp = (x: any): x is ClassExp => ; ג. [5 נקודות] חוק החישוב עבור המבנה ClassExp מוגדר כדלהלן: הערך של ביטוי ClassExp הוא ערך מסוג חדש,Class הכולל את המידע הרלבנטי להפעלתו בהמשך (בדומה לערך Closure עבור (ProcExp export type Value = SExpValue Closure Class ; השלימו את הגדרת הממשק :Class export interface Class { tag: "Class"; } הניחו כי הפרוצדורות makeclass, isclass ממומשות בהתאם. השלימו את הפרוצדורה evalclass המממשת חוק חישוב זה: const applicativeeval = (exp: CExp, env: Env): Result<Value> => isclassexp(exp)? evalclass(exp, env) : const evalclass = (exp: ClassExp, env: Env): Result<Class> => ; 6

ד. [10 נקודות] כדי לייצר מופע של class נתון, יש 'להפעיל' אותו עם פרמטרים עבור השדות (כמו פעולת הבנאי). פעולה זו מחזירה פונקציה המקבלת symbol המציין את המתודה להפעלה ומבצעת מתודה זו. לדוגמא: ההפעלה של המחלקה,Pair מיד לאחר הגדרתה, עם הפרמטרים 3,4, מחזירה את אותה פונקציה שההפעלה (3 make-pair 4) החזירה בסעיף א. (define den 2) (define Pair (class (a b) ((first (lambda () a)) (second (lambda () b)) (f (lambda () (/ (+ a b) den)))))) (define p34 (Pair 3 4)) (p34 first) 3 (p34 second) 4 (p34 f) 3.5 הפרוצדורה applyclass באינטרפרטר מטפלת במקרה זה של הפעלת מחלקה לשם יצירת 'מופע'. לדוגמא, עבור הביטוי: 4) (Pair 3 השלימו את מימוש הפרוצדורה applyclass (יש למטה חומר עזר לנוחיותכם) const applicativeeval = (exp: CExp, env: Env): Result<Value> =>... isappexp(exp)? safe2((op: Value, args: Value[]) => apply(op, args) ) (applicativeeval(exp.rator, env), mapresult((rand: CExp) => applicativeeval(rand, env), exp.rands)) :... const apply = (op: Value, args: Value[]): Result<Value> => isprimop(op)? applyprimitive(op, args) : isclosure(op)? applyclosure(op, args) : isclass(op)? applyclass(op, args) : makefailure(`bad procedure ${JSON.stringify(proc)}`); const applyclass = (cls: Class, args: Value[]): Result<Closure> => { 7

const cases : LitExp[] = map((b: Binding) => makelitexp(b.var.var), cls.bindings); const actions : CExp[] = map((b: Binding) => b.val, cls.bindings); } חומר עזר : ניתן להניח שקיימת בקוד האינטרפרטר פונקציה makecondexp המקבלת,VarRef רשימת 'מקרים' עבורו,(CExps) ורשימת 'פעולות',(CExps) פעולה עבור כל אחד מהמקרים, ומחזירה מבנה של CondExp בהתאם. לדוגמא: makecondexp(makevarref('x'), [makelitexp('i'), makelitexp('j')], [makenumexp(1), makenumexp(2)]); AST of the expression: (cond ((eq? x 'i) 1) ((eq? x 'j) 2)) ה. [5 נקודות] האם הצורה המיוחדת החדשה class היא?syntactic abbreviation נמקו בקצרה התייחסו בתשובתכם ליכולת להגדיר 'אובייקט' כמו p34 במצבים שונים, עם הצורה המיוחדת class ובלעדיה. וכן לשאלה העקרונית האם צורות מיוחדות חדשות בשפה L4 הן קיצור תחבירי. 8

שאלה 3: מערכת טיפוסים [20 נקודות] א. [4 נק] תארו את ההבדל בין שתי שיטות להגדרת נכונות של פונקציה: - Precondition verification - Type correctness התייחסו לאספקטים: - באילו כלים ניתן להשתמש כדי לבדוק את התכונה precondition) או (type correctness - איזו תכונה ניתן לבדוק בצורה סטטית ואיזו בצורה ודינמית נתונות ההגדרות הבאות (שהוגדרו בכיתה): const first = <T>(x: T[]): T => x[0]; const rest = <T>(x: T[]): T[] => x.slice(1); const isempty = <T>(x: T[]): boolean => x.length === 0; type Result<T> = Ok<T> Failure; interface Ok<T> {tag: "Ok"; value: T;} interface Failure {tag: "Failure"; message: string;} const makeok = <T>(value: T): Result<T> => ({ tag: "Ok", value: value }); const makefailure = <T>(message: string): Result<T> => ({ tag: "Failure", message: message }); const isok = <T>(r: Result<T>): r is Ok<T> => r.tag === "Ok"; const isfailure = <T>(r: Result<T>): r is Failure => r.tag === "Failure"; const bind = <T, U>(r: Result<T>, f: (x: T) => Result<U>): Result<U> => isok(r)? f(r.value) : r; 9

ברצוננו להגדיר פונקציה עם :precondition // @Precondition: l is not empty const first1 = (l: number[]): number => first(l) + first(l) עם ההגדרה הזו, ניתן לקרוא לפונקציה first1 עם פרמטר לא נכון ללא התראה: const d1 = first1([1,2,3]); // Precondition is not met - and there is no type error const d2 = first1([]); כדי למנוע טעויות כאלה, ננסה לנצל את מערכת הטיפוסים בכמה דרכים שונות: ב. [3 נק.] נגדיר type חדש לייצוג רשימות לא ריקות: type NonEmptyList = number[]; const isnonemptylist = (x: any): x is NonEmptyList => Array.isArray(x) && x.length > 0; const first2 = (lst: NonEmptyList): number => first(lst) + first(lst); first2([]); האם הקריאה הבאה עוברת?type checking הסברו 10

ג. [3 נק] ממש גירסה של הפונקציה בעזרת :Result const first3 = (l: number[]): Result<number> => ד. [3 נק] מציעים לממש את הפונקציה בצורה שמשקפת את ה- precondition בחתימה של הפונקציה על סמך ההגדרה האינדוקטיבית של רשימות: ממשו את הפונקציה בצורה בטוחה safe) :(type type List = EmptyListI NonEmptyListI; type EmptyListI = []; type NonEmptyListI = {first: number; rest: number[]}; const first4 = ה. [4 נק] בצעו קריאה בטוחה מהפרוצדורות caller1, caller2, caller3, caller4 לכל אחת מארבע הגרסאות first2, first1, first3, first4 בהתאמה. כל אחת מהפרוצדורות מקבלת רשימה של מספרים ומדפיסה את הערך של האיבר הראשון כפול 2 כאשר הוא קיים או לא עושה כלום כאשר הוא לא קיים: const caller1 = (l: number[]): void => { // Use first1 } 11

const caller2 = (l: number[]): void => { // Use first2 } const caller3 = (l: number[]): Result<void> => { // Use first3 } const caller4 = (l: number[]): void => { // Use first4 } ו. [3 נק] מה הגרסה המומלצת מבין first1, first2, first3, first4 לכתיבת קוד בטוח - נמקו 12

שאלה 4: מבני בקרה [20 נקודות] א. [8 נק] האם הביטויים הבאים הם ב- form?tail אם לא הסבירו למה לא (cond ((f x) (+ x x)) ((> x 0) 0)) (cond ((+ x x) (f x)) ((> x 0) (- x))) (lambda (x) (* x (f x))) (lambda (x) (f (* x x))) ב. [12 נק] כתבו פונקציה המפצלת רשימה נתונה לשתי רשימות לפי פרדיקט לא פרימיטיבי $pred בסגנון.CPS ה- continuation מקבל שני ארגומנטים: רשימת האיברים מן הרשימה אשר קיימו את הפרדיקט ורשימת אלו שלא. על שתי הרשימות יתבצע המשך החישוב. השתמשו רק ואך בפונקציות פרימיטיביות. (define even?$ (lambda (n c) (c (even? n)))) ; Signature: split$(pred$ lst c) ; Type: ; ; ; Purpose: Returns the application of the continuation c on two lists: ; 1. A list of members for which the predicate pred$ holds. ; 2. A list of members for which it doesn't. ; Examples: ; (split$ even?$ '(1 2 3 4 5 6 7) (lambda (x y) (list x y))) ; => '((2 4 6) (1 3 5 7)) (define split$ 13

(lambda (pred$ lst c) )) 14

שאלה 5: תכנות לוגי [15 נקודות] א. [5 נק] כתבו חוקים ועובדות ב- Prolog שמייצגים את המידע הבא בעזרת הפרדיקטים: killer/1 dead/1 married/2 eats/2 kills/2 tasty/1 sweet/1 והקבועים.esau, avi, sarah, itshak עשו הוא רוצח אבי ושרה התחתנו מי שהורג מישהו הוא רוצח יצחק אוכל כל דבר שהוא טעים או מתוק מי שנרצח מת.1.2.3.4.5 %1 %2 %3 %4 %5 ב. [4 נק] מהו ה- unifier mgu של כל אחד מהזוגות הבאים. כאשר אין unifier כתבו "אין" והסבירו למה 1. food(bread,x) = food(y,sausage) 2. food(bread,x,beer) = food(y,sausage,x) 3. [X,1 Z] = [1,X,2,4] 4. food(x) = X 15

ג. [6 נק] מייצגים עצים בינארים בעזרת הפונקטורים leaf/1 ו- tree/2 - למשל: tree(leaf(1), tree(leaf(2), leaf(3))) כתבו פרוצדורה swap/2 שמגדירה יחס בין שני עצים בינארים המתקיים כאשר אחד הוא תמונת מראה של השני. למשל:?- swap(tree(tree(leaf(1), leaf(2)), leaf(4)),t). T = tree(leaf(4), tree(leaf(2), leaf(1))). בהצלחה! 16