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

פרולוג (באנגלית: Prolog) היא שפת תכנות לוגית שפותחה במקור לכתיבת יישומי בינה מלאכותית. השפה היא שלמה טיורינג (Turing-Complete), כלומר ניתן לממש באמצעותה כל מה שאפשר לממש בשפות התכנות הנפוצות. שמה נגזר מצירוף המילים "תכנות בלוגיקה" (באנגלית: PROgramming LOGic).

השפה פותחה על ידי אלן קולמר (Alain Colmerauer <sub>אנ'</sub>) באוניברסיטת אקס-מרסיי והוכנסה לשימוש בשנת 1972. 

בעבר תלו בפרולוג תקוות גדולות והיו שחשבו שהיא מסמלת את הכוון העתידי של שפות התכנות. כיום אפשר לומר שהתקוות לא התממשו ופרולוג, אלגנטית ומעניינת ככל שתהיה, נותרה שפה אקדמית בלבד.

==מאפייני השפה==
בניגוד לשפות התכנות הנפוצות, תכנות בפרולוג איננו כתיבה של סדרת הוראות לביצוע. 
הרצה של תוכנית פרולוג היא הגדרת עובדות וכללים והצגת שאילתות לגביהם. מבחינה זו, יש קשר הדוק בין פרולוג לבסיסי נתונים. לפרולוג יש מנגנון הוכחה פנימי שנועד להשיב על שאילתות מורכבות. לב מנגנון ההוכחה הוא אלגוריתם להאחדה של תבניות (unification).
בנוסף, כולל מנגנון ההוכחה אלגוריתם פשוט של גישוש נסוג (Backtracking).

הקוד של פרולוג מבוצע בדרך כלל על ידי מפרש ולא עובר הידור. עובדה זו, בנוסף לעובדה שמנגנון ההוכחה איננו יעיל בדרך כלל, גורמים לתוכניות פרולוג לעבוד לאט יחסית. 

תכנות בפרולוג מורכב משני סוגי הצהרות: עובדות וכללים.
עובדה עשויה להיות מוגדרת ביטוי פשוט (אטום):
<syntaxhighlight lang="prolog">
.summer
</syntaxhighlight>
שאפשר להתייחס אליו כאל הטענה "עכשיו קיץ". עובדות יכולות גם להגדיר יחס על איבר בודד (פרדיקט), כגון
<syntaxhighlight lang="prolog">
.male(yoni)
.tall(yoni)
</syntaxhighlight>
שמגדירים את המשתנה yoni להיות "זכר" ו"גבוה". או על מספר איברים ואז תגדיר יחסים, כגון:
<syntaxhighlight lang="prolog">
.love(yoni, rotem)
</syntaxhighlight>
שמגדיר שיוני "אוהב את" רותם. יש לשים לב שאף אחת מהמילים tall, love, yoni, rotem, איננה מוגדרת בשפה עצמה, ומשמעותן מתקבלת מהמשך השימוש במשתנים אלו.

סוג שני של הצהרות בשפה הוא כלל. למשל
<syntaxhighlight lang="prolog">
.love(rotem, X) :- male(X), love(X, rotem)
</syntaxhighlight>
שמגדירה שרותם אוהבת מישהו (X כאן הוא משתנה, כמו כל מילה שמתחילה באות גדולה) אם X זכר וגם X אוהב את רותם.
נגדיר כעת כלל נוסף:
<syntaxhighlight lang="prolog">
.married(X,Y) :- summer, love(X,Y), love(Y,X)
</syntaxhighlight>
כלל זה אומר ש-X ו-Y "נשואים" אם "עכשיו קיץ" וגם X "אוהב את" Y וגם Y "אוהב את" X.

לאחר שמגדירים עובדות וכללים, ניתן לשאול שאלות על מאגר הנתונים שבנינו. מי נשואים?
<syntaxhighlight lang="prolog">
.-? married(X,Y)
</syntaxhighlight>
והמפרש יגיב
<syntaxhighlight lang="prolog">
X = yoni
Y = rotem
</syntaxhighlight>

בגלל המבנה התיאורי, היכולת לנסח חוקים בצורה מופשטת ומנגנון ההוכחה המובנה, תוכניות פרולוג נוטות להיות קצרות ואלגנטיות מאד.

פרולוג מעצם טבעה היא שפה רקורסיבית - אימות השאילתה מתבצע באמצעות קריאות מקוננות חוזרות ונשנות על סט החוקים הנתון עד למסקנה החד משמעית בדבר נכונות השאילתה (במקרה של שאילתת נכונות), או עד גמר איסוף כל הפתרונות האפשריים (במקרה של שאילתה פתוחה השולחת פרמטרים למילוי).

כל תוכנית פרולוג היא למעשה אוסף של פסוקים לוגיים הידועים כפסוקי הורן (Horn Clauses).

אחד הנושאים המעניינים בהתפתחות שפת הפרולוג שהיווה מקור לוויכוחים אקדמיים מרים, הוא ההוספה של הגיזומים (Cut - תחביר: סימן קריאה !) לתחביר השפה.
ה-Cut, מצד אחד, מאפשר הגדלת יעילות הריצה בצורה משמעותית, על ידי כך שהמתכנת מגדיר לאינטרפרטר לא לבצע גישוש נסוג במקרים מסוימים, שבהם המתכנת יודע שהגישוש אינו רצוי מבחינתו או נידון להכשל; ומהצד השני, פוגם בצורה משמעותית בתחביר הדקלרטיבי של השפה, ומקרב אותה לשפות הפרוצדורליות (לדוגמה, הסדר שבו מוגדרים הפרדיקטים משפיע על תוצאות הריצה, תופעה שכמובן אין לה מקום בשפה דקלרטיבית אמיתית). בפרט, cut היא פקודה ולא הצהרה, ולכן היא שייכת לפרדיגמה האימפרטיבית בדומה לשפות סטנדרטיות יותר.

שפת הלוויין דטלוג מוגדרת כתת-שפה (חלקית ממש) של פרולוג, אשר מצד אחד יותר מצומצמת מפרולוג, אבל מצד שני היא דקלרטיבית אמיתית, ואינה תומכת בגיזומים.
בדטלוג גם אין פונקציות ומנגנון ההסקה שלה הוא מטה-מעלה, בניגוד לפרולוג שהיא מעלה-מטה. דטלוג משמשת בעיקר למסדי-נתונים לוגיים בתחומי הבינה העסקית.

==מימושים==
למחשבים אישיים התפרסם Turbo Prolog ו-[http://www.amzi.com Amzi!] פרולוג, שניהם כוללים מהדר לפרולוג.
כמו כן קיימת הרחבה גרפית ותמיכה בשפה העברית לאמזי פרולוג OW Prolog.

==ראו גם==
* מונחים בתוכנה

==לקריאה נוספת==
* קלוקסין ומליש, תכנות בשפת פרולוג, הוצאת אופוס, 1988.
<DIV dir=ltr>
* 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
</DIV>

==קישורים חיצוניים==

* בלה צירולניקוב, [https://archive.org/details/prolog-1988/ פרולוג - שפת בינה מלאכותית], הוצאת הוד-עמי, 1988
*[http://www.swi-prolog.org פרולוג] 
*[http://sites.google.com/site/cedarprolog/ Cedar- אינטרפרטר לשפת פרולוג]
*[http://www.amzi.com/articles/prolog_under_the_hood.htm הסבר על האופן ש-Amzi! פרולוג עובד]

==הערות שוליים==

קטגוריה:שפות תכנות
קטגוריה:תוכנות שהושקו ב-1972