שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 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.