Structural induction

אינדוקציה היא כלי חזק להוכחה של טענות ובפרט של תכונות של תוכניות ושפות.
ההוכחה באינדוקציה מחולקת לשלושה חלקים:

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

הגדרה רקורסיבית של קבוצות

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

אינדוקציה מתמטית

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

לדוגמה נגדיר את הקבוצה הבאה

3AaA:a+3A

בעצם A={3n | nN} .

נרצה להוכיח ש 3nA:3|a . קל להוכיח זאת באינדוקציה מתמטית. הבסיס יהיה a=3 וההנחה תהיה שמתקיים עבור aA כלשהו וקל להסביר למה עבור a+3 הטענה גם מתקיימת.

הגדרה: P(a) מוגדר להיות פרדיקט (טענה שמחזירה true או false ) כלשהו על a במקרה הזה 3|a .

נשים לב: היינו יכולים להגדיר את a כאיבר מהצורה 3n ולהוכיח באינדוקציה מתמטית עם הבסיס n=1

אינדוקציה מבנית

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

נניח שיש לנו A קבוצה של איברים שנוצרה מהגדרה רקורסיבית, נרצה להוכיח שמתקיים פרדיקט P לכל איבר בקבוצה. כלומר : aA:P(A)= true  .

בסיס האינדוקציה: נראה ש P מתקיים עבור איבר הבסיס.
הנחת האינדוקציה: נניח P(a) עבור aA כללי.
צעד האינדוקציה: אם הטענה נכונה לאיבר aA אז הטענה נכונה לאיברים ש״נובעים״ ממנו לפי כללי הרקורסיה.

לדוגמה - עבור הדוגמה של אינדוקציה מתמטית ממקודם הבסיס יהיה האיבר 3 וכמובן שמתקיים 3|3 .
ההנחה תהיה P(a) עבור a כלשהו כלומר 3|a . האיבר הבא הוא a+3 ולכן טריוויאלי שהוא מקיים 3|a+3 .

דוגמה 2:
נגדיר קבוצה A כ

(4,5),(5,4)A(a,b)A(a+5,b+4),(a,b+9)A

נרצה להוכיח את הטענה ש (a,b)A:9|(a+b) כלומר P(a,b):9|(a,b) .

בסיס האינדוקציה: איברי הבסיס הנ״ל מקיימים את הדרוש שכן סכומם הוא 9.
הנחת האינדוקציה: נניח P(a,b) עבור (a,b)A
צעד האינדוקציה: מההנחה מתקיים 9|a+b נתבונן באיברים הבאים בתור: (a+5,b+4),(a,b+9)
נסמן a+b=9k שכן הסכום מתחלק ב9 . מתקיים ש a+5+b+4=9k+9=9(k+1) שכמובן מתחלק ב9. ועבור האיבר השני a+b+9=9k+9=9(k+1) שבאותו אופן מתחלק ב9

אינדוקציה מבנית על עצים בינאריים

נוכיח טענה באמצעות אינדוקציה מבנית על עץ בינארי מלא. נרצה להוכיח את הטענה שכמות העלים שווה לכמות הקודקודים הפנימיים בעץ ועוד אחד.

לשם נוחות נסמן: e(t) - פונקציה המחזירה את כמות העלים בעץ , b(t) - פונקציה המחזירה את כמות הקודקודים הפנימיים בעץ. צ״ל ש e(t)=b(t)+1

בסיס: עבור עץ T עם קודקוד בודד מתקיים e(T)=1 ו b(T)=0 ולכן מתקיים הדרוש.
הנחה: עבור עץ T1 מתקיים e(T1)=b(T1)+1 וכנ״ל עבור עץ T2.

צעד: נגדיר T שהוא עץ עם קודקוד שורש ותת עץ ימני שהוא T2 ותת עץ שמאלי שהוא T1. מתקיים :

e(T)=e(T1)+e(T2)=b(T1)+b(T2)+2

מתקיים גם ש

b(T)=b(T1)+b(T2)+1

כאשר התוספת 1 היא בגלל קודקוד השורש. אם נציב במשוואה למעלה נקבל e(T)=b(T)+1 כדרוש .

אינדוקציה מבנית על דקדוק חסר הקשר

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

Production Rules:

N0NS(N)

Backus-Naur Form (BNF):

N::=0|S(N)

Derivation Rules:

zero   0Nsucc  xNS(x)N

כאשר הסימון של כללי גזירה הוא ״מלמעלה אפשר לגזור את מה שכתוב למטה״.

כעת נייצג את הקבוצה M באופן הבא:

M::=0|S(0)|S(S(M))

ובאמצעות כללי גזירה :

zero   0Mone   S(0)Msucc  xMS(S(x))M

נרצה להוכיח ש N=M על ידי הכלה דו כיוונית באמצעות אינדוקציה מבנית.

: MN -
בסיס - עבור איברי הבסיס של M שהם (0,S(0)) נקבל ש 0N מהגדרה וגם מכלל הגזרה השני של המספרים הטבעיים 0NS(0)N .

הנחת האינדוקציה- יהי xMN .

צעד- אם xM אזי S(S(x))M ונרצה להראות שזה שייך גם ל N . קל להראות זאת באמצעות אותם כללי גזירה xN|S(x)N|S(S(x))N כלומר הפעלת כלל הגזירה succ פעמיים.

MN -
בסיס - איבר הבסיס של N הוא 0 ומכלל הגזירה מתקיים שהוא אכן ב M

הנחה - יהי xMN .

צעד- עבור xN מתקיים ש S(x)N ונרצה להוכיח שגם הוא שייך ל M. כיוון ש xM מתקיים ש S(S(x))M.

נשים לב שנתקלנו במבוי סתום, שכן לא ניתן לגזור מתוך החוקים של M את S(x) .

מה עושים? הפתרון הוא להוכיח טענה חזקה יותר באמצעות אינדוקציה מבנית, במקרה הזה הפתרון הוא להוכיח ש xN:xMS(x)M . הסיבה שזה עובד היא בגלל כלל גזירה של M שלא ניצלנו אותו שהוא הכלל one .

אם נרצה להוכיח את הנ״ל נוכל להראות ש S(0)M בקלות כי 0M .
הכוח פה כעת הוא בהנחת האינדוקציה שכן נקבל xNMS(x)M וכעת בצעד יותר קל לנו להוכיח את הדרוש.

ביטויים אריתמטיים

נגדיר דקדוק חסר הקשר שיוצר ביטויים מתמטיים עם מספרים טבעיים והאופרטורים +,,()

E::=n|E+E|EE|(E)

או באמצעות סדרת כללי הגזירה

nEe1E    e2Ee1OPe2 where: OP{,+}eE(e)E

נשים לב שהדקדוק הוא רב משמעי, למשל נראה ש (5+3)2+5E באמצעות עץ גזירה

Screenshot 2024-01-13 at 2.27.40.png

AST

שפה מהסוג הנ״ל אפשר לבטא באמצעות Abstract Syntax Tree בעזרתו אפשר ליצור את כל המילים בשפה ונצטרך interpeter שיסביר מהי המשמעות (סמנטיקה).

אינדוקציה מבנית על פונקציות ב OCaml

נגדיר את הפונקציה הבאה בOCaml

let rec m = fun t -> match t with
	| Leaf(a) -> Leaf(a)
	| Node(t1,t2) -> Node(m(t2), m(t1))

פונקציה שעושה mirror לעץ בינארי (החלפה בין הילדים) ונרצה להוכיח את הטענה הבאה : T:m(m(T))=T כאשר T הוא עץ בינארי.

הוכחה שגויה

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

נראה כעת כיצד להוכיח באמצעות אינדוקציה מבנית:
בסיס- t=Leaf(a) עבור עלה כלשהו, לפי הגדרת m נקבל ש m(t)=t ולכן m(m(t))=t .

הנחה- יהיו t1,t2 מטיפוס tree ונניח m(m(t1))=t1,m(m(t2))=t2

צעד- t=Node(t1,t2) ומתקיים

m(m(t))=m(Node(m(t2),m(t1)))=Node(m(m(t1),m(m(t2))))=Node(t1,t2)=t

כדרוש