boy(harry).
hate(uncle_vernon, harry).
hate(aunt_petunia, harry).
התכנית עצמה די משעממת.
לשם שינוי נתמקד לא בתכנית, אלא בשאילתות שאפשר להציג לגביה: שאילתות עם משתנים. לדוגמא:
?- hate(X, harry).
אנחנו מבקשים מפרולוג לענות על סמך המידע שבידו "מי שונא את הארי?".
בשאילתות כאלה אנו מציגים לפרולוג טענות עם כמת ישי. אנחנו שואלים בעצם האם "יש X: hate(X, harry)". הכמת איננו נראה על פני השטח, אך הוא קיים ברמת המשמעות.
פרולוג עובר על התכנית שורה אחר שורה ומנסה להתאים את השאילתא hate(X, harry) עם ההנחות שהתכנית מכילה. החיפוש מניב התאמה (או האחדה) בין X לבין uncle_vernon על סמך השורה השניה בתכנית. פרולוג עונה בשלב ראשון:
X = uncle_vernon
כדי לקבל תשובות נוספות עלינו לבקש זאת במפורש, נקליד:
;
פרולוג ימשיך לחפש, וימצא:
X = aunt_petunia
נבקש הצבות נוספות על ידי הקלדת ; (נקודה-פסיק), אולם פרולוג יודיע "לא". משמעות הדבר שאין תשובות נוספות לשאילתא.
שימו לב שכאשר פרולוג מוצא הצבה מתאימה הוא מראה לנו אותה, ולא מסתפק בתשובה הכללית "כן".
ניתן להציג שאילתות מורכבות עם משתנים, למשל:
?- boy(Z), hate(uncle_vernon, Z).
פרולוג יחפש הצבה ל-X שמאמתת את שני חלקי טענת הגימום (זוכרים? פסיק משמעו "וגם" בפרולוג). תשובתו תהיה:
Z = harry
עד כה השתמשנו במשתנים כ"שומרי מקום" בשאילתות. כעת נראה שימוש חשוב נוסף במשתנים בתכניות עצמן. הביטו בתכנית הבאה:
hate(uncle_vernon, harry).
hate(aunt_petunia, harry).
hate(harry, uncle_vernon).
love(X, Y) :- hate(X,Z), hate(Y,Z).
החוק האחרון הוא הדרך להביע בפרולוג את האמרה הידועה "האויב של אויבך הוא חברך"... החוק הזה מבטא אמירה כללית: הוא מנוסח בעזרת משתנים, לא בעזרת שמות ספציפיים (הארי, דוד וורנון, וכו'), לכן הוא מתייחס לכולם.
לכן, לשאילתא הבאה נקבל את התשובה "הדוד וורנון":
?- love(aunt_petunia, K).
K = uncle_vernon
הדודה פטוניה אוהבת את הדוד וורנון על בסיס שנאתם המשותפת להארי...
מבחינה פורמלית, המשתנים X ו- Y בראש החוק האחרון מכומתים על ידי כמת כולל. המשתנה Z בגוף החוק מכומת על ידי כמת ישי.
|