רשימה כשמה כן היא, רשימה של אברים. רשימה מאפשרת לנו לייצג בצורה מרוכזת אוסף של פריטים וכן לאחזר אותם במרוכז באמצעות שאילתות פשוטות.
המבנה התחבירי של רשימה בת 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
|