על סמך סעיף 1 בהגדרה נוכל לקבוע התאמה בין קבועים:
?- =(33,34).
No
?- =(aunt_petunia, aunt_petunia).
Yes
שימו לב שניתן לנסח שאילתות אלה בדרך טבעית יותר, כאשר המתאר = נכתב בין המתוארים:
?- X = hermione.
לאור סעיף 2 בהגדרה, אנו מצפים שההאחדה תצליח והמשתנה X יקבל את ערכו של הקבוע hermione:
X = hermione
Yes
כדאי להבהיר בשלב זה את ההבדל בין מתאר ההתאמה = לבין מתאר השוויון =:=, שנתקלנו בו בפרק 2. = מנסה לבצע האחדה בין הביטויים משני צדדיו, ואיננו מבצע השוואה בין ערכיהם המספריים; זה תפקידו של =:=.
?- 9+2 = 9+2.
Yes
?- 9+2 = 11.
No
?- 9+2 =:= 11.
Yes
כאשר מתאימים בין שני משתנים, ערכיהם נקשרים זה לזה. כאשר יוצב ערך באחד, השני יקבל אותו ערך. על כן אין להתפלא על תגובתו של פרולוג (בגרסת SWI-Prolog):
?- X = Y.
X = _G164
Y = _G164
Yes
פרולוג קשר בין שני המשתנים X ו- Y באמצעות כבילתם למשתנה משותף שלישי, _G164 (אין משמעות לשמו של המשתנה המשותף).
לבסוף, דוגמא להתאמה של ביטויים מורכבים על פי סעיף 3 בהגדרה:
?- hates(aunt_petunia, harry) = hates(X, Y).
X = aunt_petunia
Y = harry
Yes
?- hates(aunt_petunia, harry) = hates(X, X).
No
בשתי הדוגמאות אנו מנסים להתאים ביטויים עם אותו מתאר ואותו מספר מתוארים. בפעם הראשונה ניתן לבצע האחדה, אך לא בפעם השניה, שם ההצבות למשתנה X אינן מתיישבות זו עם זו: בעקבות התאמה למתואר הראשון יוצב בו הערך aunt_petunia ולאחר התאמה עם המתואר השני - harry. ההאחדה נכשלת משום ש- X לא יכול לקבל שני ערכים שונים באותו ביטוי.
התאמה, או האחדה, היא תהליך בסיסי ורב חשיבות בשפת פרולוג. עם זאת, ההאחדות שפרולוג מבצע אינן "טהורות". פרולוג מיישם גישה נאיבית משהו להאחדה; פרולוג מנסה למצוא התאמות בכל שאילתא, גם במקרים בהם בדיקה דקדקנית יותר הייתה מגלה מראש שלא ניתן בשום אופן למצוא התאמה. התבוננו בשאילתא הבאה:
?- child(X) = X.
ניתן להוכיח שבמקרה זה הביטויים אינם מתאימים. אינטואיטיבית, כל הצבה ל-X לא תצליח להעלים את המתאר הנוסף שיש לביטוי משמאל, והביטויים יהיו שונים במתאר זה.
למרבה הפלא, פרולוג לא מרים ידיים ומנסה להתאים בין הביטויים. תשובתו היא:
Not enough memory to complete query!
או:
X = child(child(child(…(X)))).
מה קורה כאן?
פרולוג מנסה להציב עבור X ערך אינסופי, ונתקע בלולאה אינסופית עד שהזכרון שלרשותו אוזל.
בבואנו לכתוב תכניות ולהציג שאילתות בפרולוג, חשוב שנזכור תכונה זו של פרולוג על מנת להימנע מלולאות אינסופיות.
|