interface Student {tag: Student, name: string; age: number;} const makestudent = ( name: string, age: number ) : Student =>

Similar documents
שאלון ד' הוראות לנבחן

מספר השאלון: Thinking Skills נספח: כישורי חשיבה )לפרק ראשון ושני( א נ ג ל י ת (MODULE F) ספרות )מילון הראפס אנגלי-אנגלי-ערבי(

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון ב' Corresponds with Module B גרסה ב' הוראות לנבחן

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

שאלון ו' הוראות לנבחן

שאלון ו' הוראות לנבחן

אנגלית (MODULE E) בהצלחה!

אנגלית שאלון ז' ג רסה א' הוראות לנבחן בהצלחה! )4( ההנחיות בשאלון זה מנוסחות בלשון זכר ומכוונות לנבחנות ולנבחנים כאחד. (MODULE G)

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

אנגלית ספרות בהצלחה! /המשך מעבר לדף/ נספח: כישורי חשיבה )לפרק ראשון ושני( או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון א' Corresponds with Module A (Without Access to Information from Spoken Texts) גרסה א'

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות או מילון אנגלי-עברי-עברי-אנגלי

ãówh,é ËÓÉÔê ÌW W É Å t" Y w f É ËÓÉÑ É èw É f Ñ u ð NNM YóQ' ÌW W É Y ÉgO d óqk É w f ym Éd É u ð NNM ÌWNQMH uqo ð NNM ÌWNQMH

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

מספר השאלון: הצעת תשובות לשאלות בחינת הבגרות אנגלית (MODULE C) מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי قاموس إنجليزي - إنجليزي - عربي

עץ תורשה מוגדר כך:שורש או שורש ושני בנים שכל אחד מהם עץ תורשה,כך שערך השורש גדול או שווה לסכום הנכדים(נכד-הוא רק בן של בן) נתון העץ הבא:

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

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי

אנגלית שאלון ז' (MODULE G) ג רסה א' הוראות לנבחן )מילון אנגלי-ערבי / ערבי-אנגלי )

בהצלחה! (MODULE C) Hoffman, Y. (2014). The Universal English-Hebrew, Hebrew-English Dictionary

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות או מילון אנגלי-עברי-עברי-אנגלי

קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.

(MODULE E) ב ה צ ל ח ה!

ב. משרד החינוך בגרות לנבחנים אקסטרניים א נ ג ל י ת (MODULE B) הוראות מיוחדות: )2( בתום הבחינה החזר את השאלון למשגיח. בהצלחה!

ב. משרד החינוך בגרות לנבחנים אקסטרניים א נ ג ל י ת (MODULE B) הוראות מיוחדות: )2( בתום הבחינה החזר את השאלון למשגיח. בהצלחה!

הצעת תשובות לשאלות בחינת הבגרות אנגלית

מבוא למחשב בשפת פייתון

זו מערכת ישרת זוית )קרטזית( אשר בה יש לנו 2 צירים מאונכים זה לזה. באותו מישור ניתן להגדיר נקודה על ידי זוית ורדיוס וקטור

Practical Session No. 13 Amortized Analysis, Union/Find

אוניברסיטת בן גוריון בנגב

ASP.Net MVC + Entity Framework Code First.

טכנולוגיית WPF מספקת למפתחים מודל תכנות מאוחד לחוויית בניית יישומיי

ניפוי שגיאות )Debug( מאת ישראל אברמוביץ

A JEW WALKS INTO A BAR: JEWISH IDENTITY IN NOT SUCH JEWISH PLACES

Hebrew Ulpan HEB Young Judaea Year Course in Israel American Jewish University College Initiative

A R E Y O U R E A L L Y A W A K E?

Advisor Copy. Welcome the NCSYers to your session. Feel free to try a quick icebreaker to learn their names.

יסודות מבני נתונים. תרגול :9 ערימה - Heap

Depth-First Search DFS

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

ל"תוכנה" שכותבים, כמו פונקציה זו, קוראים "קוד"

מכונת מצבים סופית תרגול מס' 4. Moshe Malka & Ben lee Volk

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

Rules Game (through lesson 30) by Nancy Decker Preparation: 1. Each rule board is immediately followed by at least three cards containing examples of

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

תרגול 11 תור עץ חיפוש בינארי

תרגול 8. Hash Tables

המבנה הגאומטרי של מידה

תוכן העניינים: פרק סדרות סיכום תכונות הסדרה החשבונית:... 2 תשובות סופיות:...8 סיכום תכונות הסדרה ההנדסית:...10

אוניברסיטת בן גוריון בנגב

Computer Structure. Exercise #1 יש להגיש את התשובות הסופיות על גבי טופס זה.

מספר ת"ז: יש לסמן את התשובה הטובה ביותר בתשובון. לא יינתן ניקוד על סימון תשובה בטופס הבחינה או במחברת הבחינה.

Structural Vs. Nominal Typing

במבוא מורחב למדעי המחשב בשפת פייתון

מושגים בסיסיים תלמידים והורים יקרים,

ANNEXURE "E1-1" FORM OF IRREVOCABLE STANDBY LETTER OF CREDIT PERFORMANCE OF CONTRACT (WHERE PRICES ARE NOT LINKED TO AN ESCALATION FORMULA)

מבחן מועד ב' אנא קיראו היטב את ההראות שלהלן:

אנגלית בהצלחה! ובאתר של אגף הבחינות במשרד החינוך. השימוש במילון אחר טעון אישור של הפיקוח על הוראת האנגלית. הוראות מיוחדות:

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

סמסטר אביב 2015, מועד ב' סמסטר קיץ 2015, מועד א' מתרגלים: אביב - נורית מושקוביץ', הלאל עאסי, אלירן וייס; קיץ מאיה דיאמנט

DNS פרק 4 ג' ברק גונן מבוסס על ספר הלימוד "רשתות מחשבים" עומר רוזנבוים 1

Name Page 1 of 6. דף ט: This week s bechina starts at the two dots in the middle of

שאלות חזרה לקראת מבחן מפמ"ר אינטרנט וסייבר

דיאגרמה לתיאור Classes

המחלקה למדעי המחשב, אוניברסיטת בן גוריון מבני נתונים, סמסטר אביב 2102 עבודת בית מספר - 2 מעשית

Name Page 1 of 5. ,דף ד: This week s bechina starts at the bottom of שיר של חול

תצוגת LCD חיבור התצוגה לבקר. (Liquid Crystal Display) המערכת.

THINKING ABOUT REST THE ORIGIN OF SHABBOS

Theories of Justice

תוכנה 1 תרגיל מספר 11

סמסטר א' תשס "א התשובות. בהצלחה

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 102 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 5

Patents Basics. Yehuda Binder. (For copies contact:

תרגיל בית מספר - 5 להגשה עד 7 ביוני )יום ראשון( בשעה 32555

מבוא למחשב בשפת Matlab

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

ניסוי בפייתון מכון טכנולוגי לישראל הניסוי מתקיים בבניין פישבך, חדר 573 )במסדרון למאייר(. המאחר ביותר מ- 53 דקות לא יורשה לבצע את הניסוי.

חוק זכויות הסוכן חוק חוזה סוכנות )סוכן מסחרי וספק(

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

אוניברסיטת בן גוריון בנגב

WHAT IS THE PSHAT OF A METAPHORICAL MITZVAH?

בוחן בתכנות בשפת C בצלחה

T H E S U N F L O W E R L I M I T S T O F O R G I V E N E S S

1.1. הקדמה (דיסק). מדריכי. (מחיצות) Link

קורס מטלב לפיסיקאים שיעור מס' 10: משתנים מורכבים

מבוא לרשתות - תרגול מס' 11 Transparent Bridges

שנה"ל תשע"ד,סמסטר א',מועד א שאלון בחינה בקורס: מבוא למדעי המחשב לתעו"נ מספר : בחלק א' 11 שאלות, יש לענות על 11 מתוכן )כל שאלה מזכה ב 7 נקודות(

2007 Zindell Technologies, Ltd.

תרגיל בית מספר 6 )אחרון!( - להגשה עד 21 ביוני )יום ראשון( בשעה ::225

Rachel Rosenthal. Humanity and Divinity

מטוסים נופלים, כורים מתפוצצים זיכרון אוטומטי מקטסטרופות לומדים בניינים קורסים,

סה"כ נקודות סה"כ 31 נקודות סה"כ 21 תוכן עניינים של פתרון המבחן. לולאת for )נתון אלגוריתם... מעקב, פלט

SEEDS OF GREATNESS MINING THROUGH THE STORY OF MOSHE S CHILDHOOD

פרק רשימה א. ייצוג הרשימה

BEING A VISIONARY JOLT LEADERSHIP PROGRAM 2014

JUDAISM AND INDIVIDUALITY

בהצלחה! מבוא לתכנות מערכות

מבחן בקורס מבוא מורחב למדעי המחשב, CS1001.py עם תיקונים קלים והבהרות שניתנו במהלך המבחן ביה"ס למדעי המחשב, אונ' תל אביב

Chofshi.

Transcription:

תאריך 23.07.2018 שם המרצים: מני אדלר, מיכאל אלחדד, ירון גונן מבחן בקורס: עקרונות שפות תכנות קורס' מס: 202-1-2051 מיועד לתלמידי: מדעי המחשב והנדסת תוכנה שנה: ב' סמסטר: ב' מועד ב' משך הבוחן: 3 שעות חומר עזר: אסור הנחיות כלליות: ההוראות במבחן מנוסחות בלשון זכר, אך מכוונות לנבחנים ולנבחנות כאחד. 1. מבחן הכתוב בעיפרון חלש המקשה על הקריאה, לא יבדק 2. יש לענות על כל השאלות בגוף המבחן בלבד (בתוך השאלון). מומלץ לא לחרוג מהמקום המוקצה. 3. אם אינך יודע את התשובה, ניתן לכתוב "לא יודע" ולקבל 20% מהניקוד על הסעיף/השאלה. 4. 18 דפים סה"כ במבחן 5. נק 26 נק 14 נק 23 נק 21 נק 22 נק 106 שאלה :1 AST שאלה 2: ייצוג אובייקטים ב- L שאלה 3: מערכת טיפוסים שאלה 4: תכנות לוגי שאלה 5: רשימות עצלות וCPS סה"כ

שאלה :1 AST (26 נק) בשאלה הזאת נפתח שיטה ליצירה של קוד ב- L5 בהינתן תיאור של.Type 1.1 התבונן ב- Type הבא ב- TypeScript : (2 נק) interface Student {tag: Student, name: string; age: number;} הגדרו את ה- constructor value ואת ה- predicate type עבור ה- Student :type const makestudent = ( name: string, age: number ) : Student => ({tag: Student, name: name, age: age}) const isstudent = ( x : any ) : x is Student => x.tag === Student ; 1.2 נעביר את הקוד ל- L5 : כדי לממש את ה- Student Type ב- L5, הגדירו את הפרוצדורות הבאות: (2 נק) (define makestudent (lambda ((name : string) (age : number)) : list (list "Student" name age))) (define student? (lambda ( x : list ) : boolean (string=? (car x) Student ) ) (define student->name (lambda (s : list) : string (car (cdr s)) ) 1

ציירו 1.3 את ה AST של הביטוים L5 של define עבור,makeStudent ושל ביטוי ה define עבור?student (8 נק) TEXP <texp> <atomic-te> ::= <atomic-te> <compound-te> <tvar> ::= <num-te> <bool-te> <void-te> <num-te> ::= number // num-te() <bool-te> ::= boolean // bool-te() <str-te> ::= string // str-te() <list-te> ::= list // list-te() <compound-te> ::= <proc-te> <tuple-te> <non-tuple-te> ::= <atomic-te> <proc-te> <tvar> <proc-te> ::= [ <tuple-te> -> <non-tuple-te> ] <tuple-te> / proc-te(param-tes: list(te), return-te: te) ::= <non-empty-tuple-te> <empty-te> <non-empty-tuple-te> ::= ( <non-tuple-te> *)* <non-tuple-te> <tvar> L5 <exp> ::= <define> <cexp> / tuple-te(tes: list(te)) ::= a symbol starting with T / tvar(id: Symbol, contents, Box(string boolean)) <define> ::= ( define <var-decl> <cexp> ) <cexp> ::= <number> / DefExp(var:VarDecl, val:cexp) / DefExp CExp / NumExp(val:number) <boolean> / BoolExp(val:boolean) <string> / StrExp(val:string) <var-ref> ( lambda ( <var-decl>* ) <TExp>* <cexp>+ ) / ProcExp(params:VarDecl[], body:cexp[], returnte: TExp)) ( if <cexp> <cexp> <cexp> ) / IfExp(test: CExp, then: CExp, alt: CExp) ( <cexp> <cexp>* ) / AppExp(operator:CExp, operands:cexp[])) <prim-op> ::= + - * / < > = not eq? string=? <num-exp> ::= a number token <bool-exp> ::= #t #f <var-ref> ::= an id token cons car cdr list list? number? boolean? symbol? string? / VarRef(var: string) <var-decl> ::= an id token (var : TExp) / VarDecl(var: string, TE: TExp) 2

makestudent AST for Expression: (define makestudent (lambda ((name : string) (age : number)) : list (list "Student" name age))) Important points about ASTs: The node types correspond to types listed in the abstract syntax (see p.2) For each node type, there are children according to the parameters of the type. For example, a node of type ProcExp has 3 children, labeled params, return-te and body. The edges connecting to the children must be labeled. The type of the children corresponds to the type of the params listed in the AST types. For example, a node of type VarDecl has 2 children of type string (labeled var) and TExp (labeled te). When the type of a parameter is a list of children, we add a node labeled [] to indicate the list and its items. For example, the child params of the node ProcExp is a list. All the information from the original expression must be recoverable from the AST. There are NEVER any abstract types in an AST. For example, the return-te child of the node ProcExp is declared of type TExp - which is abstract (it is a union type - which means it is abstract). But the actual value in our expression is list -- hence the node in the AST is of type list-te - not TExp with a child of type list-te (this would appear in a derivation tree, not in an AST 3

https://www.cs.bgu.ac.il/~ppl182/wiki.files/class/notebook/2.3syntax.html#bnf-specifica tion student? AST for expression: (define student? (lambda (x : list) : boolean (string=? (car x) Student )) 4

השלימו 1.4 את שני הביטויים הבאים, האחד בונה את ה- AST שמייצג את ה- constructor value type predicate את ה שמייצג והשני בונה את ה- AST,makeStudent?student (6 נק) const studentctorexp : DefineExp = makedefineexp ( makevardecl ( " makestudent ", makefreshtvar ()), makeprocexp ([ makevardecl ( " name ", makestrtexp ()), makevardecl ( " age ", makenumtexp ())], [ makeappexp ( makeprimop ( " list " ), [ makestrexp( Student ), makevarref( name), makevarref( age ) ])], makelisttexp ())) ; const studentpredexp : DefineExp = makedefineexp ( makevardecl ( " student? ", makefreshtvar ()), makeprocexp ( [makevardecl( x, makelisttexp())], [ makeappexp ( makeprimop ( " string=? " ), [ makeappexp ( makeprimop( car ), makebooltexp ()) ; makevarref( x ) ), makestrexp ( " Student " )])]), 5

1.5 יצירת קוד ברצוננו ליצור את הקוד של ה- constructor value וה- predicate type בצורה אוטומטית בהינתן תיאור הצהרתי של ה- type. (declarative) (8 נק) interface Field { name : string ; typename : string ;} interface Record { name : string ; fields : Field [] ;} const studentrecord : Record = {name: Student, fields: [{name: name, typename: string }, {name: age, typename: number }]}; const studentctorauto = genctor(studentrecord); Const studentpredauto = genpred(studentrecord); console.log(unparse(studentctorauto)) (define makestudent (lambda ((name : string) (age : number)) : list (list "Student" name age))) השלמו את הקוד של ה- generator :code const genctor = ( rec : Record ): DefineExp => makedefineexp ( makevardecl ( " make "+ rec. name, makefreshtvar ()), makeprocexp ( map ( ( field : Field ) => makevardecl(field.name, parsete(field.typename) ]), rec. fields ), [ makeappexp ( makeprimop ( " list " ), [ makestrexp ( rec. name )]. concat ( map ( ( field : Field ) => makevarref(field.name), rec. fields )))], makelisttexp ())) ; 6

שאלה 2: ייצוג אובייקטים ב- L (14 נקודות) נתונים שלושה מימושים לייצוג אובייקט של בן-אדם (אחד ב TypeScript ושניים ב L5), וכן פונקציה הבודקת האם הוא גר בניו-יורק: מימוש 1: כ- interface ב- TypeScript interface Person { tag: "person"; name: string; address: string }; const isliveinny = (p : Person) : boolean => p.address === "NY"; מימוש 2: כרשימה ב- L5 (define make-person-l (lambda ((name : string) (address : string)) : List (list person name address))) (define is-live-in-ny-l (lambda ((p : List)) : boolean (and (eq? (car p) person ) (eq? (car (cdr (cdr p))) "NY")))) מימוש 3: כ- closure ב- L5 (define make-person-c (lambda ((name : string) (address : string)) : (symbol -> T) (lambda (msg) (cond ((eq? msg 'tag) person ) ((eq? msg 'name) name) ((eq? msg 'address) address))))) 7

(define is-live-in-ny-c (lambda (p : (symbol -> T)) : boolean (and (eq? (p 'tag) person ) (eq? (p 'address) "NY")))) 2.1 ציינו את הערך של כל אחד משלושת הביטויים הבאים (כל אחד מהביטויים מתייחס, בהתאמה, לאחד משלושת המימושים למעלה): (3 נקודות) isliveinny({tag: "variable", name: "x", address: "NY"}); Type-checking/Compilation error (the parameter should be Student - a map with a student tag) (is-live-in-ny-l (list "variable "x" "NY")) #f (is-live-in-ny-c (lambda (msg) (cond ((eq? msg 'tag) "variable ) ((eq? msg 'name) "x") ((eq? msg 'address) "NY")))) #f 8

מדוע 2.2 אין צורך לבדוק את הערך של tag במימוש של isliveinny, אך צריך לבדוק את הערך של tag בשני המימושים האחרים מה is-live-in-ny-c, is-live-in-ny-l ההבדל העקרוני בתפקיד של tag בייצוג של ובייצוגים שלו ב L5? TypeScript ב Person (5 נקודות) ה- tag ב TypeScript מגדיר את הטיפוס Student כקבוצת כל ה map בהם השדה tag הוא המחרוזת "Student (עם השדות name,address מסוג.(string תכונתו זאת מאפשרת בדיקה בזמן ריצה של תאימות טיפוס הארגומט לטיפוס הפרמטר בפרוצדורה. ה- tag ב L הינו סה"כ פריט מידע (ברשימה או ב- closure, תלוי באופן מימוש האובייקט) המאפשר לבדוק את תאימות הארגומט לפרמטר של הפרוצדורה בזמן ריצה, אך אין לו כל תפקיד תחבירי במערכת הטיפוסים. 2.3 נתונים שני אובייקטים p-c,p-l המייצגים בן אדם ע"פ שני המימושים ב L5, כרשימה וכ- closure : (define p-l (make-person-l "Danny" "Beer Sheva")) (define p-c (make-person-c "Danny" "Beer Sheva")) (6 נקודות) עבור כל אחד מהמקרים הבאים, ציינו היכן מאוחסנים ה'שדות' של האובייקט address) :(name, האובייקט,p-l כאשר האינטרפרטר במודל הסביבות model) (environment 1. בסביבה הגלובלית 2. באחת הסביבות שאינה הגלובלית 3. כחלק מהקוד של body ב closure 4. בזיכרון של האינטרפרטר 5. במקום אחר תשובות 1,4 נכונות (תלוי בנקודת המבט) האובייקט,p-c כאשר האינטרפרטר במודל ההצבה model) (substitution 1. בסביבה הגלובלית 2. באחת הסביבות שאינה הגלובלית 3. כחלק מהקוד של body ב closure 9

4. בזיכרון של האינטרפרטר 5. במקום אחר תשובה 3 נכונה. במודל ההצבה המופעים של הפרמטרים של ה closure מוחלפים בארגומנטים, במקרה זה בערכים name,address האובייקט,p-c כאשר האינטרפרטר במודל הסביבות model) (environment 1. בסביבה הגלובלית 2. באחת הסביבות שאינה הגלובלית 3. כחלק מהקוד של body ב closure 4. בזיכרון של האינטרפרטר 5. במקום אחר תשובה 2 נכונה. במודל הסביבות נבנית סביבה הכוללת את ההצבות של הפרמטרים של הפרוצדורה, במקרה זה ערכי הארגומנטים name,address שאלה 3: מערכת טיפוסים (23 נקודות) בשאלה זו נרחיב את מערכת הטיפוסים שהוגדרה ב L5 כדי לתמוך באיחוד של טיפוסים types) (union כמו ב.TypeScript לדוגמא, ניתן יהיה להגדיר טיפוס חדש של קבוצת כל המחרוזות וכל המספרים כאיחוד של string ו :number (string number) לשם פשטות נניח כי ניתן לבצע union רק של טיפוסים לא מורכבים. 3.1. מוטיבציה: תארו מקרה בו נדרש להגדיר טיפוס שהוא איחוד של טיפוסים (כמו פרוצדורה בה נדרש לאחד טיפוסים כדי להגדיר את אחד הפרמטרים או את הערך המוחזר). (3 נקודות) במימוש האינטרפרטר, פונקציית ה eval החזירה את הערך של הביטוי, או שגיאה. כלומר הערך המוחזר שלה היה Value Error 10

3.2. נתון התחביר המופשט והקונקרטי של מערכת הטיפוסים, כפי שנלמד בהרצאה. הרחיבו אותו עם מבנה של איחוד טיפוסים. (3 נקודות) <texp> ::= <atomic-te> <composite-te> <tvar> <atomic-te> ::= <num-te> <bool-te> <void-te> <str-te> <num-te> ::= number / num-te() <bool-te> ::= boolean / bool-te() <str-te> ::= string / str-te() <void-te> ::= void / void-te() <composite-te> ::= <proc-te> <tuple-te> <union-te> <non-tuple-te> ::= <atomic-te> <proc-te> <tvar> <proc-te> ::= [ <tuple-te> -> <non-tuple-te> ] / proc-te(param-tes: list(te), return-te: te) <tuple-te> ::= <non-empty-tuple-te> <empty-te> <non-empty-tuple-te> ::= ( <non-tuple-te> *)* <non-tuple-te> / tuple-te(tes: list(te)) <empty-te> ::= Empty <tvar> ::= a symbol starting with T / tvar(id: Symbol) <union-te> ::= (<atomic-te> <atomic-te> [ <atomic-te>]*) / union-te(tes : list(atomic-te)) // Option 2: Union of only two atomic types <union-te> ::= <atomic-te> <atomic-te> / union-te(te1 : atomic-te, te2 : atomic-te) 3.3. השלימו את הגדרת מבנה ה union ב AST (3 נקודות) export interface UnionTExp = { tag: "UnionTExp"; types : AtomicExp[] }; export const makeuniontexp = ( types : AtomicExp[] ): UnionTExp => 11

({tag: "UnionTExp"; types : tes }); export const isuniontexp = (x: any): x is UnionTExp => x.tag === "UnionTExp"; // Option 2: Union of only two atomic types export interface UnionTExp = { tag: "UnionTExp"; te1 : AtomicExp; te2 : AtomicExp }; export const makeuniontexp = ( te1 : AtomicExp, te2 : AtomicExp ): UnionTExp => ({tag: "UnionTExp"; te1 : te1; te2 : te2 }); מתי 3.4 ניתן לקבוע ש- T1 type יותר ספציפי מ- T2?type (2 נק) כאשר קבוצת הערכים המוגדרת ע"י T1 מוכלת בקבוצה המוגדרת ע"י T2 3.5. נניח כי מומש ב Parser הניתוח של מבנה איחוד הטיפוסים, כך שתאור טיפוס מאוחד, בקוד כמו ','string number יהפוך ב parsing לקודקוד מסוג UnionTExp ב AST (אופן המימוש אינו רלבנטי לשאלה זו). (12 נקודות) עדכנו את המתודה checkequaltype ב TypeChecker כך שייבדקו גם מקרים בהם הטיפוסים כוללים :union types במידה ואחד הפרמטרים הוא טיפוס מסוג,union type הטיפוס בפרמטר הראשון te1 צריך להיות ספציפי יותר מהטיפוס בפרמטר השני.te2 לדוגמא: אם te1 = number, te2 = (number string) אז הפרוצדורה מחזירה true אם te1 = boolean, te2 = (number string) אז הפרוצדורה מחזירה error במידה ושני הפרמטרים הם מטיפוס פרוצדורה, יש לוודא תאימות של טיפוס הפרמטרים והערך המוחזר גם עבור.union types לדוגמא: אם 12

te1 = (number -> boolean) te2 = ((number string) -> boolean) te1 = (number -> (boolean string)) te2 = (number -> boolean) אז הפרוצדורה מחזירה true אם אז הפרוצדורה מחזירה error השתמשו בממשק ל- AST של :TExp isuniontexp, isproctexp, isatomictexp, istvar And for values p of type proctexp - p.paramtes and p.returnte. // Purpose: Check that type expressions are equivalent // as part of a fully-annotated type check process of exp. // Return an error if the types are different - true otherwise. // Exp is only passed for documentation purposes. const checkequaltype = (te1: TExp Error, te2: TExp Error, exp: Exp): true Error => iserror(te1)? te1 : iserror(te2)? te2 : deepequal(te1, te2)? true : (isatomictexp(te1) && isuniontexp(te2))? te2.types.includes(te1) : (isuniontexp(te1) && isuniontexp(te2))?!te1.types.map((te1item : AtomicTExp) => te2.includes(te1item)).include(false) : (isproctexp(te1) && isproctexp(te2))? te2.types.includes(te1) : te1.paramtes.length === t2.paramtes.length &&!iserror(checkequaltype(te1.returnte,te2.returnte,exp)) && hasnoerror( zipwith((param1te, param2te) => checkequaltype(param1te, param2te,exp), te1.paramtes, t2.paramtes)) : Error(`Incompatible types: ${unparsetexp(te1)} and ${unparsetexp(te2)} in ${unparse(exp)}`); 13

// Option 2: Union of only two atomic types const checkequaltype = (te1: TExp Error, te2: TExp Error, exp: Exp): true Error => iserror(te1)? te1 : iserror(te2)? te2 : deepequal(te1, te2)? true : isatomictexp(te1) && isuniontexp(te2)? te1 === te2.te1 te1 === te2.te2 : isuniontexp(te1) && isuniontexp(te2)? te1.te1 === te2.te1 && te1.te2 === te2.te2 te1.te1 === te2.te2 && te1.te2 === te2.te1 : isproctexp(te1) && isproctexp(te2)? te1.paramtes.length === te2.paramtes.length &&!iserror(checkequaltype(te1.returnte,te2.returnte,exp)) && hasnoerror( zipwith((param1te, param2te) => checkequaltype(param1te,param2te,exp), te1.paramtes,te2.paramtes)) : Error(`Incompatible types: ${unparsetexp(te1)} and ${unparsetexp(te2)} in ${unparse(exp)}`); 14

שאלה 4: תכנות לוגי (21 נק) 4.1: הסבירו בקצרה מדוע כל תוכנית ב- Programming Relational Logic היא ברת הכרעה: (3 נק) מס' ה- terms בתוכנית RLP כלשהי ובשאילתא נתונה הוא סופי (עד כדי שינוי שמות המשתנים) כתוצאה מכך, מס' ה- goals האפשריים בעץ ההוכחה עבור השאילתא הוא סופי. לכן, אם בנתיב מסויים בעץ ההוכחה מופיע אותו ה- goal יותר מפעם אחת (עד כדי שינוי שם המשתנה), הרי זה אומר שנגזר עליו להופיע שוב, ואנו יכולים לעצור ולהכריז כי נתיב זה הוא אינסופי. במקרים האחרים נגיע לעלה כישלון או הצלחה. natural_number(0). natural_number(s(n)) :- natural_number(n). היזכרו בהגדרת מספרי צ'רץ': נגדיר את היחס gt אשר מתקיים כאשר הארגומנט הראשון גדול יותר מן הארגומנט השני: gt(s(x),0) :- natural_number(x). gt(s(x), s(y)) :- gt(x,y). 4.2: פרטו את צעדי החישוב עבור מציאת ה- unifier הבא: (3 נק) unify( gt(s(s(0)), X), gt(s(x), 0) ) Let A=gt(s(s(0)), X), B=gt(s(X), 0) s={} A s=gt(s(s(0)), X), B s=gt(s(x), 0) s={x=s(0)} A s=gt(s(s(0)), s(0)), B s=gt(s(s(0)), 0) Fail 15

lte( 0, 0 ). 4.3 הוסיפו את היחס lte/2 אשר מתקיים כאשר X קטן או שווה ל- Y (5 נק) lte( 0, s(n)) :- natural_number(n) lte( s(a), s(b) ) :- lte(a, B) 4.4: השלימו את הקוד הבא עבור פרדיקט אשר בודק האם איבר מסוים נמצא במקום הנכון ברשימה ממוינת (של מספרי צ'רץ'): (5 נק) insert(h, [], [H]).insert(H, [X Y], [H,X Y]) :- gt(x, H). insert(h, [X Y], [X Z]) :- insert(h, Y, Z). insert(h, [], [H]). insert(h, [X Y], [H, X Y]) :- lte(h, X). insert(h, [X Y], [X Z]) :- insert(h, Y, Z), lte(x, H). sort([],[]). 4.5: השלימו את הקוד הבא אשר ממין רשימה ע"י : insertion sort (5 נק) sort([h T], R) :- sort(t,tr), insert(h,tr,r). 16

שאלה 5: רשימות עצלות ו- CPS (22 נק) 5.1: האם ניתן להשוות בין שתי רשימות עצלות? אם כן, כתבו את הפרדיקט?lzl-equal אם לא, הסבירו מדוע. (3 נק) לא ניתן להשוות בין רשימות עצלות: לא ניתן להשוות בין האיברים שלהן כיוון שהן יכולות להיות אינסופיות. כמו כן לא ניתן להשוות בין ה- closures אשר מייצרים את המשך הרשימה. 5.2: ניזכר באלגוריתם של ניוטון לחישוב שורש של מספר: (9 נק) מטרה: חשב x : x.1 המשתנה y הוא ניחוש של הערך (נתחיל תמיד עם ניחוש של 1) ניחוש מוצלח יותר מתקבל מהחישוב הבא: y+ x y 2 חזור על החישוב עד שהניחוש בריבוע שווה בערך ל- x.2.3 כתבו את הרשימה העצלה sqrt-lzl אשר מכילה את כל הניחושים של השורש מהאלגוריתם. השתמשו בממשקים לעבודה עם רשימות עצלות:.cons-lzl, head, tail כמו כן נתונה לכם הפונקציה המחשבת את הניחוש המוצלח יותר,.improve דוגמה: > (take (sqrt-lzl 2) 5) '(1 1.5 1.4166666666666665 1.4142156862745097 1.4142135623746899) (define improve (λ (guess x) (/ (+ guess (/ x guess)) 2.0))) 17

(define sqrt-lzl (λ (x) (letrec ([iter (λ (guess x) (cons-lzl guess (λ () (iter (improve guess x) x))))]) (iter 1 x)))) 18

CPS 5.3 (10 נק) ממשו את הפרוצדורה $$ filter שמקבלת פרדיקט $pred שכתוב בצורת CPS רשימה lst ו- -continuation cont ומעבירה ל- cont את רשימת האיברים המקיימים את הפרדיקט. See https://www.cs.bgu.ac.il/~ppl182/wiki.files/class/notebook/4.2cps.html#summary: -CPS-Transformation ;; Purpose: filter in CPS ;; Type: [[T1 * [bool -> T2] -> T2] * List(T1) * [List(T1) -> T2] -> T2] (define filter$$ (lambda (pred$ lst cont) (cond ((empty? lst) (cont lst)) (else (pred$ (car lst) (lambda (pred-res) (cond (pred-res (filter$$ pred$ (cdr lst) (lambda (filter-cdr-res) (cont (cons (car lst) filter-cdr-res))))) (else (filter$$ pred$ (cdr lst) cont))))))))) 19