9משפט קוק–לוין

השיעור מוכיח את משפט קוק–לוין: SAT היא NP-שלמה, על ידי קידוד טבלת החישוב של מוודא פולינומי כלשהו כנוסחת CNF שבה כל בדיקה היא מקומית — חלון בגודל 2×3.

ביטחון: high1 הקלטות3 עמודי סיכוםnp-completenesscook-levinsattableaureductionsturing-machines

נשען על: שיעור 4, שיעור 5, שיעור 6, שיעור 7

עמודי הסיכום בכתב יד

פתיחת עמוד 1 בגודל מלא

סיבוכיות שיעור 9 קוק לוין.pdf

עמוד 1 מתוך 3 בסיכום הכתב יד

בקצרה

  • השיעור מוכיח את משפט קוק–לוין: SAT\mathrm{SAT} היא NP-complete. זו הבעיה ה-NP-שלמה הראשונה, וממנה נגזרות כל האחרות ברדוקציות.
  • מה שצריך להראות הוא: לכל שפה A∈NPA\in \mathrm{NP} קיימת רדוקציית זמן פולינומי A≤pSATA\le_p \mathrm{SAT}. שימו לב לסדר הכמתים — לא "יש רדוקציה אחת שטובה לכל השפות", אלא לכל שפה רדוקציה משלה.
  • הקושי: על AA לא ידוע דבר מלבד היותה ב-NP. כל מה שיש ביד הוא מכונה מוודאת MM, פולינומים p,qp,q, והקלט xx עצמו. את העד ww אין ביד — ובדיוק את אי-הידיעה הזאת אנחנו הופכים לחופש של ההשמה.
  • הרעיון: לקודד את טבלת החישוב (tableau) של MM על (x,w)(x,w) — כל שורה היא קונפיגורציה שלמה, שורה לכל צעד זמן — במשתנים בוליאניים xi,j,sx_{i,j,s}, ולבנות נוסחת CNF שנוסחה φ=φtable∧φstart∧φaccept∧φmove\varphi=\varphi_{table}\wedge\varphi_{start}\wedge\varphi_{accept}\wedge\varphi_{move} שספיקה אם ורק אם קיים ww שעליו MM מקבלת.
  • ליבת ההוכחה: קידוד נאיבי של "שורה i+1i+1 נובעת משורה ii" דורש מספר מעריכי של גרירות (∣L∣2r(n)+1|L|^{2r(n)+1} מילויים אפשריים לשורה). המוצא הוא לוקליות החישוב במכונת טיורינג: בין שתי שורות עוקבות משתנים לכל היותר שלושה תאים סמוכים, ולכן די לבדוק שכל חלון 2×3 בטבלה חוקי — בדיקה מקומית שכופה נכונות גלובלית.
  • חשבון הגודל: O(r(∣x∣)2)O(r(|x|)^2) משתנים ו-O(r(∣x∣)2)O(r(|x|)^2) פסוקיות עד לקבועים התלויים רק ב-MM, כאשר r(n)=p(n+q(n))r(n)=p(n+q(n)) — כלומר פולינומי ב-∣x∣|x|, ולכן הרדוקציה רצה בזמן פולינומי.
  • שני הרעיונות שכדאי לקחת מהשיעור, גם מעבר למבחן [01:14:55]: מידול בעיה כנוסחת CNF, והחלפת גרירה גלובלית בבדיקה מקומית בגודל קבוע.

רקע ותלויות

הקובץ הזה נשען על ארבעה דברים שכבר נלמדו; כדי לא לשלוח אתכם אחורה, כולם מנוסחים כאן במלואם.

1. מודל המכונה (ראו שיעור 4). מכונת טיורינג דטרמיניסטית היא M=(Q,qstart,F,Σ,Γ,δ)M=(Q,q_{start},F,\Sigma,\Gamma,\delta) כאשר QQ קבוצת המצבים, qstart∈Qq_{start}\in Q מצב ההתחלה, F⊆QF\subseteq Q המצבים המקבלים (נסמן ב-qacceptq_{accept} את המצב המקבל, וניתן להניח שהוא יחיד), Σ\Sigma אלפבית הקלט, Γ⊇Σ∪{B}\Gamma\supseteq\Sigma\cup\{B\} אלפבית הסרט הכולל את הסימן הריק BB, ו-δ:Q×Γ→Q×Γ×{L,R}\delta:Q\times\Gamma\to Q\times\Gamma\times\{L,R\} פונקציית המעברים. נסמן ב-timeM(a)\mathrm{time}_M(a) את מספר הצעדים של MM על הקלט aa, וב-spaceM(a)\mathrm{space}_M(a) את מספר התאים בהם ביקרה.

הערה: גם הסיכום וגם ההרצה אינם רושמים את החמישייה/השישייה במפורש בשיעור הזה. רשמנו אותה כאן עם qstartq_{start} בפנים, כי qstartq_{start} מופיע בנוסחה φstart\varphi_{start} ואי אפשר בלעדיו.

2. ההגדרה של NP דרך מוודא (ראו שיעור 6). A∈NPA\in \mathrm{NP} אם ורק אם קיימת מכונת טיורינג דטרמיניסטית MM וקיימים פולינומים p,qp,q כך ש:

  1. לכל קלט aa מתקיים timeM(a)≤p(∣a∣)\mathrm{time}_M(a)\le p(|a|);
  2. לכל xx:   x∈A  ⟺  ∃w∈{0,1}q(∣x∣)\ \ x\in A\iff \exists w\in\{0,1\}^{q(|x|)} כך ש-MM מקבלת את (x,w)(x,w).

זו בדיוק נקודת הפתיחה של ההוכחה. המרצה מדגיש [00:04:15] שאפשר היה לעבוד גם עם ההגדרה דרך מכונה אי-דטרמיניסטית, וההוכחה דומה מאוד; בחרנו בדטרמיניסטית כי "אני יודע בכל צעד מה קורה בצעד הבא", וזה בדיוק מה שמאפשר את טיעון הדומינו בכיוון השני של ההוכחה.

3. רדוקציית זמן פולינומי, NP-קושי ו-NP-שלמות (ראו שיעור 7). A≤pBA\le_p B פירושו: קיימת פונקציה ff הניתנת לחישוב בזמן פולינומי כך שלכל xx מתקיים x∈A  ⟺  f(x)∈Bx\in A\iff f(x)\in B. כיוון החץ: A≤pBA\le_p B אומר ש-BB קשה לפחות כמו AA — כלומר BB הוא הבעיה הקשה. בהקלטה, כמו בכל דיבור חופשי, הכיוון מתהפך לפעמים; החץ הוא הקובע.

BB היא NP-hard אם לכל A∈NPA\in \mathrm{NP} מתקיים A≤pBA\le_p B. BB היא NP-complete אם בנוסף B∈NPB\in \mathrm{NP}.

4. SAT\mathrm{SAT} ונוסחאות CNF (ראו שיעור 7). SAT\mathrm{SAT} היא שפת נוסחאות הפסוקים הספיקות; אנחנו נבנה כאן נוסחת CNF, כלומר קוניונקציה של פסוקיות (דיסיונקציות של ליטרלים). הראנו כבר ש-SAT∈NP\mathrm{SAT}\in \mathrm{NP}: העד הוא ההשמה עצמה, אורכה לינארי בגודל הנוסחה, ובדיקת ההשמה היא לינארית.

5. בעיית שמונה המלכות (ראו שיעור 7). המרצה חוזר אליה שוב ושוב [00:09:27], [00:20:03] וקורא לה "משפט קוק–לוין בקטן": לקחנו לוח שחמט, הגדרנו משתנה בוליאני לכל משבצת ("יש מלכה / אין מלכה"), וכתבנו שלוש תת-נוסחאות — לשורות, לעמודות ולאלכסונים — וחיברנו ב-∧\wedge. כאן נעשה בדיוק את אותו הדבר, רק עם עוד אינדקסים ועם ארבע תת-נוסחאות במקום שלוש. שווה לרענן אותה לפני שקוראים הלאה.

נקודת מפתח מתודית מההרצה [00:05:19]–[00:06:52]. לפני שבונים משהו, כדאי לשאול שאלה תחבירית: מי המשתנים שיש לי ביד? הכלל ש"קיים מביא לי משתנים, ולכל מוחק אותם בסוף הסקופ" (כמו פתיחת בלוק בקוד) נותן: יש לי את MM, את pp, את qq — ובזמן ריצת הרדוקציה גם את xx, כי הרדוקציה מקבלת את xx כקלט. אין לי את ww, כי הוא נמצא בתוך "לכל xx" שנסגר. כל הבנייה שלהלן מקפידה על הכלל הזה, ואפשר לבדוק אותה בכל שלב בשאלה "האם השתמשתי כרגע רק במה שיש לי ביד?".


הגדרות

הגדרה 1: קידוד קונפיגורציה כשורה אחת

ניסוח. תהי MM מכונת טיורינג בקונפיגורציה שבה תוכן הסרט הוא γ1γ2⋯γm\gamma_1\gamma_2\cdots\gamma_m, המצב הוא qq והראש מצביע על התא kk. נקודד את הקונפיגורציה כמחרוזת אחת מעל האלפבית Γ∪Q\Gamma\cup Q: γ1⋯γk−1 q γk γk+1⋯γm\gamma_1\cdots\gamma_{k-1}\,q\,\gamma_k\,\gamma_{k+1}\cdots\gamma_m כלומר: סימן המצב נדחף לתוך המחרוזת מיד לפני התא שהראש קורא.

אינטואיציה. בשיעורים על חישוביות ציירנו את הסרט, סימנו את מיקום הראש במשולש קטן, ורשמנו את המצב מחוץ לסרט [00:10:29]. עכשיו אנחנו רוצים הכול על מחרוזת אחת, כי מחרוזת אחת אפשר לשים בשורה של טבלה. אז במקום המשולש והמצב שבחוץ, אנחנו "מסכמים" ששם המצב שנכתב בתוך המחרוזת מסמן גם את המצב וגם את מיקום הראש: הראש עומד על התו שמימין לו. שימו לב שהקידוד מאריך את המחרוזת בתא אחד ביחס לסרט — זהו ה-+1+1 שיופיע ברוחב הטבלה.

דוגמה (מהלוח, עמוד 1 בסיכום). סרט B B 0 1 0 B BB\,B\,0\,1\,0\,B\,B, הראש על ה-11, המצב q1q_1. הקידוד: B B 0 q1 1 0 B BB\ B\ 0\ q_1\ 1\ 0\ B\ B נניח δ(q1,1)=(q3,0,R)\delta(q_1,1)=(q_3,0,R): המכונה כותבת 00 במקום ה-11 וזזה ימינה. הקונפיגורציה הבאה מקודדת כ- B B 0 0 q3 0 B BB\ B\ 0\ 0\ q_3\ 0\ B\ B כלומר שני התאים ששינו את תוכנם הם התא של המצב והתא שמימינו — הם התחלפו: (q1,1)⇝(0,q3)(q_1,1)\rightsquigarrow(0,q_3).

דוגמה נגדית (מה זה לא). המחרוזת B B q1 0 q3 BB\,B\,q_1\,0\,q_3\,B אינה קידוד של קונפיגורציה: מופיעים בה שני סימני מצב, ולקונפיגורציה יש מצב אחד ומיקום ראש אחד. גם המחרוזת B B 0 1 BB\,B\,0\,1\,B (בלי אף סימן מצב) אינה קידוד חוקי. שתי הפסילות האלה הן בדיוק מה ש-φtable\varphi_{table} ו-φstart\varphi_{start} יצטרכו לדאוג לו.

הגדרה 2: טבלת החישוב (tableau)

ניסוח. בהינתן MM וקלט aa, טבלת החישוב היא מטריצה שבה השורה ה-ii היא הקידוד (לפי הגדרה 1) של הקונפיגורציה של MM על aa אחרי i−1i-1 צעדים. שורה 1 היא הקונפיגורציה ההתחלתית.

אינטואיציה. זה בדיוק מה שכתבתם במחברת כשלמדתם מכונות טיורינג: ציירתם את הסרט, הזזתם את הראש, מחקתם, כתבתם — ושרטטתם את הסרט מחדש [00:09:57]. הטבלה היא פשוט כל השרטוטים האלה זה מתחת לזה. היא מכילה את כל האינפורמציה על הריצה: תוכן הסרט, מיקום הראש והמצב בכל רגע [00:08:56] — ולכן אפשר לבחון בעזרתה אם הריצה היא ריצה חוקית ומקבלת. חשוב: אלה לא כל הקונפיגורציות האפשריות, אלא רק אלה שהריצה באמת עברה דרכן [00:10:29].

המידות. נניח A∈NPA\in \mathrm{NP} עם M,p,qM,p,q כלעיל, ויהי xx קלט באורך n=∣x∣n=|x|. הקלט של MM הוא (x,w)(x,w) שאורכו n+q(n)n+q(n), ולכן מספר הצעדים חסום ב-p(n+q(n))p(n+q(n)). נסמן r(n)=p(n+q(n))r(n)=p\big(n+q(n)\big) ואז:

  • מספר השורות בטבלה הוא r(n)r(n) — שורה לכל צעד זמן [00:13:43].
  • מספר העמודות הוא 2r(n)+12r(n)+1. למה פעמיים? [00:15:18]–[00:15:49] הזמן חוסם את המקום, ולכן הראש לא מתרחק יותר מ-r(n)r(n) תאים מנקודת ההתחלה — אבל אינני יודע מראש לאיזה כיוון הוא ילך, ולכן אני שומר r(n)r(n) תאים שמאלה ו-r(n)r(n) ימינה. ה-+1+1 הוא התא שבו נכתב סימן המצב [00:17:59].

מסקנה: הראש מתחיל בעמודה r(n)+1r(n)+1, מבצע לכל היותר r(n)−1r(n)-1 צעדים, ולכן סימן המצב תמיד נמצא בעמודה kk עם 2≤k≤2r(n)2\le k\le 2r(n) — לעולם לא בעמודות הקצה. זו עובדה שנשתמש בה בהוכחת הלמה המרכזית.

הערה חשובה — הטבלה דמיונית. המרצה חוזר על כך חמש פעמים לפחות [00:16:25], [00:18:31], [00:32:31]: הרדוקציה לא בונה את הטבלה ולא ממלאת אותה, כי כדי למלא אותה היה צריך את ww ואת ww אין לנו. הטבלה היא אובייקט שאנחנו חושבים עליו כדי לכתוב את הנוסחה; הרדוקציה כותבת רק נוסחה.

הגדרה 3: האלפבית LL והמשתנים xi,j,sx_{i,j,s}

ניסוח. נסמן L=ΓM∪{0,1}∪QML=\Gamma_M\cup\{0,1\}\cup Q_M — קבוצת כל הסימנים שיכולים להופיע בתא של הטבלה [00:21:07]. (הסימנים 0,10,1 מופיעים במפורש כי הם התווים של העד ww; אם {0,1}⊆ΓM\{0,1\}\subseteq\Gamma_M האיחוד מיותר, ואינו מזיק.) שימו לב ש-∣L∣|L| תלוי רק ב-MM ולא ב-xx.

יהי x=a1a2⋯anx=a_1a_2\cdots a_n. לכל 1≤i≤r(n)1\le i\le r(n) — אינדקס השורה, כלומר צעד הזמן — ולכל 1≤j≤2r(n)+11\le j\le 2r(n)+1 — אינדקס העמודה, כלומר התא — ולכל s∈Ls\in L, נגדיר משתנה בוליאני יחיד xi,j,sx_{i,j,s}.

אינטואיציה — וזו הנקודה שבה נופלים. תחבירית, xi,j,sx_{i,j,s} הוא פשוט משתנה. אין לו "משמעות"; שלושת האינדקסים הם רק שם, בדיוק כמו שאפשר לכתוב סכום עם שלושה אינדקסים [00:23:17]. סמנטית, כשתגיע השמה vv, נחשוב על v(xi,j,s)=1v(x_{i,j,s})=1 כאילו היא אומרת: "בתא (i,j)(i,j) של הטבלה כתוב הסימן ss" [00:24:19]. שאלת סטודנט בהרצה [00:23:47] — "מה זה ss?" — קיבלה תשובה בשני שלבים, ושווה לזכור את שניהם: פורמלית אין מה להסביר, זה אינדקס רץ על LL; אינטואיטיבית זה הסימן שנטען שכתוב בתא.

מה עוד לא נאמר. כרגע ההשמה יכולה לתת 11 גם ל-xi,j,sx_{i,j,s} וגם ל-xi,j,tx_{i,j,t} עם s≠ts\ne t — כלומר "בתא כתובים שני סימנים" [00:24:52]. שום דבר עדיין לא אוסר את זה. בדיוק בשביל זה קיימת φtable\varphi_{table}.

דוגמה. בטבלה של הדוגמה מסעיף "דוגמאות ותרגילים" למטה, בתא (1,4)(1,4) כתוב qstartq_{start}; כלומר בהשמה המתאימה v(x1,4,qstart)=1v(x_{1,4,q_{start}})=1 ו-v(x1,4,s)=0v(x_{1,4,s})=0 לכל s≠qstarts\ne q_{start}.

הגדרה 4: חלון 2×32\times3 וחלון חוקי

ניסוח. חלון בטבלה הוא תת-מטריצה של שתי שורות סמוכות ושלוש עמודות סמוכות. מאנדקסים חלון לפי התא השמאלי-עליון שלו [01:05:18]: החלון (i,j)(i,j) מורכב מהתאים (i,j)(i,j+1)(i,j+2)(i+1,j)(i+1,j+1)(i+1,j+2)\begin{matrix} (i,j) & (i,j+1) & (i,j+2)\\ (i+1,j) & (i+1,j+1) & (i+1,j+2)\end{matrix} ותכולתו היא שישייה (a1,a2,a3,a4,a5,a6)∈L6(a_1,a_2,a_3,a_4,a_5,a_6)\in L^6 לפי הסדר a1a2a3a4a5a6\begin{array}{|c|c|c|}\hline a_1 & a_2 & a_3\\\hline a_4 & a_5 & a_6\\\hline\end{array}

שישייה נקראת חוקית אם קיימת ריצה כלשהי של MM שבתיאור הטבלאי שלה מופיע חלון כזה [00:57:01]. שקול ומעשי יותר: השישייה חוקית אם ורק אם היא נובעת מ-δ\delta — כלומר קיימות קונפיגורציה CC ועוקבתה C′=δ(C)C'=\delta(C) ומיקום עמודה שבו החלון של שתי השורות המקודדות הוא בדיוק השישייה — או שהיא העתקה של שורה שמכילה מצב סופי [01:03:44]. נסמן את קבוצת השישיות החוקיות Legal(M)⊆L6\mathrm{Legal}(M)\subseteq L^6.

אינטואיציה. "חלון חוקי" הוא בדיקת שפיות מקומית: האם מה שרואים דרך חור המנעול הזה יכול היה לקרות במכונה MM? התשובה תלויה רק ב-δ\delta, כלומר רק ב-MM, ולא ב-xx, ולא ב-nn [01:06:22]. לכן אפשר לחשב את Legal(M)\mathrm{Legal}(M) פעם אחת, עוד לפני שראינו את הקלט, על ידי מעבר על כל ∣L∣6|L|^6 השישיות.

כמה שישיות יש? ∣L∣6|L|^6 — לא (∣L∣6)\binom{|L|}{6}. הסטודנט בהרצה ניחש "LL מעל 66" ותוקן [00:58:38]: השישיות אינן חייבות להיות מורכבות מסימנים שונים, ולכן זהו ∣L∣⋅∣L∣⋯∣L∣|L|\cdot|L|\cdots|L| שש פעמים. חשוב לא להתבלבל בבסיס ובמעריך.

כלל הריפוד (התוספת "העתקה של מצב סופי"). חסם הזמן pp הוא חסם מלמעלה; אף אחד לא הבטיח שהמכונה תרוץ בדיוק r(n)r(n) צעדים [01:03:12]. אם המכונה עצרה במצב מקבל אחרי t<r(n)t<r(n) צעדים, אין לנו שורות להמשיך איתן. הפתרון: מכריזים שהעתקה מדויקת של שורה שמכילה qacceptq_{accept} היא מעבר חוקי, וממלאים את שאר הטבלה באותה שורה שוב ושוב. המרצה מלווה את זה בבדיחה על ההוכחה של איש מדעי המחשב ש"כל האי-זוגיים ראשוניים": 3 ראשוני, 5 ראשוני, 7 ראשוני, 7 ראשוני, 7 ראשוני… [01:04:15]. זה בדיוק מה שקורה כאן, וכאן זה חוקי.

הערה: בהרצה נאמר כלל הריפוד רק עבור qacceptq_{accept}. אם המכונה עוצרת במצב דוחה לפני הזמן, אין שישייה חוקית שממשיכה את השורה ולכן φmove\varphi_{move} לא תסופק — וזה בסדר גמור, כי במקרה כזה אנחנו ממילא רוצים ש-φ\varphi תהיה לא-ספיקה. אפשר גם להרחיב את כלל הריפוד לכל מצב עוצר; אז φmove\varphi_{move} תסופק אבל φaccept\varphi_{accept} לא, והמסקנה זהה.

דוגמה נגדית לחוקיות. אם MM אף פעם לא זזה שמאלה, אז החלון 0q11q301\begin{array}{|c|c|c|}\hline 0 & q_1 & 1\\\hline q_3 & 0 & 1\\\hline\end{array} אינו חוקי: סימן המצב בשורה התחתונה נמצא שמאלה מהמקום שבו היה, כלומר הראש זז שמאלה [01:02:11].


משפטים והוכחות

משפט 1: משפט קוק–לוין

SAT\mathrm{SAT} היא NP-complete. כלומר: (א) SAT∈NP\mathrm{SAT}\in \mathrm{NP}, ו-(ב) לכל A∈NPA\in \mathrm{NP} מתקיים A≤pSATA\le_p \mathrm{SAT}.

סדר הכמתים — אזהרה מפורשת מההרצה [00:01:08]. הטענה היא "לכל שפה ב-NP קיימת רדוקציה ל-SAT\mathrm{SAT}", ולא "קיימת רדוקציה שמתאימה לכל השפות". לכל שפה תהיה רדוקציה משלה, שנבנית מהמוודא הספציפי שלה. זה מקור נפוץ מאוד לשגיאה בניסוח.

חלק (א): SAT∈NP\mathrm{SAT}\in \mathrm{NP}

בהינתן נוסחה ψ\psi מעל mm משתנים, העד הוא ההשמה המספקת v∈{0,1}mv\in\{0,1\}^m. אורכה m≤∣ψ∣m\le|\psi|, כלומר פולינומי (אפילו לינארי) בגודל הקלט; ובדיקה שההשמה מספקת נעשית במעבר אחד על הנוסחה, בזמן O(∣ψ∣)O(|\psi|). לכן SAT∈NP\mathrm{SAT}\in \mathrm{NP}. זה הוכח כבר בשיעור 7 והובא כאן כדי לסגור את הטענה; הסיכום עוצר בסוף עמוד 3 על "SAT\mathrm{SAT} היא NP-קשה" ואינו חוזר על החלק הזה.

חלק (ב): הבנייה

תהי A∈NPA\in \mathrm{NP}. לפי ההגדרה יש בידינו MM, pp ו-qq המקיימים את שני התנאים מסעיף "רקע ותלויות". נסמן n=∣x∣n=|x|, L=ΓM∪{0,1}∪QML=\Gamma_M\cup\{0,1\}\cup Q_M, r(n)=p(n+q(n))r(n)=p(n+q(n)), ונשתמש במשתנים xi,j,sx_{i,j,s} של הגדרה 3. נבנה φ=φtable∧φstart∧φaccept∧φmove\varphi=\varphi_{table}\wedge\varphi_{start}\wedge\varphi_{accept}\wedge\varphi_{move}

הרעיון המנחה, שכדאי להחזיק בראש לכל אורך הבנייה [00:07:56]: "**x∈Ax\in A" פירושו "קיים ww", ו"φ\varphi ספיקה" פירושו "קיימת השמה". אנחנו רוצים לגרור את הכמת הקיומי הזה מצד אחד לצד השני. כל ארבע התת-נוסחאות נועדו לוודא שהחופש היחיד שנשאר להשמה הוא בדיוק החופש בבחירת ww.

φtable\varphi_{table} — בכל תא בדיוק סימן אחד

φtable=⋀1≤i≤r(n)1≤j≤2r(n)+1( (⋁s∈Lxi,j,s) ∧ (⋀s,t∈Ls≠t(xi,j,s‾∨xi,j,t‾)))\varphi_{table}=\bigwedge_{\substack{1\le i\le r(n)\\ 1\le j\le 2r(n)+1}}\left(\ \left(\bigvee_{s\in L}x_{i,j,s}\right)\ \wedge\ \left(\bigwedge_{\substack{s,t\in L\\ s\ne t}}\big(\overline{x_{i,j,s}}\vee \overline{x_{i,j,t}}\big)\right)\right)

מה זה אוכף ולמה. הקוניונקציה החיצונית רצה על כל תא בטבלה. עבור תא נתון: הפסוקית הראשונה, ⋁s∈Lxi,j,s\bigvee_{s\in L}x_{i,j,s}, אומרת שלפחות אחד מהסימנים מקבל אמת בתא הזה. היא לבדה לא מספיקה — היא לא אוסרת שניים [00:29:23]. לכן באה הקבוצה השנייה של פסוקיות: לכל זוג סימנים שונים s≠ts\ne t, הפסוקית xi,j,s‾∨xi,j,t‾\overline{x_{i,j,s}}\vee\overline{x_{i,j,t}} אומרת שלא ייתכן ששניהם אמת — כלומר לכל היותר אחד. יחד: בדיוק אחד. זו בדיוק אותה תבנית "בחר בדיוק אחד מבין kk" שראינו בבעיית המלכות [00:29:55].

למה בכלל צריך את זה? שאלת סטודנטית בהרצה [00:34:09]: למה אסור שיהיו שניים? כי אני רוצה טבלה שמתארת סרט של מכונה, ובכל תא בסרט של מכונת טיורינג רשום בדיוק תו אחד, ובכל קונפיגורציה יש בדיוק מצב אחד. בלי האילוץ הזה, "הטבלה" שההשמה מתארת אינה טבלה בכלל.

טענה 1.1. לכל השמה vv המספקת את φtable\varphi_{table}, ולכל i,ji,j, קיים s∈Ls\in L יחיד כך ש-v(xi,j,s)=1v(x_{i,j,s})=1. ולהפך: לכל מילוי של הטבלה בסימנים מ-LL קיימת השמה המספקת את φtable\varphi_{table} ומתאימה לו.

הוכחה. כיוון ראשון: φtable\varphi_{table} היא קוניונקציה, ולכן השמה מספקת מספקת כל אחד מהאיברים; נקבע i,ji,j. האיבר המתאים הוא עצמו קוניונקציה של שני חלקים. מהחלק הראשון, ⋁sxi,j,s=1\bigvee_{s}x_{i,j,s}=1, נובע שקיים ss עם v(xi,j,s)=1v(x_{i,j,s})=1. מהחלק השני, לכל s≠ts\ne t מתקיים xi,j,s‾∨xi,j,t‾=1\overline{x_{i,j,s}}\vee\overline{x_{i,j,t}}=1, כלומר לא ייתכן ש-v(xi,j,s)=v(xi,j,t)=1v(x_{i,j,s})=v(x_{i,j,t})=1. ביחד: קיים ואין שניים, כלומר קיים יחיד [00:33:04]–[00:33:35].

כיוון שני: בהינתן מילוי T:{1..r(n)}×{1..2r(n)+1}→LT:\{1..r(n)\}\times\{1..2r(n)+1\}\to L, נגדיר v(xi,j,s)=1v(x_{i,j,s})=1 אם ורק אם T(i,j)=sT(i,j)=s. כל פסוקית מהצורה ⋁sxi,j,s\bigvee_s x_{i,j,s} מסופקת (על ידי s=T(i,j)s=T(i,j)), וכל פסוקית xi,j,s‾∨xi,j,t‾\overline{x_{i,j,s}}\vee\overline{x_{i,j,t}} מסופקת כי לכל היותר אחד מבין s,ts,t שווה ל-T(i,j)T(i,j). □\square

הערה: בהרצה הכיוון השני נאמר במשפט אחד — "ודרך אגב גם הפוך" [00:34:09] — ומיד אחריו הובהר למה הוא חשוב: "להפך חשוב בגלל הכיוון השני של הרדוקציה" [00:35:46]. בלי הכיוון השני אי אפשר להסיק מ"x∈Ax\in A" ש-φ\varphi ספיקה, כי צריך להמיר טבלה אמיתית להשמה. הפירוט לעיל הוא מה שההערה הזאת מייצגת.

חשוב מה φtable\varphi_{table} לא אומרת [00:32:01]: היא מבטיחה טבלה — אבל טבלה של ג'יבריש. שום דבר בה לא קושר את הטבלה למכונה MM או לקלט xx. את זה עושות שלוש הנוסחאות הבאות.

φstart\varphi_{start} — השורה הראשונה היא הקונפיגורציה ההתחלתית

יהי x=a1⋯anx=a_1\cdots a_n. אז φstart=x1,1,B∧x1,2,B∧⋯∧x1,r(n),B⏟blanks ∧ x1,r(n)+1,qstart ∧ x1,r(n)+2,a1∧⋯∧x1,r(n)+n+1,an⏟x\varphi_{start}= \underbrace{x_{1,1,B}\wedge x_{1,2,B}\wedge\cdots\wedge x_{1,r(n),B}}_{\text{blanks}}\ \wedge\ x_{1,r(n)+1,q_{start}}\ \wedge\ \underbrace{x_{1,r(n)+2,a_1}\wedge\cdots\wedge x_{1,r(n)+n+1,a_n}}_{x} ∧ (x1,r(n)+n+2,0∨x1,r(n)+n+2,1)∧⋯∧(x1,r(n)+n+1+q(n),0∨x1,r(n)+n+1+q(n),1)⏟w ∧ x1,r(n)+n+2+q(n),B∧⋯∧x1,2r(n)+1,B⏟blanks\wedge\ \underbrace{\big(x_{1,r(n)+n+2,0}\vee x_{1,r(n)+n+2,1}\big)\wedge\cdots\wedge\big(x_{1,r(n)+n+1+q(n),0}\vee x_{1,r(n)+n+1+q(n),1}\big)}_{w}\ \wedge\ \underbrace{x_{1,r(n)+n+2+q(n),B}\wedge\cdots\wedge x_{1,2r(n)+1,B}}_{\text{blanks}}

מה זה אוכף ולמה. בשורה 1 אני יודע כל תו — חוץ מ-ww [00:36:22]:

  • העמודות 1..r(n)1..r(n): תאים ריקים. אלה ה-r(n)r(n) תאים שמשמאל לראש, השמורים למקרה שהראש ילך שמאלה [00:37:56].
  • עמודה r(n)+1r(n)+1: qstartq_{start} — כאן מתחיל הראש.
  • עמודות r(n)+2r(n)+2 עד r(n)+n+1r(n)+n+1: הקלט xx, תו אחר תו.
  • עמודות r(n)+n+2r(n)+n+2 עד r(n)+n+1+q(n)r(n)+n+1+q(n): העד ww. כאן איני יודע מה כתוב, אבל אני כן יודע שני דברים: את האורך ואת זה שכל תא הוא 00 או 11 [00:39:31]. לכן במקום ליטרל יחיד יש פה פסוקית ( ⋅ ∨ ⋅ )(\,\cdot\,\vee\,\cdot\,).
  • שאר העמודות עד 2r(n)+12r(n)+1: תאים ריקים.

זו הנקודה שבה נכנס החופש. כל שאר הקוניונקציות הן ליטרלים יחידים ולכן כופות ערך; רק בתאי ww יש בחירה. לכן להשמה המספקת את φstart\varphi_{start} יש בדיוק q(n)q(n) ביטי חופש, והם מתאימים אחד לאחד לתווי ww [00:43:23]. המרצה מדגיש: "זה החופש שאני רוצה, כי אני רוצה לקשר בין 'קיים ww' ל'קיימת השמה'".

מה נדרש כדי לבנות אותה? [00:42:18] את xx עצמו (בשביל a1..ana_1..a_n), את nn, ואת הפולינומים rr ו-qq. הכול ביד. שימו לב לניואנס שהמרצה מדגיש כבדיקת שפיות: ב-φtable\varphi_{table} השתמשנו רק ב-n=∣x∣n=|x| ולא ב-xx עצמו; כאן אנחנו באמת צריכים את xx עצמו.

שאלה מהכיתה [01:03:12] סביב אילוץ המצב: למה φstart\varphi_{start} לא צריכה לומר גם "אין מצב אחר בשורה הראשונה"? כי φtable\varphi_{table} כבר אומרת שבכל תא כתוב בדיוק סימן אחד, וכל עמודה בשורה 1 קיבלה כאן ערך מפורש. עקרון העבודה הוא: כל תת-נוסחה עומדת בפני עצמה ודורשת רק את מה שהיא צריכה; העיקר שהן לא סותרות זו את זו [00:45:01].

φaccept\varphi_{accept} — איפשהו בטבלה יש מצב מקבל

φaccept=⋁1≤i≤r(n)1≤j≤2r(n)+1xi,j,qaccept\varphi_{accept}=\bigvee_{\substack{1\le i\le r(n)\\ 1\le j\le 2r(n)+1}}x_{i,j,q_{accept}}

מה זה אוכף ולמה. זו פסוקית אחת ארוכה: קיים תא בטבלה שכתוב בו qacceptq_{accept}. זה הכול [00:44:30].

שתי הערות דקות.

  1. אין צורך לדרוש יחידות — "בתא שכתוב בו qacceptq_{accept} לא כתוב שום דבר אחר" מובטח כבר על ידי φtable\varphi_{table} [00:45:31].
  2. מותר שיופיעו כמה תאים עם qacceptq_{accept}, ואף שכיח שכן: בגלל כלל הריפוד, ברגע שהגענו למצב מקבל אנחנו מעתיקים את השורה עד סוף הטבלה, ולכן qacceptq_{accept} יופיע בכל שורה משם והלאה. יחידות נדרשת ברמת התא, לא ברמת הטבלה.
φmove\varphi_{move} — הלב של ההוכחה

קודם: למה הקידוד הנאיבי נכשל. [00:48:06]–[00:50:11] אינטואיטיבית אני רוצה לומר: "אם השורה הראשונה מולאה כך — אז השורה השנייה מולאה כך". גרירות אינן מפחידות אותנו, כי α→β\alpha\to\beta שקול ל-α‾∨β\overline{\alpha}\vee\beta ולכן ניתן להמרה ל-CNF. הבעיה היא הכמות: כמה מילויים אפשריים יש לשורה אחת? לכל תא יש ∣L∣|L| אפשרויות ויש 2r(n)+12r(n)+1 תאים, כלומר ∣L∣2r(n)+1|L|^{2r(n)+1} מילויים. (הסטודנט שניחש "גודל שורה עצרת" תוקן: זו חזקה, לא עצרת [00:49:08].) אני לא יודע מראש איזו שורה תתקבל — כי אני לא יודע מה ww — ולכן אצטרך גרירה לכל מילוי אפשרי: מספר מעריכי של תת-נוסחאות. הנוסחה שלי חייבת להיות פולינומית ב-nn. אז זה נופל.

המוצא: לוקליות. [00:50:11]–[00:51:15] "היופי של ההוכחה, והיופי של המודל הזה" — החישוב במכונת טיורינג הוא מקומי מאוד. במעבר משורה לשורה הבאה, רוב מוחלט של התאים לא משתנים; המקומות היחידים שיכולים להשתנות הם התא של סימן המצב ותא אחד ימינה או שמאלה ממנו. לכן אין צורך לגרור שורה שלמה על שורה שלמה — מספיק לעבור על חלונות 2×32\times3 ולוודא שכולם חוקיים. זו בדיוק הסיבה שבגללה צריך מודל חישוב "פרימיטיבי אבל מדויק" כמו מכונת טיורינג [00:46:33].

הנוסחה. φmove=⋀1≤i≤r(n)−11≤j≤2r(n)−1[ ⋁(a1,…,a6)∈Legal(M)((xi,j,a1∧xi+1,j,a4)∧(xi,j+1,a2∧xi+1,j+1,a5)∧(xi,j+2,a3∧xi+1,j+2,a6))]\varphi_{move}=\bigwedge_{\substack{1\le i\le r(n)-1\\ 1\le j\le 2r(n)-1}}\left[\ \bigvee_{(a_1,\dots,a_6)\in \mathrm{Legal}(M)}\Big(\big(x_{i,j,a_1}\wedge x_{i+1,j,a_4}\big)\wedge\big(x_{i,j+1,a_2}\wedge x_{i+1,j+1,a_5}\big)\wedge\big(x_{i,j+2,a_3}\wedge x_{i+1,j+2,a_6}\big)\Big)\right]

התחומים. [01:05:18]–[01:05:51] — זו הייתה שאלת סטודנטית והתשובה שווה זכירה. החלון מאונדקס לפי התא השמאלי-עליון שלו. התא השמאלי-עליון יכול להגיע לכל היותר עד השורה שלפני האחרונה, כי לחלון יש שתי שורות — ומכאן i≤r(n)−1i\le r(n)-1. הוא יכול להגיע לכל היותר עד שתיים לפני העמודה האחרונה, כי לחלון יש שלוש עמודות ומספר העמודות הוא 2r(n)+12r(n)+1 — ומכאן j≤(2r(n)+1)−2=2r(n)−1j\le (2r(n)+1)-2=2r(n)-1.

הצורה: מ-DNF ל-CNF. כפי שנכתבה, כל תת-נוסחה של חלון היא דיסיונקציה של קוניונקציות, כלומר DNF ולא CNF. יש לזה תיקון סטנדרטי ופשוט שכדאי להכיר, והוא גם מקצר את הנוסחה: במקום למנות את השישיות החוקיות, אוסרים את הלא-חוקיות. בהינתן φtable\varphi_{table} (שמבטיחה סימן יחיד בכל תא), החלון (i,j)(i,j) חוקי אם ורק אף שישייה לא-חוקית אינה מופיעה בו, ולכן אפשר לכתוב במקום זאת φmove′=⋀1≤i≤r(n)−11≤j≤2r(n)−1  ⋀(a1,…,a6)∉Legal(M)(xi,j,a1‾∨xi,j+1,a2‾∨xi,j+2,a3‾∨xi+1,j,a4‾∨xi+1,j+1,a5‾∨xi+1,j+2,a6‾)\varphi_{move}'=\bigwedge_{\substack{1\le i\le r(n)-1\\ 1\le j\le 2r(n)-1}}\ \ \bigwedge_{(a_1,\dots,a_6)\notin \mathrm{Legal}(M)}\Big(\overline{x_{i,j,a_1}}\vee\overline{x_{i,j+1,a_2}}\vee\overline{x_{i,j+2,a_3}}\vee\overline{x_{i+1,j,a_4}}\vee\overline{x_{i+1,j+1,a_5}}\vee\overline{x_{i+1,j+2,a_6}}\Big) זו כבר CNF ישירה: לכל חלון לכל היותר ∣L∣6|L|^6 פסוקיות, כל אחת בת 6 ליטרלים.

הערה: בהרצה נאמר רק שהמרת גרירות ל-CNF "לא מפחידה" [00:48:37], והסיכום משאיר את φmove\varphi_{move} בצורת DNF-לכל-חלון. הפירוט כאן הוא מה שההערה הזאת מייצגת. שתי הצורות שקולות מעל השמות המספקות את φtable\varphi_{table}, ושתיהן פולינומיות; הצורה השנייה נוחה יותר כי היא CNF כפי שנדרש להגדרת SAT\mathrm{SAT} ולרדוקציה ל-3SAT3\mathrm{SAT} בהמשך.

טענה 1.2 (למת הלוקליות) — למה בדיקה מקומית מספיקה

זו הטענה שבלעדיה ההוכחה חסרה, והמקום שבו סיכומים נוטים לדחוס הכי חזק.

ניסוח. תהי TT טבלה (מילוי של LL בכל תא), ונניח:

  1. השורה הראשונה של TT היא קידוד חוקי של הקונפיגורציה ההתחלתית של MM על (x,w)(x,w) עבור ww כלשהו, כלומר סימן מצב יחיד בעמודה r(n)+1r(n)+1;
  2. כל חלון 2×32\times3 ב-TT חוקי.

אז לכל ii: השורה ii היא קידוד חוקי של קונפיגורציה, והשורה i+1i+1 היא הקידוד של הקונפיגורציה העוקבת לה (או העתקה שלה, אם היא מכילה מצב סופי).

הוכחה, באינדוקציה על ii. בסיס: תנאי 1 נותן שהשורה הראשונה היא קידוד קונפיגורציה, עם סימן מצב יחיד בעמודה k1=r(n)+1k_1=r(n)+1.

צעד: נניח שהשורה ii היא קידוד של קונפיגורציה CC, שבה סימן המצב יושב בעמודה kk. כפי שהראינו בהגדרה 2, 2≤k≤2r(n)2\le k\le 2r(n) — הראש לעולם אינו על עמודת קצה. נראה שהשורה i+1i+1 נקבעת במלואה, והיא הקידוד של δ(C)\delta(C).

(א) תאים רחוקים מהראש נשמרים. יהי jj עם ∣j−k∣≥2|j-k|\ge 2. נתבונן בחלון (i,j−1)(i,j-1), שעמודותיו j−1,j,j+1j-1,j,j+1. אף אחת מהן אינה kk (כי j−1=kj-1=k היה מחייב j=k+1j=k+1, ו-j+1=kj+1=k היה מחייב j=k−1j=k-1; שניהם נשללו). לכן שורתו העליונה של החלון אינה מכילה סימן מצב. כל שישייה חוקית שהשורה העליונה שלה נטולת מצב מקיימת a5=a2a_5=a_2, כלומר התא האמצעי אינו משתנה: הרי בשישייה חוקית נלקחת מעבר אמיתי של MM; המעבר משנה רק את התא שתחת הראש ואת סימן המצב, שנשאר במרחק ≤1\le1 מ-kk, ולכן תא בעמודה jj עם ∣j−k∣≥2|j-k|\ge2 אינו יכול לא לשנות את תוכנו ולא לקבל סימן מצב חדש (הראש בזמן i+1i+1 נמצא בעמודה k±1k\pm1, שמרחקה מ-jj הוא לפחות 1). מסקנה: T(i+1,j)=T(i,j)T(i+1,j)=T(i,j) — בדיוק כמו בקונפיגורציה העוקבת.

(ב) תאים ליד הראש נקבעים על ידי δ\delta. נתבונן בחלון (i,k−1)(i,k-1) — הוא קיים בזכות 2≤k≤2r(n)2\le k\le 2r(n). שורתו העליונה היא (T(i,k−1), q, T(i,k+1))(T(i,k-1),\,q,\,T(i,k+1)), כלומר סימן המצב יושב במרכז. כיוון ש-MM דטרמיניסטית, δ(q,T(i,k+1))\delta(q,T(i,k+1)) קובע באופן יחיד מה תהיה שורת החלון התחתונה:

  • אם δ(q,γ)=(q′,γ′,R)\delta(q,\gamma)=(q',\gamma',R): (T(i,k−1), q, γ) ⇝ (T(i,k−1), γ′, q′)(T(i,k-1),\,q,\,\gamma)\ \rightsquigarrow\ (T(i,k-1),\,\gamma',\,q');
  • אם δ(q,γ)=(q′,γ′,L)\delta(q,\gamma)=(q',\gamma',L): (c, q, γ) ⇝ (q′, c, γ′)(c,\,q,\,\gamma)\ \rightsquigarrow\ (q',\,c,\,\gamma').

בשני המקרים כל שלושת התאים k−1,k,k+1k-1,k,k+1 בשורה i+1i+1 נקבעים במלואם, ובדיוק כמו בקונפיגורציה העוקבת. (המקרה של מצב סופי מטופל בכלל הריפוד: השורה מועתקת.)

(א) ו-(ב) יחד מכסים את כל העמודות, ולכן השורה i+1i+1 שווה בדיוק לקידוד של δ(C)\delta(C) — ובפרט היא בעצמה קידוד חוקי של קונפיגורציה, מה שמאפשר את המשך האינדוקציה. □\square

הערה: הטיעון הזה נאמר בהרצה כאינטואיציה — "רוב התאים לא השתנו, המקום היחיד שהשתנה הוא ליד הראש" [00:50:42] — ובאמצעות דוגמאות על הלוח. הפירוט הפורמלי, כולל ההבחנה שהראש לעולם אינו על עמודת קצה (ולכן החלון (i,k−1)(i,k-1) תמיד קיים), הוא מה שההערה מייצגת.

למה דווקא 6 תאים? [00:58:07], [01:01:21] — תיאורטית אפשר היה חלון גדול יותר; אנחנו רוצים כמה שפחות, כי מספר הפסוקיות לחלון הוא ∣L∣|L| בחזקת גודל החלון. פחות מ-2×32\times3 לא יספיק: בצעד יחיד יכולים להשתנות עד שלושה תאים סמוכים (במעבר שמאלה: k−1,k,k+1k-1,k,k+1), ולכן חלון 2×22\times2 עלול לפספס שינוי. שש הוא בדיוק המינימום שמכסה את כל השינויים האפשריים.

חשבון הגודל — למה הרדוקציה פולינומית

זהו החלק שהופך את הבנייה לרדוקציה. נסמן r=r(n)=p(n+q(n))r=r(n)=p(n+q(n)) — פולינום ב-nn, כי הרכבה של פולינומים היא פולינום.

רכיבספירהסדר גודל
משתניםr⋅(2r+1)⋅∣L∣r\cdot(2r+1)\cdot\lvert L\rvertO(∣L∣⋅r2)O(\lvert L\rvert\cdot r^2)
φtable\varphi_{table}לכל תא: פסוקית אחת באורך ∣L∣\lvert L\rvert, ועוד (∣L∣2)\binom{\lvert L\rvert}{2} פסוקיות באורך 2O(∣L∣2⋅r2)O(\lvert L\rvert^2\cdot r^2)
φstart\varphi_{start}2r+12r+1 קוניונקטים, כל אחד באורך ≤2\le2O(r)O(r)
φaccept\varphi_{accept}פסוקית אחת באורך r⋅(2r+1)r\cdot(2r+1)O(r2)O(r^2)
φmove′\varphi_{move}'(r−1)(2r−1)(r-1)(2r-1) חלונות, לכל חלון ≤∣L∣6\le\lvert L\rvert^6 פסוקיות באורך 6O(∣L∣6⋅r2)O(\lvert L\rvert^6\cdot r^2)

המפתח: ∣L∣|L| תלוי רק ב-MM ולא ב-xx ולא ב-nn. לכן ∣L∣6|L|^6 הוא גורם קבוע מבחינת גודל הקלט — הגם שהמרצה מסתייג מהמילה "קבוע" ומעדיף "לא תלוי ב-nn" [01:07:23]. סך הכול ∣φ∣=O(r(n)2)=O(p(n+q(n))2)|\varphi|=O\big(r(n)^2\big)=O\big(p(n+q(n))^2\big) פולינומי ב-n=∣x∣n=|x|, בדיוק כפי שנרשם בסיכום: O(r(∣x∣)2)O(r(|x|)^2).

וגם זמן הבנייה פולינומי, לא רק הגודל. [00:26:30] המכונה MCLM_{CL} המבצעת את הרדוקציה מקבלת xx ו:

  1. מחשבת n=∣x∣n=|x| ואת r(n)=p(n+q(n))r(n)=p(n+q(n)) — חישוב אריתמטי על פולינומים ידועים;
  2. מחשבת פעם אחת את הטבלה של Legal(M)\mathrm{Legal}(M) על ידי מעבר על כל ∣L∣6|L|^6 השישיות ובדיקת כל אחת מול δ\delta — עבודה שלא תלויה כלל ב-xx [01:06:52];
  3. פולטת את הפסוקיות של φtable,φstart,φaccept,φmove′\varphi_{table},\varphi_{start},\varphi_{accept},\varphi_{move}' בלולאות על i,ji,j;
  4. מחזירה φ=φtable∧φstart∧φaccept∧φmove\varphi=\varphi_{table}\wedge\varphi_{start}\wedge\varphi_{accept}\wedge\varphi_{move}.

כל פסוקית נכתבת בזמן קבוע, ומספר הפסוקיות פולינומי, ולכן MCLM_{CL} רצה בזמן פולינומי ב-∣x∣|x|.

חזרה על מה שהמכונה כן ולא עושה [00:46:02]: MCLM_{CL} לא מחפשת השמה, לא מנחשת את ww, לא מריצה את MM. היא רק כותבת נוסחה. כל הסמנטיקה — הטבלה, ההשמה, ה"מלכה נמצאת/לא נמצאת" — היא בראש שלנו בזמן שאנחנו מוכיחים נכונות.

כיוון 1: x∈A ⟹ φx\in A\ \Longrightarrow\ \varphi ספיקה

נניח x∈Ax\in A. לפי הגדרת NP קיים w∈{0,1}q(∣x∣)w\in\{0,1\}^{q(|x|)} כך ש-MM מקבלת את (x,w)(x,w), ומספר הצעדים חסום ב-r(n)r(n).

נבנה טבלה TT: השורה ה-ii היא הקידוד של הקונפיגורציה של MM על (x,w)(x,w) אחרי i−1i-1 צעדים, ואם הריצה עצרה במצב מקבל אחרי t<r(n)t<r(n) צעדים — כל השורות שמעבר לכך הן העתק של השורה שבה הופיע qacceptq_{accept} (כלל הריפוד).

לפי טענה 1.1 (הכיוון השני) יש השמה vv המתאימה למילוי הזה: v(xi,j,s)=1  ⟺  T(i,j)=sv(x_{i,j,s})=1\iff T(i,j)=s. נבדוק שהיא מספקת את כל ארבעת החלקים:

  • φtable\varphi_{table}: מיידי מהבנייה של vv — בכל תא בדיוק סימן אחד.
  • φstart\varphi_{start}: השורה הראשונה של TT היא הקונפיגורציה ההתחלתית: r(n)r(n) תאים ריקים, qstartq_{start}, אחריו xx תו-תו, אחריו ww תו-תו, אחריו תאים ריקים. הליטרלים היחידים מסופקים; ובכל אחת מהפסוקיות (x1,j,0∨x1,j,1)\big(x_{1,j,0}\vee x_{1,j,1}\big) עבור r(n)+n+2≤j≤r(n)+n+1+q(n)r(n)+n+2\le j\le r(n)+n+1+q(n), בדיוק אחד משני הליטרלים מקבל אמת — זה שמתאים ל-wj−(r(n)+n+1)w_{j-(r(n)+n+1)} [01:10:46]–[01:11:48].
  • φaccept\varphi_{accept}: הריצה מקבלת, ולכן קיימת שורה שבה מופיע qacceptq_{accept}; התא הזה נותן ליטרל אמיתי בדיסיונקציה.
  • φmove\varphi_{move}: כל חלון בטבלה נלקח משתי שורות עוקבות של ריצה אמיתית של MM (או מזוג שורות זהות אחרי הקבלה), ולכן השישייה שבו חוקית לפי ההגדרה. לכן בכל חלון קיים איבר אחד בדיסיונקציה שמסופק.

לכן v⊨φv\models\varphi, כלומר φ∈SAT\varphi\in \mathrm{SAT}. □\square

כיוון 2: φ\varphi ספיקה ⟹x∈A\Longrightarrow x\in A

נניח שקיימת השמה מספקת vv עבור φ\varphi. נשחזר ממנה את ww ואת הריצה.

שלב 1 — הטבלה מוגדרת היטב. vv מספקת את φtable\varphi_{table}, ולכן לפי טענה 1.1 לכל (i,j)(i,j) יש סימן יחיד ss עם v(xi,j,s)=1v(x_{i,j,s})=1. נגדיר T(i,j)=sT(i,j)=s. קיבלנו טבלה.

שלב 2 — קריאת ww. vv מספקת את φstart\varphi_{start}, ולכן השורה הראשונה של TT היא: תאים ריקים, qstartq_{start}, הקלט xx, אחר כך q(n)q(n) תאים שכל אחד מהם 00 או 11, ואז תאים ריקים. נגדיר wℓ=T(1, r(n)+n+1+ℓ),ℓ=1,…,q(n)w_\ell=T\big(1,\ r(n)+n+1+\ell\big),\qquad \ell=1,\dots,q(n) זהו w∈{0,1}q(∣x∣)w\in\{0,1\}^{q(|x|)}, מוגדר היטב [01:17:02]–[01:18:09]. זה בדיוק מה שמסתתר מאחורי המשפט "נתבונן ב-ww לפי ערכי האמת למשתנים המתאימים" בעמוד 3 בסיכום.

שלב 3 — הטבלה מתארת את הריצה על (x,w)(x,w). vv מספקת את φmove\varphi_{move}, ולכן כל חלון 2×32\times3 ב-TT חוקי. יחד עם העובדה ששורה 1 היא הקונפיגורציה ההתחלתית על (x,w)(x,w), למת הלוקליות (טענה 1.2) נותנת באינדוקציה: לכל ii, השורה i+1i+1 היא הקונפיגורציה העוקבת לשורה ii. כלומר TT היא בדיוק טבלת החישוב של MM על (x,w)(x,w).

זהו טיעון הדומינו של ההרצה [01:16:30]: ברגע שקבעתי את ww, הדטרמיניזם של MM קובע את כל שאר הטבלה. "זה כמו אבן ראשונה של דומינו שמפילה את כל השאר." שימו לב שכאן נכנס לשימוש הדטרמיניזם — זו הסיבה שנוח לעבוד עם ההגדרה דרך מוודא דטרמיניסטי.

שלב 4 — הריצה מקבלת. vv מספקת את φaccept\varphi_{accept}, ולכן קיים תא ב-TT שבו כתוב qacceptq_{accept}. לפי שלב 3, TT מתארת את הריצה האמיתית של MM על (x,w)(x,w), ולכן הריצה הזאת מגיעה למצב qacceptq_{accept} — כלומר MM מקבלת את (x,w)(x,w).

לכן קיים w∈{0,1}q(∣x∣)w\in\{0,1\}^{q(|x|)} שעליו MM מקבלת את (x,w)(x,w), ומהגדרת NP נובע x∈Ax\in A. □\square

סיכום ההוכחה

MCLM_{CL} רצה בזמן פולינומי ומקיימת x∈A  ⟺  φ=MCL(x)∈SATx\in A\iff \varphi=M_{CL}(x)\in \mathrm{SAT}, כלומר A≤pSATA\le_p \mathrm{SAT}. זה נכון לכל A∈NPA\in \mathrm{NP}, ולכן SAT\mathrm{SAT} היא NP-hard; יחד עם חלק (א), SAT\mathrm{SAT} היא NP-complete. ■\blacksquare

הערה על off-by-one: מספר השורות שנקבע בסיכום הוא r(n)r(n), אבל r(n)r(n) שורות מתארות רק r(n)−1r(n)-1 צעדים, בעוד חסם הזמן מתיר r(n)r(n) צעדים. התיקון הקל: לקחת r(n)+1r(n)+1 שורות (או להבחין ש-pp תמיד ניתן להגדלה בקבוע). שום דבר בהוכחה לא משתנה — כל התחומים והחסמים נשארים באותו סדר גודל.

משפט 2 (מסקנה): CNF-SAT\mathrm{CNF}\text{-}\mathrm{SAT} היא NP-complete, ובעקבותיה 3SAT3\mathrm{SAT}

הנוסחה שבנינו (בצורת φmove′\varphi_{move}') היא כבר CNF, ולכן ההוכחה מראה יותר: CNF-SAT\mathrm{CNF}\text{-}\mathrm{SAT} היא NP-hard. מכאן, בעזרת הרדוקציה SAT≤p3SAT\mathrm{SAT}\le_p 3\mathrm{SAT} שראינו בשיעור 7 (פיצול פסוקיות ארוכות באמצעות משתנים חדשים), מקבלים ש-3SAT3\mathrm{SAT} היא NP-complete.

זו נקודת המוצא לכל התחום: המרצה מציין [01:20:20] שאחרי המאמר של קוק ולוין בא ריצ'רד קארפ עם 21 בעיות אלגוריתמיות שהראה שכולן NP-שלמות — למשל SAT≤p3SAT≤pIS≤pCLIQUE\mathrm{SAT}\le_p 3\mathrm{SAT}\le_p \mathrm{IS}\le_p \mathrm{CLIQUE} — והיום ידועות אלפים.


דוגמאות ותרגילים מהשיעור

דוגמה 1: הקידוד של צעד יחיד (מהלוח, עמוד 1 בסיכום)

מכונה בקונפיגורציה: סרט B B 0 1 0 B BB\,B\,0\,1\,0\,B\,B, ראש על ה-11, מצב q1q_1, ו-δ(q1,1)=(q3,0,R)\delta(q_1,1)=(q_3,0,R).

שורה iiBBBB00q1q_11100B BB\ B
שורה i+1i+1BBBB0000q3q_300B BB\ B

שאלת סטודנט בהרצה [00:12:07]: "אפשר להסביר את המעבר הזה?" התשובה: בשרטוט הרגיל הראש עמד על ה-11, כתב 00 וזז ימינה. בקידוד, המצב נרשם תמיד תא אחד לפני מה שהראש קורא — ולכן q1q_1 שישב לפני ה-11 מתחלף: התא שלו מקבל את הסימן שנכתב (00), והתא שמימינו מקבל את q3q_3, כי עכשיו הראש קורא את התא שאחריו.

דוגמה 2: הרדוקציה מקצה לקצה על אינסטנס קונקרטי

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

השפה. A={x∈{0,1}∗: xA=\{x\in\{0,1\}^*:\ x contains at least one 1}1\}. זו כמובן שפה ב-P, אבל היא מוגדרת כאן דרך מוודא כדי שהבנייה תהיה מוחשית.

המוודא. q(n)=nq(n)=n; העד w∈{0,1}nw\in\{0,1\}^n אמור להצביע על מיקום של 11 בקלט. MM מקבלת קלט (x,w)(x,w) הכתוב על הסרט כ-xx ואחריו ww. עבור n=1n=1 מספיק: Σ={0,1},Γ={0,1,B},Q={qstart,q1,qaccept,qreject}\Sigma=\{0,1\},\quad \Gamma=\{0,1,B\},\quad Q=\{q_{start},q_1,q_{accept},q_{reject}\} δ(qstart,1)=(q1,1,R),δ(qstart,0)=(qreject,0,R),δ(q1,1)=(qaccept,1,R),δ(q1,0)=(qreject,0,R)\delta(q_{start},1)=(q_1,1,R),\quad \delta(q_{start},0)=(q_{reject},0,R),\quad \delta(q_1,1)=(q_{accept},1,R),\quad \delta(q_1,0)=(q_{reject},0,R) כלומר: קרא את x1x_1; אם הוא 00 — דחה; אם הוא 11 — עבור ל-q1q_1 ובדוק ש-w1=1w_1=1 (כלומר שהעד באמת מצביע על המיקום הזה).

הפרמטרים. n=∣x∣=1n=|x|=1, q(1)=1q(1)=1, אורך הקלט של MM הוא n+q(n)=2n+q(n)=2. ניקח p(m)=m+1p(m)=m+1, ואז r(1)=p(1+1)=3r(1)=p(1+1)=3 מספר שורות =3=3, מספר עמודות =2⋅3+1=7=2\cdot3+1=7, L={0,1,B,qstart,q1,qaccept,qreject}L=\{0,1,B,q_{start},q_1,q_{accept},q_{reject}\} כך ש-∣L∣=7|L|=7.

הנוסחה שהרדוקציה פולטת עבור x=1x=1. מספר המשתנים: 3⋅7⋅7=1473\cdot7\cdot7=147. ו- φstart=x1,1,B∧x1,2,B∧x1,3,B∧x1,4,qstart∧x1,5,1∧(x1,6,0∨x1,6,1)∧x1,7,B\varphi_{start}=x_{1,1,B}\wedge x_{1,2,B}\wedge x_{1,3,B}\wedge x_{1,4,q_{start}}\wedge x_{1,5,1}\wedge\big(x_{1,6,0}\vee x_{1,6,1}\big)\wedge x_{1,7,B} (שלושה תאים ריקים בעמודות 1..r(1)=31..r(1)=3; qstartq_{start} בעמודה r(1)+1=4r(1)+1=4; הקלט a1=1a_1=1 בעמודה r(1)+2=5r(1)+2=5; העד בעמודה r(1)+n+2=6r(1)+n+2=6; תא ריק בעמודה 7=2r(1)+17=2r(1)+1.) שימו לב: רק בעמודה 6 יש חופש — בדיוק ביט אחד, בדיוק אורך ww.

φaccept=⋁1≤i≤3, 1≤j≤7xi,j,qaccept\varphi_{accept}=\bigvee_{1\le i\le3,\ 1\le j\le7}x_{i,j,q_{accept}} כלומר פסוקית אחת בת 21 ליטרלים.

φmove\varphi_{move} רצה על i∈{1,2}i\in\{1,2\} ו-j∈{1,…,5}j\in\{1,\dots,5\}, כלומר 10 חלונות.

כיוון ⇒\Rightarrow: מ-x∈Ax\in A להשמה. x=1x=1 שייך ל-AA, והעד הוא w=1w=1. הטבלה:

i\ji\backslash j1234567
1BBBBBBqstartq_{start}1111BB
2BBBBBB11q1q_111BB
3BBBBBB1111qacceptq_{accept}BB

שורה 2 מתקבלת מ-δ(qstart,1)=(q1,1,R)\delta(q_{start},1)=(q_1,1,R): העמודות 4,54,5 עוברות מ-(qstart,1)(q_{start},1) ל-(1,q1)(1,q_1). שורה 3 מתקבלת מ-δ(q1,1)=(qaccept,1,R)\delta(q_1,1)=(q_{accept},1,R): העמודות 5,65,6 עוברות מ-(q1,1)(q_1,1) ל-(1,qaccept)(1,q_{accept}). ההשמה vv מוגדרת לפי הטבלה, והיא מספקת את כל ארבעת החלקים: φtable\varphi_{table} (סימן יחיד בכל תא), φstart\varphi_{start} (השורה הראשונה, ובעמודה 6 הליטרל x1,6,1x_{1,6,1} אמיתי), φaccept\varphi_{accept} (x3,6,qacceptx_{3,6,q_{accept}} אמיתי), φmove\varphi_{move} (כל חלון נלקח משתי שורות עוקבות של ריצה אמיתית).

כיוון ⇐\Leftarrow: מהשמה ל-ww ולשייכות. נניח שקיבלנו השמה מספקת vv. מ-φtable\varphi_{table} נגזרת טבלה; מ-φstart\varphi_{start} אנו יודעים שהשורה הראשונה היא B B B qstart 1 ? BB\,B\,B\,q_{start}\,1\,?\,B, ובעמודה 6 בדיוק אחד מבין x1,6,0,x1,6,1x_{1,6,0},x_{1,6,1} אמיתי. נקרא משם את w1w_1. אילו היה w1=0w_1=0: לפי φmove\varphi_{move} ולמת הלוקליות הטבלה חייבת להיות שורה 2: B B B 1 q1 0 BB\,B\,B\,1\,q_1\,0\,B, ושורה 3: B B B 1 0 qreject BB\,B\,B\,1\,0\,q_{reject}\,B. ואז אין בטבלה אף תא עם qacceptq_{accept} — סתירה ל-φaccept\varphi_{accept}. לכן בהכרח w1=1w_1=1, ואז הטבלה היא זו שלמעלה ו-MM אכן מקבלת את (1,1)(1,1), כלומר x=1∈Ax=1\in A.

האינסטנס השלילי. עבור x=0x=0: φstart\varphi_{start} כופה x1,5,0x_{1,5,0}; לפי δ(qstart,0)=(qreject,0,R)\delta(q_{start},0)=(q_{reject},0,R) שורה 2 היא B B B 0 qreject w1 BB\,B\,B\,0\,q_{reject}\,w_1\,B; מ-qrejectq_{reject} אין מעבר, ואין כלל ריפוד עבורו, ולכן אין השמה שמספקת את φmove\varphi_{move} — φ\varphi אינה ספיקה. (ואם מרחיבים את כלל הריפוד לכל מצב עוצר, אז שורה 3 מעתיקה את שורה 2 ו-φaccept\varphi_{accept} היא זו שנכשלת. בשני המקרים φ∉SAT\varphi\notin \mathrm{SAT}, בהתאם ל-0∉A0\notin A.)

דוגמה 3: אילו חלונות חוקיים ואילו לא (בעקבות הלוח)

עם המכונה של דוגמה 2 — שאף פעם אינה זזה שמאלה:

(א) חוקי — מעבר אמיתי: Bqstart1B1q1\begin{array}{|c|c|c|}\hline B & q_{start} & 1\\\hline B & 1 & q_1\\\hline\end{array} זהו בדיוק החלון (1,3)(1,3) בטבלה של דוגמה 2: δ(qstart,1)=(q1,1,R)\delta(q_{start},1)=(q_1,1,R).

(ב) חוקי — שורה עליונה נטולת מצב: BBBBBB\begin{array}{|c|c|c|}\hline B & B & B\\\hline B & B & B\\\hline\end{array} הראש רחוק, שום דבר לא משתנה. זה מה שהופך את רוב הטבלה ל"שקטה", וזו הלוקליות בפעולה.

(ג) לא חוקי — הראש צץ יש מאין [01:03:12]: BBBBq1B\begin{array}{|c|c|c|}\hline B & B & B\\\hline B & q_1 & B\\\hline\end{array} שאלה מנחה מההרצה: מאיפה הראש הזה היה יכול להגיע? רק מהתא משמאל או מהתא מימין — אבל בשורה העליונה של החלון אין סימן מצב באף אחד מהם, ומחוץ לחלון הוא רחוק מדי מכדי להגיע בצעד אחד. לכן אין ריצה שמייצרת חלון כזה.

(ד) לא חוקי — תזוזה שמאלה במכונה שאינה זזה שמאלה [01:02:11]: 1q11qaccept11\begin{array}{|c|c|c|}\hline 1 & q_1 & 1\\\hline q_{accept} & 1 & 1\\\hline\end{array} כאן סימן המצב עבר שמאלה, כלומר הראש זז שמאלה. ב-δ\delta שלנו כל המעברים הם RR, ולכן השישייה אינה ב-Legal(M)\mathrm{Legal}(M). שימו לב לניסוח המדויק שהמרצה תיקן בהרצה: הנימוק אינו "לא הגיע מימין" אלא "הראש הזה לעולם אינו זז שמאלה במכונה הזאת".

(ה) לא חוקי — שינוי בלי ראש: 010000\begin{array}{|c|c|c|}\hline 0 & 1 & 0\\\hline 0 & 0 & 0\\\hline\end{array} בשורה העליונה אין סימן מצב, ולמרות זאת התא האמצעי שינה את תוכנו. מכונת טיורינג כותבת רק תחת הראש.

תרגיל 1 (מההרצה [00:13:43], [00:15:18]): כמה שורות וכמה עמודות?

שאלה. למה מספר השורות הוא p(∣x∣+q(∣x∣))p(|x|+q(|x|)) ומספר העמודות הוא 2p(∣x∣+q(∣x∣))+12p(|x|+q(|x|))+1?

פתרון. מספר השורות = מספר הקונפיגורציות בריצה = מספר צעדי הזמן, החסום ב-pp של אורך הקלט, כלומר p(∣x∣+q(∣x∣))=r(n)p(|x|+q(|x|))=r(n). מספר העמודות: זמן חוסם מקום — בכל צעד הראש זז תא אחד לכל היותר, ולכן מנקודת ההתחלה הוא לא יתרחק ביותר מ-r(n)r(n). אבל איננו יודעים מראש לאיזה כיוון ילך, ולכן שומרים r(n)r(n) תאים לכל צד: 2r(n)2r(n). ה-+1+1 הוא התא שבו נרשם סימן המצב לפי הקידוד של הגדרה 1. סה"כ 2r(n)+12r(n)+1.

תרגיל 2 (מההרצה [00:49:08]): כמה מילויים אפשריים לשורה?

שאלה. אם רציתי לכתוב "אם השורה הראשונה מולאה כך אז השורה השנייה כך", כמה גרירות אצטרך?

פתרון. לכל אחד מ-2r(n)+12r(n)+1 התאים יש ∣L∣|L| אפשרויות, ולכן מספר המילויים הוא ∣L∣2r(n)+1|L|^{2r(n)+1} — מעריכי ב-nn. (לא עצרת! זו חזקה: בחירה בלתי-תלויה בכל תא.) נוסחה בגודל כזה לא ניתנת לכתיבה בזמן פולינומי, ולכן הגישה הזאת נכשלת, ולכן צריך את החלונות.

תרגיל 3 (מההרצה [00:58:38]): כמה שישיות לחלון?

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

פתרון. ∣L∣6|L|^6, לא (∣L∣6)\binom{|L|}{6}: התאים בחלון אינם חייבים להכיל סימנים שונים (וכפי שראינו, לרוב חמישה מתוך שישה זהים בזוגות). זהו ∣L∣⋅∣L∣⋅∣L∣⋅∣L∣⋅∣L∣⋅∣L∣|L|\cdot|L|\cdot|L|\cdot|L|\cdot|L|\cdot|L|. הגודל הזה תלוי רק ב-MM.

תרגיל 4 (מההרצה [01:04:47]): מאיפה ה-−1-1 וה-−1-1 בתחומי φmove\varphi_{move}?

שאלה. למה 1≤i≤r(n)−11\le i\le r(n)-1 ו-1≤j≤2r(n)−11\le j\le 2r(n)-1, ולא עד הסוף?

פתרון. חלון מאונדקס לפי התא השמאלי-עליון. לחלון שתי שורות, ולכן התא השמאלי-עליון יכול להיות לכל היותר בשורה r(n)−1r(n)-1 — משורה r(n)r(n) אין שורה שמתחתיה. לחלון שלוש עמודות, ולכן התא השמאלי-עליון יכול להיות לכל היותר בעמודה (2r(n)+1)−2=2r(n)−1(2r(n)+1)-2=2r(n)-1.


הערות מהשיעור

  • [00:01:08] סדר הכמתים. "להיזהר, כי הרבה פעמים אנשים אומרים 'יש רדוקציה מכל שפה ב-NP ל-SAT\mathrm{SAT}' — זה לא אותו דבר. 'יש רדוקציה לכל שפה' משמעו רדוקציה אחת שטובה לכולן, וזה לא המצב." הכיוון הנכון: לכל A∈NPA\in \mathrm{NP} קיימת רדוקציה, התלויה ב-AA.
  • [00:02:41] דטרמיניסטי או אי-דטרמיניסטי. אפשר להוכיח את קוק–לוין משתי ההגדרות של NP. נבחרה הדטרמיניסטית כי היא מאפשרת לומר "אני יודע בכל צעד מה קורה בצעד הבא" — וזה בדיוק מה שנחוץ בכיוון ⇐\Leftarrow.
  • [00:05:19]–[00:06:52] "מי יש לי ביד?" — טכניקה, לא רק אנקדוטה. קיים מביא משתנים, לכל סוגר סקופ ומוחק אותם. יש: M,p,qM,p,q ובזמן ריצה גם xx. אין: ww. המרצה חוזר לזה בכל תת-נוסחה כבדיקת שפיות — למשל [00:42:18]: "φtable\varphi_{table} צריכה רק את nn; φstart\varphi_{start} צריכה את xx עצמו".
  • [00:09:27], [00:20:03] בעיית שמונה המלכות היא "קוק–לוין בקטן". אותה טכניקה בדיוק: משתנה בוליאני לכל משבצת, תת-נוסחה לכל אילוץ, ו-∧\wedge ביניהן. אם הקידוד כאן נראה לכם מסובך — חזרו לשם.
  • [00:23:47]–[00:24:52] קפיצה מכוונת בין תחביר לסמנטיקה. "כשאני מסביר את ההוכחה אני כל הזמן קופץ בין התחביר של הנוסחה למה שאני רוצה שהוא יגיד" [00:43:23]. זה מקור בלבול נפוץ: הרדוקציה בונה תחביר בלבד; המשמעות ("בתא כתוב ss") קיימת רק בהוכחת הנכונות.
  • [00:32:31] מה φtable\varphi_{table} לא מבטיחה. "היא תבנה לך טבלה — יכולה להיות טבלה של ג'יבריש, שלא קשורה למכונה בכלל." הקשר למכונה נוצר רק ב-φstart\varphi_{start} וב-φmove\varphi_{move}.
  • [00:35:46] למה צריך את הכיוון ההפוך בטענה 1.1. "להפך חשוב בגלל הכיוון השני של הרדוקציה." בלי המרה של טבלה להשמה, אי אפשר להוכיח x∈A⇒φ∈SATx\in A\Rightarrow\varphi\in \mathrm{SAT}.
  • [00:45:01]–[00:45:31] כל תת-נוסחה עומדת בפני עצמה. אין צורך ש-φaccept\varphi_{accept} תדרוש יחידות — φtable\varphi_{table} כבר עשתה זאת. עיקרון העבודה: כל נוסחה דורשת רק את שלה, ובלבד שאין סתירה ביניהן.
  • [00:46:33] "השפיץ של המשפט". "עד לפה זה כמעט אותו דבר כמו בעיית המלכות, רק יותר אינדקסים. הגדולה של קוק–לוין — ואולי הסיבה שאנחנו צריכים את המודל הפרימיטיבי-אבל-מדויק הזה של מכונות טיורינג — היא הנוסחה האחרונה."
  • [01:03:44]–[01:04:47] בדיחת "כל האי-זוגיים ראשוניים". 3, 5, 7, 7, 7, 7… — כך נראה כלל הריפוד. חסם הזמן הוא מלמעלה, ולכן צריך משהו למלא בו את שאר הטבלה.
  • [01:06:22]–[01:07:23] מה תלוי במה. קבוצת השישיות החוקיות תלויה רק ב-δ\delta, כלומר רק ב-MM; גודל הטבלה תלוי מאוד ב-xx. המרצה מסרב לקרוא ל-∣L∣6|L|^6 "קבוע": "אין קבוע, יש תלוי בזה או לא תלוי בזה".
  • [01:16:30] מטאפורת הדומינו. "ברגע שכתבתי את ww — זו כמו אבן ראשונה של דומינו שמפילה את כל השאר." זו התמצית של כיוון ⇐\Leftarrow.
  • [01:19:42] "קחו שבועיים". "זו לא הוכחה שאפשר לראות פעם אחת אונליין; היא דורשת עיכול." אם משהו כאן לא התיישב מהקריאה הראשונה — זה צפוי.
  • [01:14:25], [01:21:25] על המבחן. המרצה מסרב לענות על "מה מהחומר יהיה במבחן" ומבקש להסתכל על היופי של הרעיון. מה שכן נאמר על התרגיל: יהיו בו הרבה רדוקציות זמן פולינומי, ותהיה שאלה של "משחק עם ההגדרות" — שינוי קטן בהגדרה ובחינת מה משתנה — שהמרצה מדגיש כחשובה במיוחד, בלי קשר למבחן.
  • [01:20:20] הקשר היסטורי. המאמר של קוק ולוין היה "יריית הפתיחה"; אחריו בא ריצ'רד קארפ עם 21 בעיות NP-שלמות, וביניהן הרדוקציות SAT→3SAT→IS→CLIQUE\mathrm{SAT}\to3\mathrm{SAT}\to\mathrm{IS}\to\mathrm{CLIQUE} שראינו/נראה בקורס.
  • [01:22:29] מה הלאה. אחרי שיודעים שבעיה היא NP-קשה — מה בכל זאת אפשר לעשות? זה מוביל לקירובים ולאלגוריתמים הסתברותיים בשיעורים הבאים: "אני מוכן לוותר על דברים בשביל שהאלגוריתם ירוץ בזמן סביר".

פערים בין הסיכום להקלטה

  • מקור: עמוד 1 בסיכום. הפער: תנאי המוודא נכתב w∈{0,1}q(∣w∣)w\in\{0,1\}^{q(|w|)}. ההכרעה: זו טעות — האורך של העד נקבע לפי אורך הקלט, כלומר w∈{0,1}q(∣x∣)w\in\{0,1\}^{q(|x|)}. ההקלטה [00:03:45] וכל שאר הסיכום (עמודים 2–3) משתמשים ב-q(∣x∣)q(|x|). תוקן בגוף הקובץ.
  • מקור: עמוד 2 בסיכום, φstart\varphi_{start}. הפער: טווח תאי ה-ww נכתב כמסתיים ב-r(n)+q(n)r(n)+q(n), והריפוד בבלנקים מתחיל ב-r(n)+q(n)+1r(n)+q(n)+1. זה מתעלם מ-n+1n+1 התאים של qstartq_{start} ושל xx שלפניהם. ההכרעה: הטווח הנכון הוא r(n)+n+2≤j≤r(n)+n+1+q(n)r(n)+n+2\le j\le r(n)+n+1+q(n), ובלנקים מ-r(n)+n+2+q(n)r(n)+n+2+q(n) עד 2r(n)+12r(n)+1. זה עקבי עם התחלת ה-ww שנכתבה נכון באותה שורה (r(n)+(n+2)r(n)+(n+2)), עם הטווח הנכון שמופיע בהמשך עמוד 2, ועם ההקלטה [00:40:02]. תוקן.
  • מקור: עמוד 2 בסיכום, φmove\varphi_{move}. הפער: הנוסחה נכתבת כדיסיונקציה של קוניונקציות לכל חלון (DNF), בעוד שההרצה [00:27:13] מדגישה שכל אחת מארבע התת-נוסחאות היא CNF. ההכרעה: שתי הצורות נכונות ושקולות (מעל השמות שמספקות את φtable\varphi_{table}); הוצגה גם הצורה השקולה φmove′\varphi_{move}' שאוסרת את השישיות הלא-חוקיות ושהיא CNF ישירה עם ≤∣L∣6\le|L|^6 פסוקיות בנות 6 ליטרלים לכל חלון. אין סתירה — רק דחיסה בסיכום.
  • מקור: שני המקורות. הפער: מספר השורות נקבע r(n)r(n), אך r(n)r(n) שורות מתארות r(n)−1r(n)-1 צעדים בלבד, בעוד חסם הזמן מתיר r(n)r(n) צעדים. ההכרעה: off-by-one שפיר. תוקן בהערה בגוף הקובץ (לוקחים r(n)+1r(n)+1 שורות, או מגדילים את pp בקבוע); אף חסם או תחום אחר אינו משתנה בסדר גודלו.
  • מקור: שני המקורות. הפער: אף אחד מהם אינו רושם את שישיית המכונה במפורש, אף שהבנייה משתמשת ב-qstartq_{start}, qacceptq_{accept}, ΓM\Gamma_M, QMQ_M ו-δ\delta. ההכרעה: נרשמה במפורש בסעיף הרקע כ-M=(Q,qstart,F,Σ,Γ,δ)M=(Q,q_{start},F,\Sigma,\Gamma,\delta), לפי מוסכמת הסימון של הקורס.
  • מקור: ההקלטה [00:55:48]–[01:03:12]. הפער: המרצה שרטט על הלוח מכונה קונקרטית ("היא סופרת / בודקת…") וארבעה-חמישה חלונות, ודן בחוקיותם — אך תוכן השרטוטים אינו ניתן לשחזור מהאודיו. ההכרעה: נבנתה מכונה מפורשת (דוגמה 2) ואיתה חמישה חלונות (דוגמה 3) שמשמרים בדיוק את נימוקי החוקיות שנשמעו: "מאיפה הראש הגיע", "המכונה הזאת לעולם לא זזה שמאלה", ו"שינוי בלי ראש".
  • מקור: ההקלטה. הפער: ההסבר על למה הקידוד הנאיבי (גרירה שורה-על-שורה) נכשל, וחישוב ∣L∣2r(n)+1|L|^{2r(n)+1} המילויים — נמצאים רק בהקלטה [00:48:06]–[00:50:11] ואינם מופיעים כלל בסיכום. ההכרעה: נכללו במלואם; זה החומר שמסביר למה הבנייה נראית כפי שהיא נראית.
  • מקור: ההקלטה. הפער: ההערות המתודיות ("קיים מביא משתנים, לכל מוחק אותם"), ההשוואה החוזרת לבעיית שמונה המלכות, ומטאפורת הדומינו — כולן בהקלטה בלבד. ההכרעה: נכללו בסעיף "הערות מהשיעור".
  • מקור: עמוד 3 בסיכום. הפער: הסיכום מסיים ב"לכן SAT\mathrm{SAT} היא NP-קשה" ואינו חוזר על SAT∈NP\mathrm{SAT}\in \mathrm{NP}, בעוד שכותרת המשפט בעמוד 1 היא "SAT\mathrm{SAT} היא NP-שלמה". ההכרעה: הובא חלק (א) המלא של המשפט (העד הוא ההשמה), בהסתמך על שיעור 7.
  • מקור: ההקלטה, [00:00:00]–[00:05:00]. הפער: הדקות הראשונות הן חזרה על רדוקציות זמן פולינומי, NP-קושי ו-NP-שלמות משיעור 7, ולא חומר של שיעור זה. ההכרעה: שולבו בסעיף "רקע ותלויות" בלבד.
  • מקור: שני המקורות. הפער: המשתנים מסומנים xi,j,sx_{i,j,s} בעוד ש-xx מסמן גם את הקלט. ההכרעה: נשמר הסימון של הסיכום כפי שהוא (הוא גם הסימון שנאמר בהרצה), עם הבהרה מפורשת בהגדרה 3 שהאינדקסים הם רק שם ואין קשר בין השניים.
  • מקור: ההקלטה [01:03:44]. הפער: כלל הריפוד נאמר רק עבור qacceptq_{accept}; מקרה של עצירה במצב דוחה לפני תום r(n)r(n) הצעדים אינו נדון. ההכרעה: נוסחה הערה מפורשת — במקרה כזה φmove\varphi_{move} אינה ספיקה, וזה תקין כי ממילא רצינו φ∉SAT\varphi\notin \mathrm{SAT}; לחלופין אפשר להרחיב את הריפוד לכל מצב עוצר ואז φaccept\varphi_{accept} היא שנכשלת. שתי הדרכים נכונות.

סיכום ונקודות למבחן

מה לזכור בעל פה

  1. המשפט: SAT\mathrm{SAT} היא NP-complete. הניסוח המדויק: לכל A∈NPA\in \mathrm{NP} מתקיים A≤pSATA\le_p \mathrm{SAT}, ובנוסף SAT∈NP\mathrm{SAT}\in \mathrm{NP}.
  2. הפרמטרים: r(n)=p(n+q(n))r(n)=p(n+q(n)); טבלה עם r(n)r(n) שורות ו-2r(n)+12r(n)+1 עמודות; אלפבית L=ΓM∪{0,1}∪QML=\Gamma_M\cup\{0,1\}\cup Q_M; משתנים xi,j,sx_{i,j,s} שמשמעותם "בתא (i,j)(i,j) כתוב ss".
  3. ארבעת החלקים ומה כל אחד עושה: φtable\varphi_{table} — בכל תא בדיוק סימן אחד. φstart\varphi_{start} — השורה הראשונה היא הקונפיגורציה ההתחלתית על (x,w)(x,w), כשהחופש היחיד הוא q(n)q(n) תאי ww. φaccept\varphi_{accept} — איפשהו בטבלה qacceptq_{accept}. φmove\varphi_{move} — כל חלון 2×32\times3 חוקי.
  4. הגודל: O(r(∣x∣)2)O(r(|x|)^2) עד לגורמים התלויים רק ב-MM (בפרט ∣L∣6|L|^6) — ומכאן שהרדוקציה פולינומית.

המלכודות הסטנדרטיות

  • הפיכת כיוון הרדוקציה. A≤pBA\le_p B אומר ש-BB קשה לפחות כמו AA. כאן: A≤pSATA\le_p \mathrm{SAT}, כלומר SAT\mathrm{SAT} היא הקשה.
  • הפיכת סדר הכמתים. "לכל שפה יש רדוקציה" ≠\ne "יש רדוקציה לכל שפה".
  • בלבול בין שורות לעמודות. שורות =r(n)=r(n) (זמן), עמודות =2r(n)+1=2r(n)+1 (מקום). ה-22 נובע מאי-ידיעת כיוון התנועה; ה-+1+1 מהתא של סימן המצב.
  • (∣L∣6)\binom{|L|}{6} במקום ∣L∣6|L|^6. תאי החלון אינם חייבים להיות שונים.
  • לשכוח את הכיוון ההפוך בטענה על φtable\varphi_{table}. צריך גם "מכל טבלה להשמה", אחרת כיוון ⇒\Rightarrow של הרדוקציה נשבר.
  • לחשוב שהרדוקציה מריצה את MM או מנחשת את ww. היא רק כותבת נוסחה. אין לה ww ואין לה השמה.
  • לשכוח את הריפוד. חסם הזמן הוא מלמעלה; בלי כלל ההעתקה של שורה מקבלת, טבלה של ריצה קצרה אינה מוגדרת עד הסוף.
  • לטעון שחלון 2×22\times2 מספיק. מעבר שמאלה משנה שלושה תאים סמוכים.

צ'ק-ליסט: מה צריך לדעת לעשות אחרי השיעור

  • לנסח את משפט קוק–לוין עם סדר הכמתים הנכון, ולהסביר למה הוא נותן את הבעיה ה-NP-שלמה הראשונה.
  • לקודד קונפיגורציה נתונה של מכונת טיורינג כשורה, ולחשב את השורה הבאה בהינתן δ\delta.
  • לכתוב את ארבע התת-נוסחאות מהזיכרון, עם התחומים הנכונים של ii ו-jj בכל אחת מהן — כולל להסביר את ה-−1-1 וה-−1-1 ב-φmove\varphi_{move}.
  • להכריע אם שישייה נתונה היא חלון חוקי עבור מכונה נתונה, ולנמק ("מאיפה הראש הגיע", "האם δ\delta מאפשרת", "האם השתנה תא בלי ראש").
  • להסביר למה הקידוד הנאיבי של גרירה בין שורות נכשל, ולחשב ∣L∣2r(n)+1|L|^{2r(n)+1}.
  • לבצע חשבון גודל מלא של φ\varphi ולהסביר למה הוא פולינומי ב-∣x∣|x| ולא ב-∣L∣|L|.
  • להוכיח את שני כיווני הנכונות, כולל שחזור ww מהשמה מספקת וטיעון הדומינו הדטרמיניסטי.
  • להסביר איפה בדיוק נכנס בהוכחה כל אחד מהתנאים: זמן פולינומי, אורך העד, ודטרמיניזם.

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

שאלות שנשארו פתוחות

  • בעמוד 2 בסיכום טווח תאי ה-$w$ ב-$\varphi_{start}$ נכתב עד $r(n)+q(n)$; זו החסרה של $n+1$ והוא תוקן לפי הטווח הנכון שמופיע בהמשך אותו עמוד.
  • המכונה הקונקרטית והחלונות שהמרצה שרטט על הלוח בין [00:55:48] ל-[01:03:12] אינם ניתנים לשחזור מהאודיו; נבנתה מכונה מפורשת מקבילה שמשמרת בדיוק את נימוקי החוקיות שנאמרו.
  • מספר השורות בסיכום הוא $r(n)$, ולכן מתוארים $r(n)-1$ צעדים בלבד; ההצמדה המדויקת דורשת $r(n)+1$ שורות. זהו off-by-one שאינו משנה דבר בהוכחה והוא סומן בגוף הקובץ.
  • הסיכום מסיים ב־SAT היא NP-קשה בלבד; ההשלמה ל-NP-שלמה נשענת על $\mathrm{SAT}\in \mathrm{NP}$ שהוכח בשיעור 7 והובאה כאן שוב.