פרק 5: רשימות

5.1 מהי רשימה?

רשימה כשמה כן היא, רשימה של אברים. רשימה מאפשרת לנו לייצג בצורה מרוכזת אוסף של פריטים וכן לאחזר אותם במרוכז באמצעות שאילתות פשוטות.
המבנה התחבירי של רשימה בת n אברים הוא:

[item1, item2, …, itemn]

אברי הרשימה רשומים בינות לסוגריים מרובעים ומופרדים בפסיקים. האברים עצמם יכולים להיות כל ביטוי בפרולוג, כולל רשימות נפרדות. להלן מספר רשימות לדוגמא:

[]

[ron, [magic, spell], Harry, [], wizard(hermione), 120, 120]
רשימה ריקה.
זו רשימה שאין בה אף אבר, לכן אורכה 0
רשימה באורך 7 המכילה, משמאל לימין:
אטום, רשימה בת שני אברים, משתנה, רשימה ריקה, ביטוי מורכב, ושני מספרים.
שימו לב שאבר יכול להופיע יותר מפעם אחת ברשימה.
שימו לב לקוד האינטראקטיבי.

כל רשימה לא-ריקה ניתנת לפירוק לראש (head) ולזנב (tail).

הראש הוא האבר הראשון ברשימה, והזנב הוא כל היתר – כלומר הרשימה הנותרת לאחר הוצאת האבר הראשון. בדוגמא האחרונה שלנו, הראש הוא ron והזנב הוא הרשימה [[magic, spell], Harry,[], wizard(hermione), 120, 120].

פרולוג מציעה אופרטור מיוחד לפירוק רשימות: |.
האופרטור | משמש לפירוק רשימה לראש ולזנב, באופן הבא:

?- [Head | Tail] = [harry, ron, malphoy].
Head = harry
Tail = [ron, malphoy]
Yes

ראש הרשימה מוצב במשתנה Head וזנב הרשימה במשתנה Tail. למעשה, האופרטור | משמש לפרק רשימה בכל נקודה שהיא. למשל, אם ברצוננו להפריד את שלושת האברים הראשונים ברשימה מכל היתר, נציג את השאילתא הבאה:

?- [X1, X2, X3 | Tail] = [harry, ron, malphoy].
X1 = harry
X2 = ron
X3 = malphoy
Tail = []
Yes

זכרו: הרשימה הריקה היא רשימה מיוחדת - אין לה מבנה פנימי. לכן לא ניתן לפרקה לראש ולזנב, כפי שמראה דוגמת ההרצה הבאה:

?- [Head | Tail ] = [].
No

המשתנה חסר הזהות (_)

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

[harry, ron, malphoy, hermione]

נוכל לקבל את המידע על ידי הצגת השאילתא הבאה:

?- [X1, X2, X3 | Tail] = [harry, ron, malphoy, hermione].
X1 = harry
X2 = ron
X3 = malphoy
Tail = [hermione]
Yes

אמנם קבלנו את המידע שרצינו (במשתנים X1 ו-X3), אבל קבלנו גם מידע מיותר: X2 ו- Tail.

את המידע המיותר אפשר להעלים על ידי שימוש במשתנה מיוחד, הקרוי המשתנה חסר הזהות. הוא מסומן כקו תחתון: _ (underscore), ותפקידו "לתפוס מקום" של משתנים שאיננו מעונינים בתוכנם, שכן פרולוג לא מחזיר ערך עבורו.

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

?- [X1, _, X3 | _] = [harry, ron, malphoy, hermione].
X1 = harry
X3 = malphoy
Yes

מבוא

נושאים בסיסיים

נושאים מתקדמים

סיכום

© כל הזכויות שמורות למערכת המידע איתן