פרולוג (שפת תכנות)

פרולוג (באנגלית: Prolog) היא שפת תכנות לוגית שפותחה במקור לכתיבת יישומי בינה מלאכותית. השפה היא שלמה טיורינג (Turing-Complete), כלומר ניתן לממש באמצעותה כל מה שאפשר לממש בשפות התכנות הנפוצות. שמה נגזר מצירוף המילים "תכנות בלוגיקה" (באנגלית: PROgramming LOGic). השפה פותחה על ידי אלן קולמר (Alain Colmerauer אנ') באוניברסיטת אקס-מרסיי והוכנסה לשימוש בשנת 1972. בעבר תלו[דרושה הבהרה] בפרולוג תקוות גדולות והיו שחשבו שהיא מסמלת את הכוון העתידי של שפות התכנות. כיום אפשר לומר שהתקוות לא התממשו ופרולוג, אלגנטית ומעניינת ככל שתהיה, נותרה שפה אקדמית בלבד. בניגוד לשפות התכנות הנפוצות, תכנות בפרולוג איננו כתיבה של סדרת הוראות לביצוע. הרצה של תוכנית פרולוג היא הגדרת עובדות וכללים והצגת שאילתות לגביהם. מבחינה זו, יש קשר הדוק בין פרולוג לבסיסי נתונים. לפרולוג יש מנגנון הוכחה פנימי שנועד להשיב על שאילתות מורכבות. לב מנגנון ההוכחה הוא אלגוריתם להאחדה של תבניות (unification). בנוסף, כולל מנגנון ההוכחה אלגוריתם פשוט של גישוש נסוג (Backtracking). הקוד של פרולוג מבוצע בדרך כלל על ידי מפרש ולא עובר הידור. עובדה זו, בנוסף לעובדה שמנגנון ההוכחה איננו יעיל בדרך כלל, גורמים לתוכניות פרולוג לעבוד לאט יחסית. תכנות בפרולוג מורכב משני סוגי הצהרות: עובדות וכללים. עובדה עשויה להיות מוגדרת ביטוי פשוט (אטום): .summer שאפשר להתייחס אליו כאל הטענה "עכשיו קיץ". עובדות יכולות גם להגדיר יחס על איבר בודד (פרדיקט), כגון .male(yoni) .tall(yoni) שמגדירים את המשתנה yoni להיות "זכר" ו"גבוה". או על מספר איברים ואז תגדיר יחסים, כגון: .love(yoni, rotem) שמגדיר שיוני "אוהב את" רותם. יש לשים לב שאף אחת מהמילים tall, love, yoni, rotem, איננה מוגדרת בשפה עצמה, ומשמעותן מתקבלת מהמשך השימוש במשתנים אלו. סוג שני של הצהרות בשפה הוא כלל. למשל .love(rotem, X) :- male(X), love(X, rotem) שמגדירה שרותם אוהבת מישהו (X כאן הוא משתנה, כמו כל מילה שמתחילה באות גדולה) אם X זכר וגם X אוהב את רותם. נגדיר כעת כלל נוסף: .married(X,Y) :- summer, love(X,Y), love(Y,X) כלל זה אומר ש-X ו-Y "נשואים" אם "עכשיו קיץ" וגם X "אוהב את" Y וגם Y "אוהב את" X. לאחר שמגדירים עובדות וכללים, ניתן לשאול שאלות על מאגר הנתונים שבנינו. מי נשואים? .-? married(X,Y) והמפרש יגיב X = yoni Y = rotem בגלל המבנה התיאורי, היכולת לנסח חוקים בצורה מופשטת ומנגנון ההוכחה המובנה, תוכניות פרולוג נוטות להיות קצרות ואלגנטיות מאד. פרולוג מעצם טבעה היא שפה רקורסיבית - אימות השאילתה מתבצע באמצעות קריאות מקוננות חוזרות ונשנות על סט החוקים הנתון עד למסקנה החד משמעית בדבר נכונות השאילתה (במקרה של שאילתת נכונות), או עד גמר איסוף כל הפתרונות האפשריים (במקרה של שאילתה פתוחה השולחת פרמטרים למילוי). כל תוכנית פרולוג היא למעשה אוסף של פסוקים לוגיים הידועים כפסוקי הורן (Horn Clauses). אחד הנושאים המעניינים בהתפתחות שפת הפרולוג שהיווה מקור לוויכוחים אקדמיים מרים, הוא ההוספה של הגיזומים (Cut - תחביר: סימן קריאה !) לתחביר השפה. ה-Cut, מצד אחד, מאפשר הגדלת יעילות הריצה בצורה משמעותית, על ידי כך שהמתכנת מגדיר לאינטרפרטר לא לבצע גישוש נסוג במקרים מסוימים, שבהם המתכנת יודע שהגישוש אינו רצוי מבחינתו או נידון להכשל; ומהצד השני, פוגם בצורה משמעותית בתחביר הדקלרטיבי של השפה, ומקרב אותה לשפות הפרוצדורליות (לדוגמה, הסדר שבו מוגדרים הפרדיקטים משפיע על תוצאות הריצה, תופעה שכמובן אין לה מקום בשפה דקלרטיבית אמיתית). בפרט, cut היא פקודה ולא הצהרה, ולכן היא שייכת לפרדיגמה האימפרטיבית בדומה לשפות סטנדרטיות יותר. שפת הלוויין דטלוג מוגדרת כתת-שפה (חלקית ממש) של פרולוג, אשר מצד אחד יותר מצומצמת מפרולוג, אבל מצד שני היא דקלרטיבית אמיתית, ואינה תומכת בגיזומים. בדטלוג גם אין פונקציות ומנגנון ההסקה שלה הוא מטה-מעלה, בניגוד לפרולוג שהיא מעלה-מטה. דטלוג משמשת בעיקר למסדי-נתונים לוגיים בתחומי הבינה העסקית. למחשבים אישיים התפרסם Turbo Prolog ו-Amzi! פרולוג, שניהם כוללים מהדר לפרולוג. כמו כן קיימת הרחבה גרפית ותמיכה בשפה העברית לאמזי פרולוג OW Prolog. מונחים בתוכנה קלוקסין ומליש, תכנות בשפת פרולוג, הוצאת אופוס, 1988. Leon Sterling and Ehud Shapiro, The Art of Prolog: Advanced Programming Techniques, 1994 Ivan Bratko, Prolog - Programming for Artificial Intelligence, 1990 Patrick Blackburn, Johan Bos, Kristina Striegnitz: Learn Prolog Now! College Publications, 2006 בלה צירולניקוב, פרולוג - שפת בינה מלאכותית, הוצאת הוד-עמי, 1988 פרולוג Cedar- אינטרפרטר לשפת פרולוג הסבר על האופן ש-Amzi! פרולוג עובד תיעוד על המהדר של Amzi!, באתר של Amzi! הסבר על Visual Prolog, באתר של Visual Prolog, המהדר שלהם מבוסס על המהדר המקורי של Turbo Prolog