שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2023 - מערכות טיפוסים
להלן נתונה תוכנית בשפת "ויקיש" (INFERRED):
ברצוננו לקבוע מהו טיפוס התוכנית (אם קיים). לשם כך, עליכם להשתמש באלגוריתם שנלמד בפרק 7 להקשת הטיפוס.
א. (15 נקודות)
הקצו לביטוי הנתון ולתתי הביטויים שלו משתני-טיפוס (Type Variables) מתאימים, וחברו משוואות מתאימות לביטויי הנתון ולתתי הביטויים שלו.
ב. (15 נקודות)
פתרו את המשוואות שהרכבתם בסעיף א׳ תוך שימוש ב- substitution ו- unification בדומה למתואר בספר בעמודים 252–258. בסיום פתרון המשוואות רשמו מהו הטיפוס שאותו הקשתם עבור התוכנית הנתונה.
(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 הוא
מסקנה: הגוף הוא
---
סעיף א — הקצאת משתני טיפוס ובניית משוואות:
נסמן:
- : טיפוס הביטוי הכולל
- : טיפוס הפרמטר
- : טיפוס גוף ה-proc, כלומר
משתני הטיפוס הנוספים הנובעים מתת-הביטויים:
- הביטוי
-
משוואות:
1. כלל
2. כלל
(הסימן
---
סעיף ב — פתרון המשוואות (substitution ו-unification):
נתחיל עם substitution ריקה .
שלב 1: ממשוואה (2), נאחד עם :
שלב 2: ממשוואה (2), נאחד עם :
שלב 3: ממשוואה (1), נציב את ונקבל:
Substitution סופי:
הטיפוס של התוכנית:
כלומר, התוכנית היא פרוצדורה המקבלת ארגומנט מסוג
בשפת 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.