פרולוג/עובדות
עובדות הן מקור המידע הבסיסי ביותר של תוכנית לוגית. עובדה יכולה להיות יחס, במקרה הפשוט, או חוק, במקרה הכללי. מטרת פרק זה לעמוד על היחס הפשוט, תוך מתן דוגמאות לחוקים פשוטים לצורך שלמות. הפרק על חוקים עוסק בחוקים באופן מקיף יותר.
תחביר
עריכהכיצד מריצים את התוכנית? הביטו בנהלי העבודה. |
- (אנגלית) כל עובדה תתחיל באות קטנה.
- כל עובדה מורכבת מיחס ומאטום אחד לפחות, בצורה:
יחס_כלשהו(אטום1,אטום2,אטום3).
- כל עובדה מסתיימת בנקודה(.).
- אותיות אנגליות גדולות הן מוסכמה למשתנים.
- פרולוג מתייחסת אל כל מחרוזת שמתחילה בקו תחתון (_) כאל משתנה.
דוגמאות
עריכהדוגמה גינאולוגית
עריכהנכתוב ביטויים (הצהרות) אשר יגדירו את היחסים "אב" ("father"), "אם" ("mother") בין שני אטומים נתונים - (הרן,לוט), (אברהם,יצחק) וכו'.
עברית | אנגלית |
---|---|
אב(הרן,לוט). אב(הרן,מילכה). אב(אברהם,יצחק). אב(אברהם,ישמעאל). אב(יצחק,יעקב). אב(יצחק,עשו). אם(הגר,ישמעאל). אם(שרה,יצחק). אם(רבקה,יעקב). אם(רבקה,עשו). |
father(haran,lot).
father(haran,milka).
father(abraham,itzhak).
father(abraham,ishmael).
father(itzhak,jacob).
father(itzhak,esav).
mother(hagar,ishmael).
mother(sarah,itzhak).
mother(rivka,jacob).
mother(rivka,esav).
|
נבצע שאילתה אשר מטרתה לבדוק, האם, בהתאם לעובדות שהגדרנו, הרן הוא אביו של לוט:
?- אב(הרן,לוט). Yes
אבל כמובן שכן: כך הגדרנו!
נבקש כעת להציג את כל האטומים שהוגדרו להיות הבנים של אברהם:
?- אב(אברהם,_בנו). _בנו = 'יצחק' ; _בנו = 'ישמעאל'
נגדיר את החוקים "הורה", "אחים ביולוגיים":
SWI-Prolog אינה מכירה מילים שמורות בעברית, ולכן בדוגמה העברית מופיע האופרטור "לא שווה". תוכנת Amzi עם תוסף עברי יודעת לזהות את המילה "לא" כמילה השמורה "not", כך שניתן לכתוב לא(_אח1=_אח2). |
עברית | אנגלית |
---|---|
הורה(_הורה,_ילד):- אם(_הורה,_ילד); אב(_הורה,_ילד). אחים_ביולוגיים(_אח1,_אח2):- אב(_אותו_אב,_אח1), אם(_אותה_אם,_אח1), אב(_אותו_אב,_אח2), אם(_אותה_אם,_אח2), _אח1\=_אח2. |
parent(P,C):-
mother(P,C);
father(P,C).
bio_brothers(Y,Z):-
father(X,Y),
mother(W,Y),
father(X,Z),
mother(W,Z),
not(Y=Z).
|
- שימו לב:
- האופרטור
:-
מציין את הביטוי הלוגי "אם".- האופרטור
\=
פירושו "לא שוה". - המילה השמורה not הינה שער לוגי שהופך את הביטוי מ"אמת" ל"שקר" ומ"שקר" ל"אמת", ובדוגמה זו הוא זהה בשימושו לאופרטור \=.
- האופרטור
הרצת שאילתה כללית:
?- הורה(_הורה,_ילד). _הורה = 'הגר', _ילד = 'ישמעאל' ; _הורה = 'שרה', _ילד = 'יצחק' ; _הורה = 'רבקה', _ילד = 'יעקב' ; _הורה = 'רבקה', _ילד = 'עשו' ; _הורה = 'הרן', _ילד = 'לוט' ; _הורה = 'הרן', _ילד = 'מילכה' ; _הורה = 'אברהם', _ילד = 'יצחק' ; _הורה = 'אברהם', _ילד = 'ישמעאל' ; _הורה = 'יצחק', _ילד = 'יעקב' ; _הורה = 'יצחק', _ילד = 'עשו' ?- אחים_ביולוגיים(X,Y). X = 'יעקב', Y = 'עשו' ; X = 'עשו', Y = 'יעקב' ; No
- שימו לב:
- נקודה-פסיק (;) הוא האופרטור הלוגי "או" (or).
- פסיק (,) הוא האופרטור הלוגי "וגם" (and).
- קיבלנו את אותה תוצאה פעמיים, רק בסדר הפוך. לוגית, זה תקני.
- מה שמתחיל עם קו תחתון (_) מזוהה כמשתנה.
- במידה ויש מספר תוצאות אפשריות, לחיצה על (;) תציג את התוצאה הבאה, ובסוף יודפס No (כאשר אין תוצאות נוספות).
- למרות שהחוק הוגדר עם משתנים בשם Y,Z, אין שום מניעה להריץ שאילתה עם משתנים בשמות אחרים, כגון X,Y.
- המשתנים Z ,W (_אותו_אב, _אותה_אם) הם "פנימיים".
אתגר: # אילו עובדות צריך להוסיף כדי להגדיר את החוקים "son", "daughter"?
|
- יש להוסיף עובדות בנוסח "זכר(אברהם)", "נקבה(שרה)", כך שהחוק "בן" יוגדר:
בן(_בן,_הורה):-הורה(_הורה,_בן),זכר(_בן).
- רמז: צריך להשתמש בחוק "הורה".
- לשם כך יש צורך בחוק רקורסיבי!
דוגמה קולינרית
עריכה(tg הוא קיצור של tastes good...)
עברית | אנגלית |
---|---|
טעים(בננה,שוקולד). טעים(חומוס,מלפפון_חמוץ). טעים(חומוס,פלאפל). טעים(פלאפל,מלפפון_חמוץ). |
tg(banana,chocolate).
tg(humus,pickle).
tg(humus,falafel).
tg(falafel,pickle).
|
הביטויים הנ"ל מגדירים יחס בשם "טעים" ("tg") בין שני אטומים נתונים (בננה ושוקולד, חומוס ופלאלפל וכו').
נבצע שאילתה אשר מטרתה לבדוק, האם, בהתאם לעובדות שהגדרנו, (חומוס,פלאפל) ו-(טחינה,פלאפל) הם צירופים טעימים:
עברית | אנגלית |
---|---|
?- טעים(חומוס,פלאפל). Yes ?- טעים(פלאפל,חומוס). No ?- טעים(טחינה,פלאפל). No |
?- tg(humus,falafel).
Yes
?- tg(falafel,humus).
No
?- tg(tehina,falafel).
No
|
שימו לב:
- הצירוף (טחינה,פלאפל) לא הוגדר בתוכנית, ולכן התשובה היא "לא".
- הצירוף (פלאפל,חומוס) אף הוא לא הוגדר בתוכנית - הוגדר הצירוף ההפוך (חומוס,פלאפל). לכן גם במקרה זה התשובה היא "לא".
נשדרג את התוכנית על ידי הוספת כלל של סימטריה ושל זהות:
שימו לב: יש כאן טעות שטרם נמצאה! |
- סימטריה - אם חומוס טעים עם פלאפל, אז פלאפל טעים עם חומוס:
tg(X,Y):-tg(Y,X).
טעים(X,Y):-טעים(Y,X).
- זהות - חומוס טעים עם חומוס ופלאפל טעים עם פלאפל:
tg(X,X).
טעים(X,X).
אלו הן הכללות אשר חוסכות מאיתנו להוסיף סדרת עובדות כגון:
עברית | אנגלית |
---|---|
טעים(בננה,שוקולד). טעים(שוקולד,בננה). טעים(בננה,בננה). טעים(שוקולד,שוקולד). |
tg(banana,chocolate).
tg(chocolate,banana).
tg(banana,banana).
tg(chocolate,chocolate).
|
כדאי לדעת: החוק העצמי הינו חוק כללי, ויכול לתת תוצאות מצחיקות, כגון:?- טעים(קש,קש). Yes |
הרצת שאילתה (הפלט ארוך, בגלל חזרות, ולכן נביא רק את שלוש התוצאות הראשונות):
?- טעים(_משו1,_משו2). _משו1 = 'בננה', _משו2 = 'שוקולד' ; _משו1 = 'חומוס', _משו2 = 'מלפפון_חמוץ' ; _משו1 = 'חומוס', _משו2 = 'פלאפל' ; _משו1 = 'פלאפל', _משו2 = 'מלפפון_חמוץ' Yes
דוגמה אריתמטית
עריכהפרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.
סיכום
עריכה- עובדות הן אבני הבנין של תוכנית מחשב.
- כללים הינם הכללות שימושיות ונוחות של עובדות.