פרולוג מאפשר לנו לפעמים להביע ביטויים בצורה נוחה וידידותית הדומה לדרך בה אנו רגילים להתבטא.
כך בביטויים חשבוניים, בהם מותר לנו לכתוב 9+2 במקום +(9,2); ביחסים, שם X < Z שקול ל- <(X,Z); בהאחדה, שם ניתן לכתוב X=hermione במקום =(X,hermione).
מתארים שניתן לכתוב אותם בינות למתוארים שלהם נקראים infix operators, כלומר אופרטורים הנכתבים בין הארגומנטים שלהם. דוגמאות: + , - , * , / ,= , == , is , ; , `,`.
בדומה, prefix operators הם אופרטורים בעלי מתואר אחד הנכתבים לפני המתואר. postfix operators הם אופרטורים בעלי מתואר אחד הנכתבים אחרי המתואר. לדוגמא, הסימן – הנכתב לפני מספר ומציין שהמספר שלילי הוא אופרטור prefix.
פרולוג מספק מתאר מיוחד display/1 אשר בהינתן ביטוי פרולוג, מציג אותו בכתיב רגיל בו אופרטורים נכתבים כמתארים לכל דבר. נפענח יחד את תשובתו של פרולוג לשאילתא הבאה:
?- display(?- 11 is 13+ -2).
?-(is(11, +(13, -2)))
Yes
איך יודע פרולוג לקבץ נכונה את הביטוי 11 is 13+ -2, ולא יוצר ייצוג חסר משמעות לביטוי זה, דוגמת +(is(11,13),-2)? איך יודע פרולוג לשמור על סדר פעולות חשבון בבואו לחשב ביטויים המכילים מספר פעולות?
המידע על "מי קודם למי" בחישוב המתוארים נקבע עבור כל אופרטור על ידי המתכנת. מידע זה נקרא באנגלית precedence, כלומר קדימות. הקדימות נקבעת כמספר בין 0 ל-1200, והעקרון הוא שאופרטור בעל קדימות נמוכה יחושב לפני אופרטור בעל קדימות גבוהה יותר. האופרטור בעל הקדימות הגבוהה ביותר יהיה המתאר הראשי של הביטוי.
אם נסתכל בהגדרות המובנות (built-in) של פרולוג, נבין מדוע הכפל מתבצע לפני החיבור בביטוי 1+2*3, גם כאשר אנו לא מוסיפים מפורשות את הסוגריים. אופטור החיבור + הוא בעל קדימות 500, בעוד אופרטור הכפל * הוא בעל קדימות 400 בלבד. הקדימות של is, לעומת זאת, היא 700, ולכן הוא המתאר הראשי בביטוי 11 is 10+1:
?- display(11 is 10+1).
is(11, +(10, 1))
Yes
מה קורה כאשר כל האופרטורים בביטוי מסוים הם בעלי אותה רמת קדימות? איך ייחשב פרולוג את הביטוי 1+2+3? הייצוג הפנימי של הביטוי הוא:
?- display(1+2+3).
+(+(1, 2), 3)
Yes
יתר על כן, מפליא לגלות כי:
?- 1+2+3 = 1+(2+3).
No
לצורך בחירת ייצוג פנימי חד-משמעי לביטויים כאלה יש להגדיר את האסוציאטיביות של האופרטור. האופרטור + נקרא left associative, או אסוציאטיבי לשמאל, שמשמעותו שהמתואר לשמאלו צריך להיות בעלי רמת קדימות שווה או נמוכה מזו של +, ואילו המתואר לימינו חייב להיות בעל רמת קדימות נמוכה ממש.
על פי הגדרה, רמת הקדימות של ביטוי פרולוג היא 0, אלא אם כן המתאר הראשי של הביטוי הוא אופרטור, ואז רמת הקדימות של הביטוי שווה לרמת הקדימות של האופרטור. רמת הקדימות של ביטוי המוקף סוגריים (…) שווה ל-0.
+ הוא אסוציאטיבי לשמאל, ולכן אילו היינו מייצגים את 1+2+3 בתור +(1,+(2,3)) הביטוי שלימין + הראשי היה בעל רמת קדימות זהה לזו של +, וזה לא חוקי. הוא חייב להיות בעל רמת קדימות נמוכה יותר.
יש אופרטורים שמוגדרים כלא-אסוציאטיביים, למשל is, <, =. אופרטורים לא-אסוציאטיביים הם אופרטורים ששני המתוארים שלהם חייבים להיות בעלי רמת קדימות נמוכה מזו של האופרטור עצמו.
|