שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2023 - מערכות טיפוסים

להלן נתונה תוכנית בשפת "ויקיש" (INFERRED):

(proc (x : !) zero?(x)  let z=7 in z)


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


א. (15 נקודות)


הקצו לביטוי הנתון ולתתי הביטויים שלו משתני-טיפוס (Type Variables) מתאימים, וחברו משוואות מתאימות לביטויי הנתון ולתתי הביטויים שלו.


ב. (15 נקודות)


פתרו את המשוואות שהרכבתם בסעיף א׳ תוך שימוש ב- substitution ו- unification בדומה למתואר בספר בעמודים 252–258. בסיום פתרון המשוואות רשמו מהו הטיפוס שאותו הקשתם עבור התוכנית הנתונה.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחה2023סמסטר ב
מערכות טיפוסיםהסקת טיפוסיםתכנות פונקציונלי
בשפת INFERRED גוף ה-proc הוא ביטוי יחיד. התחביר proc (x : Type) Expression מאפשר בדיוק ביטוי אחד כגוף. הקצו: t0 לכל הביטוי, tx ל-x, tbody לגוף ה-proc. הכלל: zero?(e) דורש שטיפוס e יהיה int ומחזיר bool. פתרו עם unification.
הבהרה תחבירית:

בשפת INFERRED (פרק 7 ב-EOPL), תחביר proc הוא:
Expression ::= proc (Identifier : Type) Expression

הגוף הוא ביטוי יחיד. בשפה זו אין begin/sequence. לכן בתוכנית:

(proc (x : !) zero?(x)  let z=7 in z)

הגוף של ה-proc הוא zero?(x) בלבד — זהו ביטוי שלם. הביטוי let z=7 in z מופיע אחרי סיום גוף ה-proc בתוך הסוגריים החיצוניים, אך מבחינה תחבירית ב-INFERRED גוף ה-proc אינו יכול לכלול שניים — הפרסר לוקח את הביטוי הראשון (zero?(x)) כגוף, ו-let z=7 in z הוא תוספת שאינה חלק מגוף ה-proc.


מסקנה: הגוף הוא zero?(x), טיפוס ה-proc הוא int → bool.


---


סעיף א — הקצאת משתני טיפוס ובניית משוואות:


נסמן:
-
: טיפוס הביטוי הכולל (proc (x : !) zero?(x))
-
: טיפוס הפרמטר x
-
: טיפוס גוף ה-proc, כלומר zero?(x)

משתני הטיפוס הנוספים הנובעים מתת-הביטויים:
- הביטוי zero?(x): zero? הוא פרימיטיב בעל טיפוס int → bool. הוא מוחל על x.

- ! (unknown type annotation) מקבל משתנה טיפוס חדש, נסמנו
.

משוואות:


1. כלל proc: גוף ה-proc הוא
, הפרמטר הוא :


2. כלל zero?: zero?(x) דורש ש-x יהיה מטיפוס int, ומחזיר bool:



(הסימן ! בהכרזת הפרמטר מציין טיפוס לא-ידוע שיוסק — הוא מקבל את משתנה הטיפוס
.)

---


סעיף ב — פתרון המשוואות (substitution ו-unification):


נתחיל עם substitution ריקה
.

שלב 1: ממשוואה (2), נאחד
עם :


שלב 2: ממשוואה (2), נאחד
עם :


שלב 3: ממשוואה (1), נציב את
ונקבל:


Substitution סופי:


הטיפוס של התוכנית:


כלומר, התוכנית היא פרוצדורה המקבלת ארגומנט מסוג int ומחזירה ערך מסוג bool.