שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2017 - הסקת טיפוסים
שאלה ג (25 נקודות)
להלן הצגה של מנונית תחכומה בשפה "יוטורג":
ברצונינו לקבוע מהו טיפוס תחכומה (אם קיימים), לשם כך, עיסקו להשתמש בהלוגוריתם בבחוניות שהוזכר בפרק 7 בסעיף טיפוס.
א (10 נקודות)
הקצו ליטורי תחכומים של טיפוס Type Variables של כל התחכומים בביטויים, וחברו משוואות משתנאות מהתחכומים לטיפוסים של קיימים שם.
להלן הצגה של מנונית תחכומה בשפה "יוטורג":
ברצונינו לקבוע מהו טיפוס תחכומה (אם קיימים), לשם כך, עיסקו להשתמש בהלוגוריתם בבחוניות שהוזכר בפרק 7 בסעיף טיפוס.
א (10 נקודות)
הקצו ליטורי תחכומים של טיפוס Type Variables של כל התחכומים בביטויים, וחברו משוואות משתנאות מהתחכומים לטיפוסים של קיימים שם.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמבחן 2017 סמסטר ב · 2017 · סמסטר ב
★★★★★
הסקת טיפוסיםמערכות טיפוסיםlet
יש לעבור על כל תת-ביטוי בתוכנית, להקצות לו משתנה טיפוס ייחודי, ולייצר משוואות אילוצים בהתאם לכללי הטיפוסיות של כל מבנה בשפה (קבוע, משתנה, let, if, proc, הפעלת פונקציה).
אלגוריתם הסקת הטיפוסים פועל בשני שלבים עיקריים: ראשית, הקצאת משתני טיפוס לכל תת-ביטוי. שנית, יצירת מערכת משוואות (אילוצים) על משתנים אלו על פי כללי הטיפוסיות של השפה. פתרון מערכת המשוואות יניב את הטיפוס של הביטוי, אם קיים.
שלב 1: הקצאת משתני טיפוס (Type Variables)
נקצה משתנה טיפוס לכל תת-ביטוי ולכל משתנה בתוכנית. נסמן את הטיפוס של ביטוי ב-:
שלב 2: יצירת משוואות טיפוסים
נגזור את מערכת המשוואות על סמך מבנה הביטוי וכללי הטיפוסיות:
1. קבועים ופרימיטיבים:
2. ביטוי `let y = 9 in ...`:
3. ביטוי `let z = zero?(-(y,3)) in ...`:
4. הפעלת הפעולה `-` על `(y,3)`:
5. הפעלת הפרדיקט `zero?`:
6. הגדרת הפרוצדורה `proc (w) ...`:
7. הפעלת המשתנה `w` על `z`:
8. ביטוי `if z then ... else ...`:
שלב 1: הקצאת משתני טיפוס (Type Variables)
נקצה משתנה טיפוס לכל תת-ביטוי ולכל משתנה בתוכנית. נסמן את הטיפוס של ביטוי ב-:
- (זהו הטיפוס של הביטוי כולו)
שלב 2: יצירת משוואות טיפוסים
נגזור את מערכת המשוואות על סמך מבנה הביטוי וכללי הטיפוסיות:
1. קבועים ופרימיטיבים:
- (הקבוע 9 הוא מספר שלם)
- (הקבוע 3 הוא מספר שלם)
- (הפעולה
-מקבלת זוג שלמים ומחזירה שלם) - (הפרדיקט
zero?מקבל שלם ומחזיר בוליאני)
2. ביטוי `let y = 9 in ...`:
- (המשתנה
yמקבל את הטיפוס של הביטוי אליו הוא נקשר) - (הטיפוס של ביטוי
letהוא הטיפוס של גוף הביטוי)
3. ביטוי `let z = zero?(-(y,3)) in ...`:
- (המשתנה
zמקבל את הטיפוס של הביטוי אליו הוא נקשר) - (הטיפוס של ביטוי
letהוא הטיפוס של גוף הביטוי)
4. הפעלת הפעולה `-` על `(y,3)`:
- (מכלל הטיפוסיות של הפעלת פונקציה)
5. הפעלת הפרדיקט `zero?`:
- (מכלל הטיפוסיות של הפעלת פונקציה)
6. הגדרת הפרוצדורה `proc (w) ...`:
- (הטיפוס של פרוצדורה הוא פונקציה מטיפוס הפרמטר לטיפוס הגוף)
7. הפעלת המשתנה `w` על `z`:
- (הטיפוס של
wחייב להיות פונקציה מהטיפוס שלzלטיפוס התוצאה)
8. ביטוי `if z then ... else ...`:
- (התנאי בביטוי
ifחייב להיות בוליאני) - (ענף ה-
thenוענף ה-elseחייבים להיות מאותו טיפוס) - (הטיפוס של ביטוי
ifהוא הטיפוס המשותף של שני הענפים)