8The Reduction from SAT to 3SAT

בשיעור מוכיחים SAT ≤p 3SAT על ידי חיתוך כל פסוקית ארוכה לפסוקיות באורך 3 בעזרת משתני עזר חדשים, ומסיקים ש‑3SAT היא NP‑שלמה.

confidence: mediumno recording8 summary pagesnp-completenesssat3satreductionscnfboolean-formulas

This lesson has no recording

This session appears in no recording anywhere in the corpus, so the file rests on the summary pages alone. It is shorter than its neighbours, deliberately — nothing was padded to disguise the gap. The details are in the gaps section below.

Builds on: lesson 5, lesson 6, lesson 7

The handwritten summary pages

Open page 1 full size

סיבוכיות שיעור 8 הוכחת SAT3SAT.pdf

Page 1 of 8 of the handwritten summary

בקצרה

  • מוכיחים את הרדוקציה SAT≤p3SAT\mathrm{SAT} \le_p \mathrm{3SAT}: כל נוסחת CNF ניתנת לתרגום, בזמן פולינומי, לנוסחת 3CNF שקולת‑ספיקות לה.
  • הכיוון ההפוך, 3SAT≤pSAT\mathrm{3SAT} \le_p \mathrm{SAT}, הוא רדוקציית הזהות — ומכאן ש‑3SAT∈NP\mathrm{3SAT} \in \mathrm{NP}.
  • בשילוב עם משפט קוק–לוין (SAT היא NP‑קשה; ראו שיעור 9) מתקבל ש‑3SAT\mathrm{3SAT} היא NP‑שלמה. זו הבעיה הנוחה ביותר להתחיל ממנה רדוקציות, כי מבנה הקלט שלה נוקשה — בדיוק 3 ליטרלים לפסוקית לכל היותר.
  • לב הבנייה: פסוקית באורך k>3k>3 נחתכת לשתי פסוקיות באורכים 33 ו‑k−1k-1 בעזרת משתנה עזר חדש zz שמשמש כמתג. חוזרים על הצעד עד שכל הפסוקיות קצרות.
  • החצי העדין הוא הכיוון ההפוך של הנכונות: להראות שמשתני העזר אינם יכולים לרמות — כל השמה שמספקת את φ^\hat\varphi מצטמצמת להשמה שמספקת את φ\varphi. זה מוכח כאן במלואו.
  • בנוסף: השיעור פותח בשלוש טענות תשתית (NP⊆PSPACE\mathrm{NP} \subseteq \mathrm{PSPACE}, סגירות P\mathrm{P} תחת רדוקציות, ומשמעות NP‑שלמות), ונחתם בהדגמת כוח הביטוי של CNF — קידוד "בדיוק אחד", "לא ריק ולא מלא", ובעיית 8 המלכות כנוסחת CNF.

רקע ותלויות

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

1. המחלקה NP — שתי ההגדרות השקולות (שיעור 5–6). בהגדרה הראשונה, A∈NPA \in \mathrm{NP} אם קיימת מכונת טיורינג אי‑דטרמיניסטית NN שמכריעה את AA וזמן הריצה של כל ריצה שלה חסום בפולינום באורך הקלט. בהגדרה השנייה (הגדרת ה‑verifier), A∈NPA \in \mathrm{NP} אם קיימות מכונה דטרמיניסטית MM בזמן פולינומי ופולינום qq כך שלכל xx: x∈A  ⟺  ∃ w∈{0,1}q(∣x∣)  s.t.  M accepts (x,w).x \in A \iff \exists\, w \in \{0,1\}^{q(|x|)} \ \text{ s.t. } \ M \text{ accepts } (x,w). המחרוזת ww נקראת עדות (witness). בשיעור 6 הוכח ששתי ההגדרות שקולות. בהוכחות כאן נוח לעבוד עם הגדרת ה‑verifier, וכך נעשה גם בשיעור 9 — כדברי המרצה, "דטרמיניזם תמיד יותר נוח לי, כי אני יודע כל צעד מה קורה בצעד הבא" [00:02:41, תמלול 15].

הערה על סימון המכונה: מכונת טיורינג נכתבת כאן כ‑M=(Q,qstart,F,Σ,Γ,δ)M=(Q,q_{start},F,\Sigma,\Gamma,\delta), כולל מצב ההתחלה. בכמה עמודי סיכום בקורס מושמט qstartq_{start}; זו החלקה ידועה במקור והתיקון נעשה כאן במכוון.

2. הבעיה SAT (נלמדה בשיעור 7, ומופיעה בהקלטה [00:06:24]–[00:16:14]). SAT\mathrm{SAT} היא בעיית ההכרעה שקלטיה הם נוסחאות CNF, והשאלה היא האם הנוסחה ספיקה. בשיעור 7 הוכח SAT∈NP\mathrm{SAT} \in \mathrm{NP}: המכונה האי‑דטרמיניסטית כותבת על סרט שני nn ביטים (nn = מספר המשתנים בנוסחה), מתייחסת אליהם כהשמה, ובודקת האם ההשמה מספקת. זמן הריצה O(∣φ∣2)O(|\varphi|^2) [00:25:26].

3. רדוקציית זמן פולינומי (שיעור 7, [01:04:14]–[01:08:34]). f:Σ∗→Σ∗f:\Sigma^*\to\Sigma^* היא רדוקציית זמן פולינומי מ‑AA ל‑BB אם היא ניתנת לחישוב בזמן פולינומי ולכל xx מתקיים x∈A  ⟺  f(x)∈Bx\in A \iff f(x)\in B. מסמנים A≤pBA \le_p B.

כיוון הרדוקציה — קראו את זה לאט. A≤pBA \le_p B פירושו ש‑BB היא הבעיה הקשה יותר: מי שיודע לפתור את BB יודע לפתור גם את AA (מתרגמים את הקלט ופותרים). הכיוון הזה מתהפך כל הזמן בדיבור, ולכן בכל פעם שנכתוב ≤p\le_p נאמר גם במילים מי הקשה. בשיעור הזה נוכיח SAT≤p3SAT\mathrm{SAT} \le_p \mathrm{3SAT} — כלומר 3SAT היא לפחות קשה כמו SAT, וזו בדיוק המטרה: להעביר את הקושי של SAT אל 3SAT.

4. שתי הערות מתודיות שחזרו בהקלטה ושייכות גם כאן.

  • ברדוקציה אין פתרון של אף בעיה: "אני לא מכריע פה את IS ולא מכריע פה את CLIQUE, כל מה שאני עושה זה להמיר קלט" [01:11:50, 01:22:33].
  • יש שני שלבים נפרדים לגמרי: בניית המכונה (שנעשית בלי לדעת אם הקלט בשפה — אם היינו יודעים, היינו מכריעים בזמן פולינומי), ורק אחר כך הוכחת הנכונות, שבה מותר להניח שהקלט בשפה [01:25:54].

הגדרות

הגדרה 1: משתנים, ליטרלים, פסוקיות ונוסחת CNF

יהיו x1,…,xnx_1,\dots,x_n משתנים בוליאניים, כלומר משתנים שיכולים לקבל את הערכים true\text{true} ו‑false\text{false} (נסמן גם 11 ו‑00).

  • ליטרל הוא משתנה או שלילתו: xix_i או xˉi\bar x_i.
  • פסוקית (clause) היא "או" בין ליטרלים: ℓ1∨ℓ2∨⋯∨ℓk\ell_1 \vee \ell_2 \vee \dots \vee \ell_k.
  • נוסחת CNF (conjunctive normal form) היא "וגם" בין פסוקיות.

אינטואיציה. CNF היא נוסחה בוליאנית שנכפתה עליה צורה נוקשה מאוד: שתי שכבות בלבד, "או" בפנים ו"וגם" בחוץ. הנוקשות הזו היא בדיוק מה שהופך את SAT לבעיה נוחה לרדוקציות — קלט של SAT הוא אובייקט פשוט לתיאור, ולכן קל "לכתוב לתוכו" בעיות אחרות. כדי לספק נוסחת CNF צריך לספק את כל הפסוקיות, אבל בכל פסוקית מספיק ליטרל אחד מסופק [00:14:32].

דוגמה. φ=(x1∨xˉ2)∧(xˉ1∨x3∨x4∨xˉ5)\varphi=(x_1 \vee \bar x_2) \wedge (\bar x_1 \vee x_3 \vee x_4 \vee \bar x_5) היא נוסחת CNF בת שתי פסוקיות.

אי‑דוגמה. (x1∧x2)∨x3(x_1 \wedge x_2) \vee x_3 אינה CNF — כאן ה"וגם" נמצא בפנים וה"או" בחוץ (זו צורת DNF). היא כמובן שקולה לנוסחת CNF כלשהי, אבל בתור מחרוזת קלט היא אינה חוקית עבור SAT.

הגדרה 2: השמה וסיפוק

השמה היא פונקציה vv שנותנת לכל אחד מהמשתנים x1,…,xnx_1,\dots,x_n ערך ב‑{0,1}\{0,1\}. עבור ליטרל מסמנים v(xˉ)=1−v(x)v(\bar x)=1-v(x). ההשמה מספקת פסוקית אם לפחות ליטרל אחד בה מקבל 11, ומספקת נוסחת CNF אם היא מספקת כל אחת מפסוקיותיה. נוסחה נקראת ספיקה אם קיימת השמה שמספקת אותה.

דוגמה (מההרצאה, [00:12:20]–[00:13:56]). עבור φ=(x1∨x3∨x4)∧(xˉ1∨x2)∧(xˉ2∨x3∨xˉ4)\varphi=(x_1\vee x_3 \vee x_4)\wedge(\bar x_1\vee x_2)\wedge(\bar x_2 \vee x_3 \vee \bar x_4) וההשמה v(x1)=1, v(x2)=1, v(x3)=0, v(x4)=1v(x_1)=1,\ v(x_2)=1,\ v(x_3)=0,\ v(x_4)=1: הפסוקית הראשונה מסופקת על ידי x1x_1, השנייה על ידי x2x_2, אך בשלישית xˉ2=0, x3=0, xˉ4=0\bar x_2=0,\ x_3=0,\ \bar x_4=0 — ולכן vv אינה מספקת את φ\varphi. אם משנים ל‑v(x3)=1v(x_3)=1 ההשמה כן מספקת. שימו לב: הנוסחה ספיקה, אך ההשמה הספציפית אינה מספקת — אלה שני דברים שונים.

הגדרה 3: נוסחת 3CNF

נוסחת CNF φ\varphi נקראת נוסחת 3CNF אם כל פסוקית שלה מכילה לא יותר מ‑3 ליטרלים.

אינטואיציה ואי‑דוגמה. הנוסחה (x1∨xˉ2)∧(xˉ1∨x3∨x4∨xˉ5)(x_1\vee \bar x_2)\wedge(\bar x_1\vee x_3\vee x_4\vee \bar x_5) היא CNF ואף 5CNF ו‑4CNF, אבל אינה 3CNF, בגלל הפסוקית השנייה שאורכה 4. לעומת זאת (x1∨xˉ2)∧(x3)(x_1\vee\bar x_2)\wedge(x_3) היא 3CNF — פסוקיות באורך 2 ו‑1 מותרות, כי הדרישה היא "לכל היותר 3".

הערה חשובה על הגדרה זו. יש ספרים שמגדירים 3CNF כ"בדיוק 3 ליטרלים בכל פסוקית". ההבדל אינו מהותי (ראו משפט 7), אבל הוא משנה את פרטי הבנייה. בקורס הזה ההגדרה היא "לכל היותר 3", וזו ההגדרה שממנה נגזר האלגוריתם שלהלן — לכן אין בו טיפול נפרד בפסוקיות באורך 1 או 2.

הגדרה 4: הבעיות SAT ו‑3SAT

SAT={⟨φ⟩ : φ is a satisfiable CNF formula}\mathrm{SAT}=\{\langle\varphi\rangle \ : \ \varphi \text{ is a satisfiable CNF formula}\} 3SAT={⟨φ⟩ : φ is a satisfiable 3CNF formula}\mathrm{3SAT}=\{\langle\varphi\rangle \ : \ \varphi \text{ is a satisfiable 3CNF formula}\}

כמו בהרצאה, לא נעסוק בפרטי הקידוד ⟨⋅⟩\langle\cdot\rangle: מניחים שהקלט מתקבל כמחרוזת תקינה שמתארת נוסחה, ואם אינו תקין — בודקים זאת בזמן פולינומי ודוחים [00:17:52]. נחזור לנקודה הזו כשנבנה את הרדוקציה, כי שם היא דורשת טיפול קטן אך אמיתי.

הגדרה 5: NP‑קשה ו‑NP‑שלמה

שפה BB נקראת NP‑קשה (NP-hard) אם לכל A∈NPA \in \mathrm{NP} מתקיים A≤pBA \le_p B. שפה BB נקראת NP‑שלמה (NP-complete) אם BB NP‑קשה וגם B∈NPB\in\mathrm{NP}.

אינטואיציה. NP‑קשה = "לפחות קשה כמו כל דבר ב‑NP", ולאו דווקא שייכת ל‑NP בעצמה. NP‑שלמה = "הכי קשה ב‑NP, ובתוך NP". סדר הכמתים קריטי: לכל שפה ב‑NP קיימת רדוקציה — לא קיימת רדוקציה אחת שמתאימה לכולן [00:01:08, תמלול 15].


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

משפט 1: NP⊆PSPACE\mathrm{NP} \subseteq \mathrm{PSPACE}

טענה. כל שפה ב‑NP\mathrm{NP} ניתנת להכרעה במקום פולינומי.

הוכחה. תהא A∈NPA \in \mathrm{NP}. לפי הגדרת ה‑verifier קיימות מכונה דטרמיניסטית MM שזמן ריצתה פולינומי — נסמן את הפולינום pp — ופולינום qq, כך שלכל xx: x∈A  ⟺  ∃ w∈{0,1}q(∣x∣)  s.t.  M accepts (x,w).x \in A \iff \exists\, w\in\{0,1\}^{q(|x|)}\ \text{ s.t. } \ M \text{ accepts } (x,w).

נגדיר מכונה דטרמיניסטית MAM_A, על קלט xx:

  1. חשב את q(∣x∣)q(|x|).
  2. לכל w∈{0,1}q(∣x∣)w \in \{0,1\}^{q(|x|)} בסדר לקסיקוגרפי (יש 2q(∣x∣)2^{q(|x|)} אפשרויות):
    • 2.1 הרץ את MM על (x,w)(x,w).
    • 2.2 אם MM קיבלה — קבל.
  3. דחה.

הנקודה שכל ההוכחה תלויה בה: בונים את MAM_A כך שכל איטרציה של הלולאה תשתמש באותם תאים — לפני מעבר ל‑ww הבא מוחקים את סרט העבודה. מספר האיטרציות אקספוננציאלי, אבל המקום לא מצטבר.

נכונות. אם x∈Ax\in A אז קיים ww שעבורו MM מקבלת את (x,w)(x,w); מכיוון ש‑MAM_A עוברת על כל המחרוזות באורך q(∣x∣)q(|x|), היא תגיע ל‑ww הזה, שלב 2.2 יופעל, ו‑MAM_A תקבל. אם x∉Ax\notin A אז לכל w∈{0,1}q(∣x∣)w\in\{0,1\}^{q(|x|)} המכונה MM דוחה את (x,w)(x,w), לכן שלב 2.2 לא מופעל לעולם ו‑MAM_A דוחה בשלב 3.

ניתוח מקום. qq פולינום, ולכן כתיבת ww ומונה הלולאה דורשות O(q(∣x∣))O(q(|x|)) תאים. הרצת MM על (x,w)(x,w): זמן הריצה של MM פולינומי ב‑∣(x,w)∣≤∣x∣+∣w∣=∣x∣+q(∣x∣)|(x,w)| \le |x|+|w| = |x|+q(|x|), ומכונה אינה יכולה לבקר ביותר תאים ממספר הצעדים שעשתה, ולכן המקום שהיא דורשת חסום ב‑p(∣x∣+q(∣x∣))p(|x|+q(|x|)). בסך הכול spaceMA(x)=O(q(∣x∣)+p(∣x∣+q(∣x∣))),\mathrm{space}_{M_A}(x) = O\big(q(|x|) + p(|x|+q(|x|))\big), וזהו פולינום ב‑∣x∣|x| — הרכבה וסכום של פולינומים הם פולינום. לכן A∈PSPACEA \in \mathrm{PSPACE}. ■\blacksquare

הערה: ההוכחה הזו היא הסיבה שלא ניתן לקוות ל"הפרדה בזול" בין P\mathrm{P} ל‑NP\mathrm{NP} דרך מקום: כל NP\mathrm{NP} יושבת בתוך PSPACE\mathrm{PSPACE}, כלומר החיפוש האקספוננציאלי עולה הרבה זמן אך מעט מקום.

משפט 2: P\mathrm{P} סגורה כלפי רדוקציות פולינומיות

טענה. אם A≤pBA \le_p B ו‑B∈PB\in\mathrm{P}, אז A∈PA\in\mathrm{P}.

הוכחה. נניח A≤pBA \le_p B. אז קיימת מכונה MABM_{AB} שמחשבת את הרדוקציה, עם פולינום PP כך שלכל xx מתקיים timeMAB(x)≤P(∣x∣)\mathrm{time}_{M_{AB}}(x) \le P(|x|), ולכל xx: x∈A  ⟺  MAB(x)∈B.x\in A \iff M_{AB}(x) \in B . נניח B∈PB\in\mathrm{P}. אז קיימת מכונה MBM_B שמכריעה את BB עם פולינום qq כך שלכל yy מתקיים timeMB(y)≤q(∣y∣)\mathrm{time}_{M_B}(y)\le q(|y|).

נגדיר מכונה MAM_A, על קלט xx:

  1. חשב את MAB(x)M_{AB}(x).
  2. הרץ את MBM_B על MAB(x)M_{AB}(x) והחזר את אותה תשובה.

נכונות. אם x∈Ax\in A אז MAB(x)∈BM_{AB}(x)\in B, לכן MBM_B מקבלת את MAB(x)M_{AB}(x), לכן MAM_A מקבלת את xx. אם x∉Ax\notin A אז MAB(x)∉BM_{AB}(x)\notin B, לכן MBM_B דוחה, לכן MAM_A דוחה.

ניתוח זמן. שלב 1 לוקח לכל היותר P(∣x∣)P(|x|) צעדים. לשלב 2 דרוש q(∣MAB(x)∣)q(|M_{AB}(x)|), ולכן צריך לחסום את אורך הפלט. מכונה שרצה tt צעדים אינה יכולה להאריך את הקלט ביותר מ‑tt תווים, ולכן ∣MAB(x)∣≤timeMAB(x)+∣x∣≤P(∣x∣)+∣x∣,|M_{AB}(x)| \le \mathrm{time}_{M_{AB}}(x) + |x| \le P(|x|)+|x|, ומכאן ששלב 2 עולה לכל היותר q(P(∣x∣)+∣x∣)q\big(P(|x|)+|x|\big). סכום שני הביטויים הוא סכום והרכבה של פולינומים — ולכן פולינום. לכן MAM_A מכריעה את AA בזמן פולינומי, כלומר A∈PA\in\mathrm{P}. ■\blacksquare

הערה: החסם על אורך הפלט הוא בדיוק הצעד ש"נבלע" בדרך כלל. בלעדיו לא הייתה סיבה ש‑qq מופעל על ארגומנט קטן, וההרכבה יכלה להתפוצץ. זו הסיבה שכדאי תמיד לכתוב ∣f(x)∣≤P(∣x∣)+∣x∣|f(x)| \le P(|x|)+|x| במפורש.

מסקנות (עמוד 3 בסיכום).

  1. באותו אופן בדיוק — מחליפים את P\mathrm{P} במחלקה המתאימה ואת חסם הזמן בחסם המתאים — מקבלים ש‑NP\mathrm{NP}, PSPACE\mathrm{PSPACE}, NPSPACE\mathrm{NPSPACE}, EXP\mathrm{EXP} ו‑NEXP\mathrm{NEXP} כולן סגורות כלפי רדוקציות זמן פולינומי.
  2. היחס ≤p\le_p טרנזיטיבי: אם A≤pBA\le_p B דרך ff ו‑B≤pCB \le_p C דרך gg, אז g∘fg\circ f היא רדוקציה מ‑AA ל‑CC; היא ניתנת לחישוב בזמן פולינומי כי ∣f(x)∣|f(x)| פולינומי ב‑∣x∣|x| (אותו חישוב בדיוק כמו למעלה), והנכונות היא שרשור של שתי שקילויות.
  3. מכאן המסקנה המבצעית של כל התחום: מספיק למצוא בעיה קשה אחת. אם AA NP‑קשה ו‑A≤pBA \le_p B, אז BB NP‑קשה — כי לכל C∈NPC\in\mathrm{NP} מתקיים C≤pA≤pBC \le_p A \le_p B ולפי הטרנזיטיביות C≤pBC\le_p B.

משפט 3: משמעות NP‑שלמות

טענה. תהא AA שפה NP‑שלמה. אז A∈PA\in\mathrm{P} אם ורק אם P=NP\mathrm{P}=\mathrm{NP}.

הוכחה. (⇐)(\Leftarrow) אם P=NP\mathrm{P}=\mathrm{NP}: מכיוון ש‑AA NP‑שלמה בפרט A∈NP=PA\in\mathrm{NP}=\mathrm{P}. (⇒)(\Rightarrow) נניח A∈PA\in\mathrm{P}. ההכלה P⊆NP\mathrm{P}\subseteq\mathrm{NP} ידועה. לכיוון השני, תהא B∈NPB\in\mathrm{NP} שרירותית. מכיוון ש‑AA NP‑קשה מתקיים B≤pAB\le_p A, ומכיוון ש‑A∈PA\in\mathrm{P}, לפי משפט 2 מתקבל B∈PB\in\mathrm{P}. מכאן NP⊆P\mathrm{NP}\subseteq\mathrm{P}, ובסך הכול P=NP\mathrm{P}=\mathrm{NP}. ■\blacksquare

זו הסיבה שכל התחום מתעניין בבעיות NP‑שלמות: אלגוריתם פולינומי לאחת מהן מפיל את כולן. הצעד הבא — קיומה של בעיה NP‑קשה ראשונה — הוא משפט קוק–לוין: SAT היא NP‑קשה (שיעור 9). כל מה שנעשה כאן מתבסס עליו כקופסה שחורה.

משפט 4: 3SAT≤pSAT\mathrm{3SAT} \le_p \mathrm{SAT}, ומכאן 3SAT∈NP\mathrm{3SAT}\in\mathrm{NP}

טענה. 3SAT≤pSAT\mathrm{3SAT} \le_p \mathrm{SAT}.

הוכחה. הרדוקציה היא פונקציית הזהות: בהינתן ⟨φ⟩\langle\varphi\rangle מחזירים ⟨φ⟩\langle\varphi\rangle. זמן החישוב הוא זמן ההעתקה, כלומר O(∣φ∣)O(|\varphi|) — פולינומי. הנכונות: אם φ\varphi נוסחת 3CNF ספיקה, אז בפרט φ\varphi נוסחת CNF ספיקה (כל 3CNF היא CNF), כלומר ⟨φ⟩∈SAT\langle\varphi\rangle \in\mathrm{SAT}. ולהפך, אם ⟨φ⟩∈SAT\langle\varphi\rangle\in \mathrm{SAT} ו‑φ\varphi 3CNF, אז ⟨φ⟩∈3SAT\langle\varphi\rangle\in\mathrm{3SAT} לפי ההגדרה. (קלט שאינו 3CNF תקין נדחה על ידי שתי הבעיות ולכן אינו מפר את השקילות.) ■\blacksquare

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

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

משפט 5 (הלמה המרכזית): נכונות צעד הפיצול

זהו הלב המתמטי של השיעור. נגדיר תחילה את הצעד הבודד.

אלגוריתם 1. על קלט φ\varphi, נוסחה מצורת CNF:

  1. אם φ\varphi היא כבר נוסחת 3CNF — החזר את φ\varphi.
  2. אחרת, נסמן ב‑CC את הפסוקית הראשונה ב‑φ\varphi שיש בה יותר מ‑3 ליטרלים, ונכתוב C=ℓ1∨ℓ2∨⋯∨ℓkC=\ell_1 \vee \ell_2 \vee \dots \vee \ell_k (כאשר k>3k>3). נגדיר C′=ℓ1∨ℓ2∨z(3 literals)C' = \ell_1 \vee \ell_2 \vee z \qquad (3 \text{ literals}) C′′=ℓ3∨ℓ4∨⋯∨ℓk∨zˉ(k−1 literals)C'' = \ell_3 \vee \ell_4 \vee \dots \vee \ell_k \vee \bar z \qquad (k-1 \text{ literals}) כאשר zz הוא משתנה חדש שאינו מופיע ב‑φ\varphi.
  3. נגדיר את φ^\hat\varphi כנוסחה המתקבלת מ‑φ\varphi על ידי החלפת CC ב‑C′∧C′′C' \wedge C'' (במקומה, כך ש‑C′′C'' נשארת הפסוקית הארוכה הראשונה).
  4. החזר את φ^\hat\varphi.

האינטואיציה — מה zz עושה. zz הוא מתג שאומר "הליטרלים הראשונים לא סיפקו את CC, מישהו מאוחר יותר יסדר את זה". אם z=1z=1 אז C′C' מסופקת בזכות zz בלבד, ואז zˉ=0\bar z=0 ולכן C′′C'' חייבת להיות מסופקת על ידי אחד מ‑ℓ3,…,ℓk\ell_3,\dots,\ell_k. אם z=0z=0 אז C′′C'' מסופקת בזכות zˉ\bar z בלבד, ואז C′C' חייבת להיות מסופקת על ידי ℓ1\ell_1 או ℓ2\ell_2. בשני המקרים "מישהו אמיתי" מתוך ℓ1,…,ℓk\ell_1,\dots,\ell_k חייב להיות אמיתי — וזו בדיוק CC.

בניסוח קומפקטי: לכל השמה vv למשתני φ\varphi, v(C)=1  ⟺  ∃ b∈{0,1}: v[z↦b](C′∧C′′)=1.v(C)=1 \iff \exists\, b\in\{0,1\}:\ v[z\mapsto b](C' \wedge C'')=1 . כלומר C′∧C′′C' \wedge C'' אינה שקולה ל‑CC — היא שקולה לה רק אחרי שמכמתים קיומית את zz. השקילות שאנחנו צריכים היא שקילות ספיקות (equisatisfiability), לא שקילות לוגית. זו נקודה שנופלים עליה במבחן.

טענה (משפט 5). תהא φ\varphi נוסחת CNF, ונסמן ב‑φ^\hat\varphi את פלט אלגוריתם 1 על φ\varphi. אז φ\varphi ספיקה   ⟺  \iff φ^\hat\varphi ספיקה.

הוכחה. נפריד לשני מקרים.

מקרה A: φ^=φ\hat\varphi = \varphi. זה קורה בדיוק כאשר φ\varphi כבר 3CNF, ואז הטענה טריוויאלית.

מקרה B: φ^≠φ\hat\varphi \ne \varphi. נסמן כמו באלגוריתם: C=ℓ1∨⋯∨ℓkC=\ell_1\vee\dots\vee\ell_k היא הפסוקית הראשונה באורך >3>3, ו‑C′=ℓ1∨ℓ2∨zC'=\ell_1\vee\ell_2\vee z, C′′=ℓ3∨⋯∨ℓk∨zˉC''=\ell_3\vee\dots\vee\ell_k\vee\bar z, כאשר zz חדש. שימו לב לעובדה שתשמש שוב ושוב: פסוקיות φ\varphi ו‑φ^\hat\varphi זהות פרט לכך ש‑CC הוחלפה ב‑C′,C′′C',C'', ו‑zz אינו מופיע באף פסוקית אחרת.


כיוון ראשון: φ\varphi ספיקה ⇒\Rightarrow φ^\hat\varphi ספיקה.

תהא vv השמה המספקת את φ\varphi. מכיוון ש‑vv מספקת את φ\varphi היא בפרט מספקת את CC, ולכן קיים 1≤i≤k1\le i\le k עם v(ℓi)=1v(\ell_i)=1. נפריד לשני תת‑מקרים לפי מה שקורה בשני הליטרלים הראשונים.

מקרה B.1: v(ℓ1)=0v(\ell_1)=0 וגם v(ℓ2)=0v(\ell_2)=0. נגדיר השמה v^\hat v עבור φ^\hat\varphi: v^(x)={v(x)x≠z1x=z\hat v(x)=\begin{cases} v(x) & x \ne z\\ 1 & x=z\end{cases}

  • כל פסוקית DD של φ^\hat\varphi שאינה C′C' ואינה C′′C'': DD היא גם פסוקית של φ\varphi, ולכן vv מספקת אותה. המשתנה zz אינו מופיע ב‑DD, ולכן v^\hat v ו‑vv נותנות את אותם ערכים לכל משתני DD. מכאן ש‑v^\hat v מספקת את DD.
  • C′C': מכיוון ש‑v^(z)=1\hat v(z)=1, הליטרל zz מספק את C′C'.
  • C′′C'': vv מספקת את CC ומתקיים v(ℓ1)=v(ℓ2)=0v(\ell_1)=v(\ell_2)=0, ולכן קיים 3≤j≤k3\le j\le k כך ש‑v(ℓj)=1v(\ell_j)=1. הליטרל ℓj\ell_j הוא מעל משתנה של φ\varphi, כלומר משתנה ששונה מ‑zz, ולכן מהגדרת v^\hat v מתקיים v^(ℓj)=v(ℓj)=1\hat v(\ell_j)=v(\ell_j)=1. לכן v^\hat v מספקת את C′′C''.

מכאן ש‑v^\hat v מספקת את כל פסוקיות φ^\hat\varphi, כלומר φ^\hat\varphi ספיקה.

מקרה B.2: v(ℓ1)=1v(\ell_1)=1 או v(ℓ2)=1v(\ell_2)=1. נגדיר השמה v^\hat v עבור φ^\hat\varphi: v^(x)={v(x)x≠z0x=z\hat v(x)=\begin{cases} v(x) & x \ne z\\ 0 & x=z\end{cases}

הערה: בסיכום הכתוב, המקרה הזה מסוכם במילים "באופן דומה v^\hat v מספקת את φ^\hat\varphi". הנה הפירוט המלא.

  • כל פסוקית DD שאינה C′,C′′C',C'': בדיוק כמו קודם — DD פסוקית של φ\varphi, zz אינו מופיע בה, v^\hat v מסכימה עם vv על משתניה, ו‑vv מספקת אותה. לכן v^\hat v מספקת את DD.
  • C′C': הליטרלים ℓ1,ℓ2\ell_1,\ell_2 הם מעל משתנים של φ\varphi, ולכן v^(ℓ1)=v(ℓ1)\hat v(\ell_1)=v(\ell_1) ו‑v^(ℓ2)=v(ℓ2)\hat v(\ell_2)=v(\ell_2). לפי ההנחה אחד מהם שווה 11, ולכן v^\hat v מספקת את C′C'.
  • C′′C'': מכיוון ש‑v^(z)=0\hat v(z)=0 מתקיים v^(zˉ)=1\hat v(\bar z)=1, והליטרל zˉ\bar z מספק את C′′C''.

לכן v^\hat v מספקת את φ^\hat\varphi, ו‑φ^\hat\varphi ספיקה. הכיוון הזה הושלם.


כיוון שני (החצי העדין): φ^\hat\varphi ספיקה ⇒\Rightarrow φ\varphi ספיקה.

כאן צריך להראות שמשתנה העזר אינו יכול לרמות — שאי אפשר "לספק" את φ^\hat\varphi בזכות zz בלבד ולהשאיר את φ\varphi בלתי מסופקת. שימו לב שכאן אין לנו חופש בבחירת ההשמה: היא נתונה לנו, ולעומת זאת בכיוון הראשון אנחנו אלה שבנינו אותה.

תהא v^\hat v השמה המספקת את φ^\hat\varphi. נגדיר השמה vv עבור φ\varphi על ידי צמצום: לכל משתנה xx המופיע ב‑φ\varphi נגדיר v(x)=v^(x)v(x)=\hat v(x). (זה מוגדר היטב, כי כל משתני φ\varphi הם משתני φ^\hat\varphi.)

כל פסוקית DD של φ\varphi שאינה CC: DD היא גם פסוקית של φ^\hat\varphi, ולכן v^\hat v מספקת אותה; vv נותנת אותם ערכים כמו v^\hat v לכל משתני DD, ולכן vv מספקת את DD.

נותר להראות ש‑vv מספקת את CC. נפריד לשני מקרים לפי הערך ש‑v^\hat v נתנה למשתנה החדש.

מקרה B.3: v^(z)=1\hat v(z)=1. v^\hat v מספקת את φ^\hat\varphi ובפרט את C′′=ℓ3∨⋯∨ℓk∨zˉC''=\ell_3\vee\dots\vee\ell_k\vee\bar z. אבל v^(zˉ)=0\hat v(\bar z)=0, ולכן הליטרל zˉ\bar z אינו זה שמספק את C′′C''; לכן חייב להתקיים שקיים 3≤j≤k3\le j\le k עם v^(ℓj)=1\hat v(\ell_j)=1. הליטרל ℓj\ell_j הוא מעל משתנה של φ\varphi, ולכן v(ℓj)=v^(ℓj)=1v(\ell_j)=\hat v(\ell_j)=1. מכאן ש‑vv מספקת את CC.

מקרה B.4: v^(z)=0\hat v(z)=0. v^\hat v מספקת בפרט את C′=ℓ1∨ℓ2∨zC'=\ell_1\vee\ell_2\vee z. אבל v^(z)=0\hat v(z)=0, ולכן הליטרל zz אינו מספק את C′C'; לכן v^(ℓ1)=1\hat v(\ell_1)=1 או v^(ℓ2)=1\hat v(\ell_2)=1. שוב ℓ1,ℓ2\ell_1,\ell_2 מעל משתנים של φ\varphi, ולכן v(ℓ1)=1v(\ell_1)=1 או v(ℓ2)=1v(\ell_2)=1, ומכאן ש‑vv מספקת את CC.

בשני המקרים vv מספקת את כל פסוקיות φ\varphi, ולכן φ\varphi ספיקה. ■\blacksquare

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

למה לא בנייה נאיבית? שווה לראות מה נשבר:

  • ניסיון א' — לחתוך את CC לבלוקים: C=ℓ1∨⋯∨ℓ6C=\ell_1\vee\dots\vee\ell_6 מוחלפת ב‑(ℓ1∨ℓ2∨ℓ3)∧(ℓ4∨ℓ5∨ℓ6)(\ell_1\vee\ell_2\vee\ell_3)\wedge(\ell_4\vee\ell_5\vee\ell_6). זה שגוי לחלוטין: הבנייה דורשת שכל בלוק יסופק, כלומר היא חזקה מדי — CC עם ℓ1=1\ell_1=1 וכל השאר 00 מסופקת, בעוד הנוסחה החדשה אינה מסופקת.
  • ניסיון ב' — פשוט לזרוק ליטרלים: מחליפים את CC ב‑(ℓ1∨ℓ2∨ℓ3)(\ell_1\vee\ell_2\vee\ell_3). גם זה שגוי, מאותה סיבה בכיוון ההפוך — נוסחה ספיקה יכולה להיות ספיקה רק בזכות ℓ5\ell_5.
  • מה שחסר בשני הניסיונות הוא בדיוק אמצעי להעביר את המידע "כבר סיפקתי" מבלוק לבלוק. משתנה עזר חדש zz הוא בדיוק אמצעי כזה — ולכן הוא הכרחי, ולכן הבנייה יוצרת נוסחה שאינה שקולה ללוגית ל‑φ\varphi אלא רק שקולת‑ספיקות.

משפט 6: SAT≤p3SAT\mathrm{SAT} \le_p \mathrm{3SAT}

טענה. קיימת רדוקציית זמן פולינומי מ‑SAT\mathrm{SAT} ל‑3SAT\mathrm{3SAT}. במילים: 3SAT היא לפחות קשה כמו SAT.

הוכחה. נתבונן באלגוריתם הבא. על קלט φ\varphi, נוסחה מצורת CNF:

  1. כל עוד φ\varphi אינה נוסחה מצורת 3CNF:
    • 1.1 הרץ את אלגוריתם 1 על φ\varphi ונסמן את הפלט φ^\hat\varphi (בכל הפעלה נבחר משתנה עזר חדש, שלא הופיע באף שלב קודם).
    • 1.2 φ←φ^\varphi \leftarrow \hat\varphi.
  2. החזר את φ\varphi.

בנוסף, אם הקלט אינו קידוד תקין של נוסחת CNF — נדחה אותו, כלומר נחזיר נוסחת 3CNF קבועה ובלתי‑ספיקה, למשל (y)∧(yˉ)(y)\wedge(\bar y). בדיקת התקינות והפלט הקבוע נעשים בזמן לינארי. (בהרצאה הנקודה הזו נאמרה כהנחה: "אני מניח שקיבלתי נוסחה בצורת CNF... אפשר לבדוק תקינות ולדחות" [00:17:52].)

עצירה. בכל איטרציה, פסוקית באורך k>3k>3 מוחלפת בפסוקיות באורכים 33 ו‑k−1k-1; פסוקיות באורך ≤3\le 3 אינן משתנות לעולם. לכן הסכום ∑C∈φ, ∣C∣>3(∣C∣−3)\sum_{C \in \varphi,\ |C|>3}(|C|-3) יורד בדיוק ב‑11 בכל איטרציה, והוא מספר טבעי אי‑שלילי — אז הלולאה עוצרת, ובפלט כל הפסוקיות באורך ≤3\le 3, כלומר הפלט הוא 3CNF.

נכונות. נסמן ב‑φ0=φ\varphi_0=\varphi את הקלט, וב‑φ1,…,φm\varphi_1,\dots,\varphi_m את הנוסחאות אחרי כל איטרציה, כאשר φm\varphi_m הוא הפלט. לפי משפט 5, לכל 0≤t<m0\le t<m מתקיים "φt\varphi_t ספיקה   ⟺  \iff φt+1\varphi_{t+1} ספיקה". באינדוקציה על tt מתקבל φ satisfiable  ⟺  φm satisfiable.\varphi \text{ satisfiable} \iff \varphi_m \text{ satisfiable}. מכיוון ש‑φm\varphi_m היא 3CNF, זה בדיוק ⟨φ⟩∈SAT  ⟺  ⟨φm⟩∈3SAT.\langle \varphi\rangle \in \mathrm{SAT} \iff \langle\varphi_m\rangle \in \mathrm{3SAT}.

הערה על תנאי הרעננות בלולאה: משפט 5 דורש ש‑zz לא יופיע ב‑φ\varphi הנוכחית, כלומר גם לא במשתני העזר שנוספו באיטרציות קודמות. לכן מקצים משתנה עזר חדש לכל איטרציה. הדבר גם מבטיח שהאינדוקציה למעלה חוקית: בכל צעד תנאי משפט 5 מתקיימים.

ניתוח זמן ריצה (במפורש). נסמן ב‑LL את מספר מופעי הליטרלים בנוסחת הקלט; ברור ש‑L≤∣φ∣L \le |\varphi|.

  1. מספר האיטרציות. כפי שראינו בהוכחת העצירה, מספר האיטרציות שווה בדיוק ל‑∑∣C∣>3(∣C∣−3)≤L≤∣φ∣\sum_{|C|>3}(|C|-3) \le L \le |\varphi|, כלומר O(∣φ∣)O(|\varphi|). (בסיכום כתוב לצד זה בכחול: כל הפעלה מקטינה את הפסוקית הארוכה ב‑1 — זו בדיוק הסיבה.)
  2. גידול אורך הנוסחה. בכל איטרציה פסוקית באורך kk מוחלפת בשתי פסוקיות באורכים 33 ו‑k−1k-1, כלומר מספר מופעי הליטרלים גדל ב‑22 בדיוק, ומספר הפסוקיות ב‑11. לכן אחרי כל האיטרציות Lfinal≤L+2⋅(number of iterations)≤3L=O(∣φ∣),L_{\text{final}} \le L + 2\cdot(\text{number of iterations}) \le 3L = O(|\varphi|), כלומר הנוסחה אינה מתנפחת — היא נשארת לינארית באורך הקלט. בפרט לכל אורך הריצה כל נוסחת ביניים היא בגודל O(∣φ∣)O(|\varphi|).
  3. מחיר איטרציה בודדת. סריקת הנוסחה הנוכחית כדי לאתר את הפסוקית הארוכה הראשונה, והעתקתה עם הפיצול, עולים O(∣φt∣)=O(∣φ∣)O(|\varphi_t|) = O(|\varphi|).
  4. סך הכול. O(∣φ∣)⋅O(∣φ∣)=O(∣φ∣2)O(|\varphi|) \cdot O(|\varphi|) = O(|\varphi|^2) — פולינומי. ■\blacksquare

הערה על דיוק החסם: בסיכום נכתב שאורך φ^\hat\varphi אינו עולה על 2∣φ∣2|\varphi|. ספירה מדויקת של מופעי ליטרלים נותנת 3L3L ולא 2L2L (הקלט LL ועוד 22 לכל אחת מעד LL איטרציות). ההבדל אינו משנה דבר — שני החסמים לינאריים ולכן זמן הריצה O(∣φ∣2)O(|\varphi|^2) בעינו. הערה נוספת ברמת הביטים: הרדוקציה מוסיפה עד LL משתנים חדשים, וקידוד אינדקס של משתנה חדש עשוי לדרוש O(log⁡L)O(\log L) ביטים, כך שאורך הפלט בביטים הוא O(∣φ∣log⁡∣φ∣)O(|\varphi|\log|\varphi|). עדיין פולינומי, וזמן הריצה עדיין פולינומי — אך כדאי לדעת שהחסם הלינארי הוא בספירת סמלים, לא בהכרח בספירת ביטים.

מסקנה: 3SAT\mathrm{3SAT} היא NP‑שלמה

  • 3SAT∈NP\mathrm{3SAT}\in\mathrm{NP} — מסקנת משפט 4.
  • 3SAT\mathrm{3SAT} NP‑קשה — לפי משפט קוק–לוין SAT\mathrm{SAT} NP‑קשה, לפי משפט 6 מתקיים SAT≤p3SAT\mathrm{SAT}\le_p \mathrm{3SAT}, ולפי מסקנה 3 של משפט 2 (טרנזיטיביות) מתקבל שכל A∈NPA\in\mathrm{NP} מקיימת A≤pSAT≤p3SATA\le_p\mathrm{SAT}\le_p\mathrm{3SAT}.

לכן 3SAT\mathrm{3SAT} NP‑שלמה. ■\blacksquare

למה בכלל טורחים? אחרי משפט קוק–לוין כבר יש לנו בעיה NP‑שלמה, אז מדוע להוסיף עוד אחת? כי 3SAT היא נקודת מוצא נוחה בהרבה לרדוקציות עתידיות: קלט של 3SAT הוא אוסף פסוקיות שכל אחת מהן מכילה לכל היותר 3 ליטרלים, מבנה נוקשה שקל להעתיק לגרף, לקבוצות או לאילוצים גיאומטריים. בשיעורים הבאים כמעט כל רדוקציה תתחיל מ‑3SAT ולא מ‑SAT. בהקלטה של שיעור 9 המרצה מציין שזו בדיוק הדרך של Karp: "הוא עשה את הרדוקציה מ‑SAT ל‑3SAT שהראינו, את הרדוקציה מ‑SAT ל‑IS, ואז מ‑IS ל‑CLIQUE" [01:20:52, תמלול 15].

משפט 7 (השלמה): הווריאנט "בדיוק 3 ליטרלים"

טענה. נסמן ב‑3SAT=\mathrm{3SAT}^{=} את הבעיה שבה כל פסוקית מכילה בדיוק 3 ליטרלים. אז 3SAT≤p3SAT=\mathrm{3SAT} \le_p \mathrm{3SAT}^{=}, ולכן גם 3SAT=\mathrm{3SAT}^{=} NP‑שלמה.

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

הוכחה. בהינתן נוסחת 3CNF φ\varphi, נטפל בכל פסוקית לפי אורכה, עם משתנים חדשים y,y′y,y' לכל פסוקית בנפרד:

  • אורך 3: משאירים כמו שהיא.
  • אורך 2, C=ℓ1∨ℓ2C=\ell_1\vee\ell_2: מחליפים ב‑(ℓ1∨ℓ2∨y)∧(ℓ1∨ℓ2∨yˉ)(\ell_1\vee\ell_2\vee y)\wedge(\ell_1\vee\ell_2\vee\bar y). נכונות: אם v(ℓ1)=1v(\ell_1)=1 או v(ℓ2)=1v(\ell_2)=1 — שתי הפסוקיות מסופקות בכל ערך של yy. אם שניהם 00 — אחת משתי הפסוקיות נכשלת, כי אחד מ‑y,yˉy,\bar y מקבל 00. כלומר הצמד מסופק אם ורק אם CC מסופקת, בכל השמה ל‑yy.
  • אורך 1, C=ℓ1C=\ell_1: מחליפים ב‑ (ℓ1∨y∨y′)∧(ℓ1∨y∨yˉ′)∧(ℓ1∨yˉ∨y′)∧(ℓ1∨yˉ∨yˉ′).(\ell_1\vee y\vee y')\wedge(\ell_1\vee y\vee \bar y')\wedge(\ell_1\vee \bar y\vee y')\wedge(\ell_1\vee \bar y\vee \bar y'). נכונות: אם v(ℓ1)=1v(\ell_1)=1 הכול מסופק. אם v(ℓ1)=0v(\ell_1)=0, אז לכל בחירה של (y,y′)(y,y') אחת מארבע הפסוקיות מכילה את שני הליטרלים המשלימים ומקבלת 00.

בשני המקרים המשתנים החדשים אינם מופיעים בשום מקום אחר, ולכן אפשר לצמצם/להרחיב השמות בדיוק כמו במשפט 5. גודל הפלט לכל היותר פי 4 מגודל הקלט, וזמן החישוב לינארי. ■\blacksquare


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

דוגמה 1: מסלול מלא של נוסחה דרך הרדוקציה, בשני הכיוונים

ניקח את הדוגמה מעמוד 4 בסיכום: φ=(x1∨xˉ2)∧(x1∨x3∨x4∨xˉ5∨xˉ6).\varphi = (x_1 \vee \bar x_2) \wedge (x_1 \vee x_3 \vee x_4 \vee \bar x_5 \vee \bar x_6).

איטרציה 1. הפסוקית הראשונה באורך >3>3 היא C=x1∨x3∨x4∨xˉ5∨xˉ6C=x_1\vee x_3\vee x_4\vee\bar x_5\vee \bar x_6, כלומר k=5k=5, ℓ1=x1\ell_1=x_1, ℓ2=x3\ell_2=x_3. עם משתנה חדש z1z_1: C′=x1∨x3∨z1,C′′=x4∨xˉ5∨xˉ6∨zˉ1(k−1=4 literals),C' = x_1\vee x_3\vee z_1, \qquad C''=x_4\vee \bar x_5\vee\bar x_6\vee \bar z_1 \quad (k-1=4 \text{ literals}), φ1=(x1∨xˉ2)∧(x1∨x3∨z1)∧(x4∨xˉ5∨xˉ6∨zˉ1).\varphi_1 = (x_1\vee\bar x_2)\wedge(x_1\vee x_3\vee z_1)\wedge(x_4\vee\bar x_5\vee\bar x_6\vee\bar z_1).

איטרציה 2. הפסוקית הארוכה היחידה היא x4∨xˉ5∨xˉ6∨zˉ1x_4\vee\bar x_5\vee\bar x_6\vee\bar z_1 (k=4k=4), עם ℓ1=x4, ℓ2=xˉ5\ell_1=x_4,\ \ell_2=\bar x_5. עם משתנה חדש z2z_2: φ2=(x1∨xˉ2)∧(x1∨x3∨z1)∧(x4∨xˉ5∨z2)∧(xˉ6∨zˉ1∨zˉ2).\varphi_2=(x_1\vee\bar x_2)\wedge(x_1\vee x_3\vee z_1)\wedge(x_4\vee\bar x_5\vee z_2)\wedge(\bar x_6\vee\bar z_1\vee\bar z_2). כל הפסוקיות באורך ≤3\le 3 — זהו הפלט. שימו לב לאימות המספרים: L=2+5=7L=2+5=7 מופעי ליטרלים בקלט, שתי איטרציות (כי 5−3=25-3=2), ובפלט 2+3+3+3=11=7+2⋅22+3+3+3=11 = 7+2\cdot 2 מופעים. בדיוק כמו שניתוח הזמן חזה.

מסלול קדימה (φ\varphi ספיקה ⇒\Rightarrow φ2\varphi_2 ספיקה). ניקח v: x1=1, x2=1, x3=0, x4=0, x5=1, x6=1.v: \ x_1=1,\ x_2=1,\ x_3=0,\ x_4=0,\ x_5=1,\ x_6=1. vv מספקת את φ\varphi: הפסוקית הראשונה בזכות x1x_1, השנייה בזכות x1x_1.

  • באיטרציה 1: v(ℓ1)=v(x1)=1v(\ell_1)=v(x_1)=1 — זהו מקרה B.2, ולכן v^(z1)=0\hat v(z_1)=0. בדיקה: (x1∨x3∨z1)=1(x_1\vee x_3\vee z_1)=1 בזכות x1x_1; (x4∨xˉ5∨xˉ6∨zˉ1)=1(x_4\vee\bar x_5\vee\bar x_6\vee\bar z_1)=1 בזכות zˉ1\bar z_1.
  • באיטרציה 2, ביחס לנוסחה φ1\varphi_1 ולהשמה שהתקבלה: ℓ1=x4=0\ell_1=x_4=0 ו‑ℓ2=xˉ5=0\ell_2=\bar x_5=0 — זהו מקרה B.1, ולכן z2=1z_2=1. בדיקה: (x4∨xˉ5∨z2)=1(x_4\vee\bar x_5\vee z_2)=1 בזכות z2z_2; (xˉ6∨zˉ1∨zˉ2)=0∨1∨0=1(\bar x_6\vee\bar z_1\vee\bar z_2) = 0\vee 1\vee 0=1 בזכות zˉ1\bar z_1.

ההשמה הסופית v^:x1=1,x2=1,x3=0,x4=0,x5=1,x6=1,z1=0,z2=1\hat v: x_1{=}1,x_2{=}1,x_3{=}0,x_4{=}0,x_5{=}1,x_6{=}1,z_1{=}0,z_2{=}1 מספקת את כל ארבע הפסוקיות של φ2\varphi_2.

מסלול אחורה (φ2\varphi_2 ספיקה ⇒\Rightarrow φ\varphi ספיקה). ניקח הפעם השמה "עוינת" ל‑φ2\varphi_2 שמנסה להישען על משתני העזר: u: x1=0, x2=0, x3=0, x4=0, x5=0, x6=0, z1=1, z2=0.u:\ x_1=0,\ x_2=0,\ x_3=0,\ x_4=0,\ x_5=0,\ x_6=0,\ z_1=1,\ z_2=0. בדיקה: (x1∨xˉ2)=1(x_1\vee\bar x_2)=1; (x1∨x3∨z1)=1(x_1\vee x_3\vee z_1)=1 בזכות z1z_1; (x4∨xˉ5∨z2)=1(x_4\vee\bar x_5\vee z_2)=1 בזכות xˉ5\bar x_5; (xˉ6∨zˉ1∨zˉ2)=1(\bar x_6\vee\bar z_1\vee\bar z_2)=1 בזכות xˉ6\bar x_6. אכן uu מספקת את φ2\varphi_2.

נצמצם: v=u∣x1,…,x6v=u|_{x_1,\dots,x_6}, כלומר כל ה‑xx‑ים אפס. האם vv מספקת את φ\varphi? (x1∨xˉ2)=0∨1=1(x_1\vee\bar x_2)=0\vee 1=1; (x1∨x3∨x4∨xˉ5∨xˉ6)=0∨0∨0∨1∨1=1(x_1\vee x_3\vee x_4\vee\bar x_5\vee\bar x_6)=0\vee0\vee0\vee1\vee1=1. כן.

וזה בדיוק הטיעון של מקרה B.3 בפעולה: u(z1)=1u(z_1)=1 אילץ את zˉ1\bar z_1 להיות 00, כך שהפסוקית (x4∨xˉ5∨xˉ6∨zˉ1)(x_4\vee\bar x_5\vee\bar x_6\vee\bar z_1) נאלצה להיות מסופקת על ידי ליטרל מקורי — ואכן xˉ5=1\bar x_5=1. משתנה העזר "העביר את החוב הלאה" ולא הצליח לפרוע אותו בעצמו.

דוגמה 2: C′∧C′′C' \wedge C'' אינה שקולה ל‑CC

יהי C=a∨b∨c∨dC=a\vee b\vee c\vee d, ונפצל: C′=a∨b∨zC'=a\vee b\vee z, C′′=c∨d∨zˉC''=c\vee d\vee\bar z.

  • קחו a=1a=1 ו‑b=c=d=0b=c=d=0. אז CC מסופקת. אבל אם בנוסף z=1z=1: C′=1C'=1 ואילו C′′=0∨0∨0=0C''=0\vee0\vee0=0 — הצמד אינו מסופק.
  • קחו a=b=c=d=0a=b=c=d=0. אז CC אינה מסופקת, ואכן בשתי הבחירות של zz הצמד נכשל: z=1z=1 מפיל את C′′C'', z=0z=0 מפיל את C′C'.

המסקנה: לא לכל zz מתקיים C′∧C′′C'\wedge C'' כאשר CC מתקיימת — אלא קיים zz כזה. כל הוכחה שכותבת "C≡C′∧C′′C \equiv C'\wedge C''" שגויה; הניסוח הנכון הוא שקילות ספיקות, ולכן ההוכחה חייבת לעבור דרך בניית ההשמה בכל כיוון בנפרד.

תרגיל 1: מה נשבר אם משתמשים באותו zz פעמיים?

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

פתרון. יהי φ=(a∨b∨c∨d)∧(e∨f∨g∨h).\varphi = (a\vee b\vee c\vee d)\wedge(e\vee f\vee g\vee h). עם אותו zz בשני הפיצולים מקבלים φ^=(a∨b∨z)∧(c∨d∨zˉ)∧(e∨f∨z)∧(g∨h∨zˉ).\hat\varphi = (a\vee b\vee z)\wedge(c\vee d\vee\bar z)\wedge(e\vee f\vee z)\wedge(g\vee h\vee\bar z). קחו את ההשמה a=1, g=1a=1,\ g=1 וכל השאר 00. אז φ\varphi מסופקת (הפסוקית הראשונה בזכות aa, השנייה בזכות gg). אבל ב‑φ^\hat\varphi:

  • אם z=0z=0: הפסוקית (e∨f∨z)=0(e\vee f\vee z)=0.
  • אם z=1z=1: הפסוקית (c∨d∨zˉ)=0(c\vee d\vee\bar z)=0.

יתרה מזאת, קל לבדוק ש‑φ^\hat\varphi אינה ספיקה כלל תחת ההשמה הזו לשאר המשתנים, בעוד φ\varphi ספיקה — כלומר הרדוקציה השבורה מייצרת "לא" עבור קלט שהתשובה עליו "כן". הסיבה: משתנה עזר יחיד נדרש להעיד בו‑זמנית "בפסוקית הראשונה הסתדרנו מוקדם" ו"בפסוקית השנייה הסתדרנו מאוחר", ואלה דרישות סותרות.

תרגיל 2: מה נשבר אם zz אינו חדש?

התרגיל. מדוע דורשים ש‑zz לא יופיע ב‑φ\varphi?

פתרון. נניח שהאלגוריתם "חוסך" ובוחר z:=az:=a שכבר מופיע בנוסחה. קחו φ=(a∨b∨c∨d)∧(aˉ)∧(bˉ)∧(c).\varphi = (a\vee b\vee c\vee d)\wedge(\bar a)\wedge(\bar b)\wedge (c). φ\varphi ספיקה: a=0, b=0, c=1a=0,\ b=0,\ c=1, ו‑dd כרצוננו — הפסוקית הארוכה מסופקת בזכות cc. אבל הפיצול עם z=az=a ו‑ℓ1=a, ℓ2=b\ell_1=a,\ \ell_2=b נותן C′=a∨b∨a≡a∨bC'=a\vee b\vee a \equiv a\vee b, ולכן φ^=(a∨b)∧(c∨d∨aˉ)∧(aˉ)∧(bˉ)∧(c),\hat\varphi=(a\vee b)\wedge(c\vee d\vee \bar a)\wedge(\bar a)\wedge(\bar b)\wedge(c), שאינה ספיקה: (aˉ)∧(bˉ)(\bar a)\wedge(\bar b) מכריחות a=b=0a=b=0 וסותרות את (a∨b)(a\vee b).

הכשל המדויק בהוכחה: בשלב שבו כתבנו "zz אינו מופיע ב‑DD, ולכן v^\hat v ו‑vv מסכימות על משתני DD" — אם zz ישן, ההנחה הזו קורסת, ושינוי ערכו כדי לספק את C′C' יכול להפיל פסוקית אחרת.

תרגיל 3: כוח הביטוי של נוסחאות CNF (עמודים 7–8 בסיכום)

החלק הזה נראה כמו סטייה מהנושא, אבל הוא בדיוק ההכנה למשפט קוק–לוין: שם נצטרך לקודד ריצה של מכונת טיורינג כנוסחת CNF, וכל הטריקים כאן יחזרו. המרצה בשיעור 9 חוזר לזה שוב ושוב: "תזכרו שיהיה לכם בראש כל הזמן את בעיית 8 מלכות" [00:09:27, תמלול 15], ו"בעיית המלכות זה היה כמו משפט קוק בקטן" [00:20:03].

(א) בחירת קבוצה לא ריקה. x1∨x2∨⋯∨x10x_1\vee x_2 \vee \dots\vee x_{10} מבטאת בחירה של תת‑קבוצה לא ריקה מתוך {1,…,10}\{1,\dots,10\}: מזהים תת‑קבוצה AA עם ההשמה xi=1  ⟺  i∈Ax_i=1 \iff i\in A. השמה מספקת את הנוסחה אם ורק אם היא נותנת ערך 11 לפחות למשתנה אחד, כלומר A≠∅A\ne\emptyset.

(ב) לא ריקה וגם לא מלאה. (x1∨x2∨⋯∨x10)∧(xˉ1∨xˉ2∨⋯∨xˉ10)(x_1\vee x_2\vee\dots\vee x_{10}) \wedge (\bar x_1\vee\bar x_2\vee\dots\vee \bar x_{10}) הפסוקית השנייה דורשת שלפחות משתנה אחד יקבל 00, כלומר A≠{1,…,10}A \ne \{1,\dots,10\}. בסך הכול ההשמות המספקות הן בדיוק אלה המתאימות ל‑∅⊊A⊊{1,2,…,10}\emptyset \subsetneq A\subsetneq \{1,2,\dots,10\}.

(ג) בדיוק אחד. (x1∨x2∨x3)∧(xˉ1∨xˉ2)∧(xˉ1∨xˉ3)∧(xˉ2∨xˉ3)(x_1\vee x_2\vee x_3)\wedge(\bar x_1\vee\bar x_2)\wedge(\bar x_1\vee\bar x_3)\wedge(\bar x_2\vee\bar x_3) הפסוקית הראשונה אומרת "לפחות אחד". כל פסוקית (xˉi∨xˉj)(\bar x_i\vee\bar x_j) שקולה ל‑¬(xi∧xj)\neg(x_i\wedge x_j), כלומר "לא שניהם" — ויחד הן אומרות "לכל היותר אחד". לכן השמה מספקת את הנוסחה אם ורק אם היא נותנת 11 לבדיוק אחד מ‑x1,x2,x3x_1,x_2,x_3. זהו הגאדג'ט המרכזי בכל השיעור הבא — "בתא הזה של הטבלה כתוב בדיוק סמל אחד".

(ד) 8 מלכות. לכל 1≤i,j≤81\le i,j\le 8 נגדיר משתנה בוליאני xi,jx_{i,j}, שהמשמעות המיועדת לו היא "יש מלכה במשבצת (i,j)(i,j)".

בדיוק מלכה אחת בכל שורה: B=⋀i=18[(⋁j=18xi,j)∧⋀j≠k(xˉi,j∨xˉi,k)]B=\bigwedge_{i=1}^{8}\left[\left(\bigvee_{j=1}^{8}x_{i,j}\right)\wedge \bigwedge_{j\ne k}\left(\bar x_{i,j}\vee\bar x_{i,k}\right)\right] בדיוק מלכה אחת בכל עמודה: C=⋀j=18[(⋁i=18xi,j)∧⋀i≠k(xˉi,j∨xˉk,j)]C=\bigwedge_{j=1}^{8}\left[\left(\bigvee_{i=1}^{8}x_{i,j}\right)\wedge \bigwedge_{i\ne k}\left(\bar x_{i,j}\vee\bar x_{k,j}\right)\right] לכל היותר מלכה אחת בכל אלכסון: D=⋀(i,j)≠(i′,j′)∣i−i′∣=∣j−j′∣(xˉi,j∨xˉi′,j′)D=\bigwedge_{\substack{(i,j)\ne(i',j')\\ |i-i'|=|j-j'|}}\left(\bar x_{i,j}\vee\bar x_{i',j'}\right) והנוסחה כולה: φ=B∧C∧D\varphi = B\wedge C\wedge D. זו נוסחת CNF (חיתוך של נוסחאות CNF הוא CNF), והשמה מספקת אותה אם ורק אם היא מתארת מיקום חוקי של 8 מלכות על הלוח.

מה הפואנטה? לא פתרנו את בעיית 8 המלכות — קידדנו אותה. בהינתן פותר ל‑SAT היינו מקבלים גם פותר ל‑8 מלכות; וברמה הכללית, הבעיה של nn מלכות מצטמצמת ל‑SAT בזמן פולינומי, כי מספר המשתנים הוא n2n^2 ומספר הפסוקיות O(n4)O(n^4), וכולן ניתנות לכתיבה ישירה מ‑nn. אגב, כל הפסוקיות ב‑B,C,DB,C,D שאינן ה"או" הגדול הן באורך 2 — כלומר הנוסחה כמעט 3CNF ממילא; רק ה"או" על שורה שלמה (88 ליטרלים) דורש את הפיצול של משפט 6.

תרגיל 4: כמה גדל הפלט על פסוקית באורך 10?

התרגיל. נתונה פסוקית יחידה C=ℓ1∨⋯∨ℓ10C=\ell_1\vee\dots\vee\ell_{10}. כמה איטרציות יבצע האלגוריתם, כמה משתנים חדשים יוסיף, ומה תהיה הנוסחה?

פתרון. מספר האיטרציות הוא 10−3=710-3=7, וכך גם מספר משתני העזר z1,…,z7z_1,\dots,z_7. נעקוב:

  • איטרציה 1: (ℓ1∨ℓ2∨z1)∧(ℓ3∨⋯∨ℓ10∨zˉ1)(\ell_1\vee\ell_2\vee z_1)\wedge(\ell_3\vee\dots\vee\ell_{10}\vee\bar z_1) — הפסוקית השנייה באורך 9.
  • איטרציה 2 מפצלת אותה לפי שני הליטרלים הראשונים שבה, ℓ3,ℓ4\ell_3,\ell_4: (ℓ3∨ℓ4∨z2)∧(ℓ5∨⋯∨ℓ10∨zˉ1∨zˉ2)(\ell_3\vee\ell_4\vee z_2)\wedge(\ell_5\vee\dots\vee\ell_{10}\vee\bar z_1\vee\bar z_2) — הזנב באורך 8.
  • כל איטרציה נוספת מוציאה עוד שני ליטרלים מקוריים לפסוקית באורך 3, ומוסיפה עוד zˉ\bar z לזנב.

בסוף מתקבלות 88 פסוקיות ובהן 10+2⋅7=2410+2\cdot 7=24 מופעי ליטרלים — בדיוק כמו שהניתוח חוזה (L+2⋅L+2\cdot מספר האיטרציות). שימו לב לאופי המבנה: הליטרלים המקוריים יוצאים שניים‑שניים, ושרשרת ה‑zˉ\bar z מצטברת בפסוקית הזנב עד שגם היא מתקצרת. זו התנהגות האלגוריתם של הסיכום; בנייה חלופית מקובלת בספרות שומרת משתנה עזר אחד בלבד בכל פסוקית ומייצרת k−2k-2 פסוקיות באורך בדיוק 3.


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

קראו את זה קודם: לשיעור הזה אין הקלטה בקורפוס, ולכן אין בו הערות מההרצאה שלו עצמו. ההערות שלהלן נלקחו מהקלטות השיעורים הסמוכים (9 ו‑16 באפריל) ומובאות כאן משום שהן חלות ישירות על החומר של שיעור זה — לא משום שנאמרו בו. הציטוט המדויק והמספור של ההערה מציינים את הקובץ שממנו נלקחה.

  • מספר ההשמות הוא 2n2^n לפי מספר המשתנים, לא לפי מספר הליטרלים [00:19:28, תמלול 14]. סטודנט ענה "שתיים בחזקת כמות הליטרלים" והמרצה תיקן: ברגע שנתת ערך ל‑x1x_1, קבעת גם את xˉ1\bar x_1. טעות קטנה אבל היא משנה את החסם.

  • רדוקציה אינה פתרון [01:11:50, 01:13:27, תמלול 14]. סטודנט הציע "לנסות לפתור את זה באמצעות CLIQUE", והמרצה עצר: "אני לא מנסה לפתור — כל הרדוקציה זה רק ההמרה מפה לפה". זה תקף במלואו כאן: אלגוריתם 1 לא בודק ספיקות של שום דבר, הוא רק כותב מחדש את הנוסחה.

  • שני שלבים נפרדים בבניית רדוקציה [01:25:21]–[01:26:25, תמלול 14]. "כשאני מגדיר את המכונה אני לא יודע אם הקלט שייך לקבוצה. אם הייתי רוצה לדעת את זה, הייתי צריך מספר צעדים אקספוננציאלי. רק בשלב ההוכחה אני מניח שהקלט שייך ומראה שהפלט שייך." בשיעור הזה זה בולט: אלגוריתם 1 רץ בלי לדעת דבר על ספיקות, ורק משפט 5 מניח ספיקות ובונה השמה.

  • תמיד לכתוב את שתי הגרירות בנפרד, גם כשהן נראות סימטריות [01:22:33], [01:27:34, תמלול 14]. בשיעור הזה הן אינן סימטריות: בכיוון "φ⇒φ^\varphi\Rightarrow\hat\varphi" אנחנו בוחרים את הערך של zz, ובכיוון ההפוך הוא נתון לנו ואנחנו מסיקים ממנו. זה בדיוק המקום שבו סטודנטים מוותרים על החצי הקשה.

  • על התקינות של הקלט [00:17:52, תמלול 14]. המרצה בחר במפורש לא לעסוק בקידוד: "ההנחה היא שהקלט מתקבל בצורה תקינה; אפשר לבדוק תקינות ולדחות". במבחן זו הערת שוליים לגיטימית, אבל ברדוקציה חייבים להגדיר גם מה עושים על קלט פסול — אחרת הפונקציה אינה מוגדרת על כל Σ∗\Sigma^*.

  • מדוע 3SAT ולא SAT בהמשך [01:20:52, תמלול 15]. המרצה מספר על המאמר של Karp עם 21 בעיות NP‑שלמות, ובראשן השרשרת SAT→3SAT→IS→CLIQUE\mathrm{SAT}\to\mathrm{3SAT}\to\mathrm{IS}\to\mathrm{CLIQUE}. הרדוקציה של השיעור הזה היא החוליה הראשונה בשרשרת ההיסטורית הזו.


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

הפער המרכזי, לפני כל השאר: לשיעור הזה אין הקלטה. נבדק כל קורפוס ההקלטות של הקורס, ולא נמצא בו ולו קטע אחד שבו נלמדת הבנייה SAT≤p3SAT\mathrm{SAT}\le_p\mathrm{3SAT}. תמלול 14 מסתיים בחומר של שיעור 7 (CLIQUE, IS), תמלול 15 הוא כבר שיעור קוק–לוין ומזכיר את הרדוקציה רק בדיעבד, ותמלול 16 ממשיך לכיסוי קודקודים ולצביעה. הסימנים מצביעים על כך שהחומר ניתן ללימוד עצמי / כשיעורי בית, וזה מתיישב עם כך שגיא סופר כתב עליו סיכום בן 8 עמודים. המשמעות המעשית לקורא: כל מה שבקובץ הזה נשען על הסיכום הכתוב ועל השלמה מתמטית סטנדרטית שלי — ולא על הרצאה. הסיכום עצמו קריא לחלוטין ושלם מתמטית, ולכן confidence: medium ולא low; אך אין מקור שני להצלבה, ו‑coverage של שני התמלולים סומנה none.

מה מהסיכום ומה השלמה שלי. מהסיכום: כל ההגדרות (עמוד 4), אלגוריתם 1 על ארבעת שלביו והדוגמה שלו (עמוד 4), ניסוח משפט 5 והוכחתו על ארבעת המקרים (עמודים 5–6), אלגוריתם הלולאה וניתוח הזמן (עמוד 7), דוגמאות כוח הביטוי ובעיית 8 המלכות (עמודים 7–8), וכן משפטים 1–3 (עמודים 1–3). השלמה שלי, מסומנת בגוף הקובץ בהערות: פירוט מקרה B.2, טיעון העצירה של הלולאה, האינדוקציה על שרשרת האיטרציות, ספירת מופעי הליטרלים המדויקת, תנאי הרעננות בכל איטרציה, הטיפול בקלט לא תקין, הניסוחים "מדוע לא בנייה נאיבית", דוגמה 2, תרגילים 1–2, ומשפט 7.

  • מקור: הסיכום, עמוד 5. הפער: בכיוון "φ\varphi ספיקה ⇒\Rightarrow φ^\hat\varphi ספיקה", המקרה v(ℓ1)=1v(\ell_1)=1 או v(ℓ2)=1v(\ell_2)=1 נכתב במילים "באופן דומה". ההכרעה: נכתב כאן במלואו (מקרה B.2), כולל הנימוק לכל אחת משלוש קבוצות הפסוקיות.

  • מקור: הסיכום, עמוד 7. הפער: נכתב שאורך הפלט אינו עולה על 2∣φ∣2|\varphi|. ספירה מדויקת של מופעי ליטרלים נותנת 3∣φ∣3|\varphi| (הקלט, ועוד 2 לכל אחת מעד ∣φ∣|\varphi| איטרציות). ההכרעה: נכתב החסם המדויק 3L3L, עם ציון שהאסימפטוטיקה O(∣φ∣2)O(|\varphi|^2) אינה משתנה; נוספה הערה שברמת הביטים יש עוד גורם log⁡\log בשל אינדקסי המשתנים החדשים.

  • מקור: הסיכום, עמוד 8. הפער: הנוסחה CC (אילוץ העמודות בבעיית 8 המלכות) כתובה כמעט זהה ל‑BB (אילוץ השורות) — נראה שהאינדקסים ii ו‑jj לא הוחלפו. ההכרעה: נכתבה כאן הגרסה המתוקנת שבה CC סורקת עמודות; זו הכוונה הברורה מההקשר ("לבסוף נגדיר DD עבור האלכסונים").

  • מקור: הסיכום, עמודים 5–6. הפער: מספור המקרים אינו עקבי — בכיוון הראשון מופיעים "מקרה 1.1"/"מקרה 1.2" ובכיוון השני שוב "מקרה 1"/"מקרה 2" למשמעות אחרת לגמרי (הערך של v^(z)\hat v(z)). ההכרעה: מוספרו כאן מחדש כ‑B.1–B.4 עם תיאור מפורש של מה מפרידים בכל מקרה.

  • מקור: הסיכום, עמודים 1–3. הפער: שליש מהעמודים מוקדשים לחומר שהוא ברובו חזרה — NP⊆PSPACE\mathrm{NP}\subseteq\mathrm{PSPACE}, סגירות P\mathrm{P} תחת רדוקציות, והגדרות NP‑קשה/NP‑שלמה — שחלקו שייך תוכנית ללימוד לשיעורים 6–7. ההכרעה: נכלל כאן במלואו כי הוא מופיע ב‑PDF של שיעור זה ומשמש ישירות במסקנה על 3SAT; ייתכן שיש חפיפה עם קובצי שיעורים 6–7 ועל הרכז לבדוק זאת.

  • מקור: הסיכום, עמוד 4. הפער: ההצדקה לרדוקציה 3SAT≤pSAT\mathrm{3SAT}\le_p\mathrm{SAT} כתובה בקיצור רב ("הרדוקציה מחזירה את אותה נוסחה"), ולא נאמר מה עושים עם קלט שאינו 3CNF. ההכרעה: נכתבה הצדקה מלאה, כולל הטיפול בקלט לא תקין.

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

  • מקור: כל המקורות. הפער: לא נדונו פסוקיות באורך 1 ו‑2 (הן חוקיות לפי הגדרת הקורס), ולא הווריאנט "בדיוק 3 ליטרלים". ההכרעה: נוסף משפט 7 כהשלמה, עם סימון מפורש שהוא אינו מהמקורות.


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

מה חייבים לזכור בעל פה.

  1. הבנייה: פסוקית C=ℓ1∨⋯∨ℓkC=\ell_1\vee\dots\vee\ell_k עם k>3k>3 מוחלפת ב‑(ℓ1∨ℓ2∨z)∧(ℓ3∨⋯∨ℓk∨zˉ)(\ell_1\vee\ell_2\vee z)\wedge(\ell_3\vee\dots\vee\ell_k\vee\bar z), כאשר zz חדש; חוזרים עד שכל הפסוקיות באורך ≤3\le 3.
  2. החשבון: מספר האיטרציות ∑∣C∣>3(∣C∣−3)=O(∣φ∣)\sum_{|C|>3}(|C|-3)=O(|\varphi|); כל איטרציה מוסיפה 2 מופעי ליטרלים ומשתנה אחד; אורך הפלט O(∣φ∣)O(|\varphi|); זמן ריצה O(∣φ∣2)O(|\varphi|^2).
  3. המסקנה: 3SAT∈NP\mathrm{3SAT}\in\mathrm{NP} (רדוקציית זהות ל‑SAT) ++ SAT≤p3SAT\mathrm{SAT}\le_p\mathrm{3SAT} ++ קוק–לוין ⇒\Rightarrow 3SAT NP‑שלמה.
  4. NP⊆PSPACE\mathrm{NP}\subseteq\mathrm{PSPACE}; P\mathrm{P} (וכן NP,PSPACE,EXP\mathrm{NP},\mathrm{PSPACE},\mathrm{EXP}) סגורות תחת ≤p\le_p; אם AA NP‑שלמה אז A∈P  ⟺  P=NPA\in\mathrm{P}\iff\mathrm{P}=\mathrm{NP}.

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

  • לכתוב "C≡C′∧C′′C\equiv C'\wedge C''". לא נכון. השקילות היא בספיקות בלבד, ורק אחרי כימות קיומי על zz. ראו דוגמה 2.
  • לוותר על הכיוון ההפוך. רוב הנקודות בשאלת רדוקציה יושבות בכיוון "הפלט ספיק ⇒\Rightarrow הקלט ספיק", כי שם צריך להראות שמשתני העזר לא מרמים. הטיעון הוא תמיד: v^(z)\hat v(z) הוא 00 או 11; כל אחד מהם "מנטרל" את משתנה העזר באחת משתי הפסוקיות ומאלץ ליטרל מקורי לספק אותה.
  • לשכוח את הרעננות. משתנה עזר חדש לכל פיצול. תרגיל 1 מראה נוסחה ספיקה שהופכת לבלתי‑ספיקה אם חוסכים משתנה.
  • להפוך את כיוון ה‑≤p\le_p. SAT≤p3SAT\mathrm{SAT}\le_p\mathrm{3SAT} מוכיח ש‑3SAT קשה, לא ש‑SAT קלה. הכיוון ההפוך (3SAT≤pSAT\mathrm{3SAT}\le_p\mathrm{SAT}) הוא הטריוויאלי ומוכיח רק ש‑3SAT ב‑NP.
  • לשכוח לחסום את אורך הפלט. בכל ניתוח סיבוכיות של רדוקציה או הרכבת רדוקציות צריך ∣f(x)∣≤P(∣x∣)+∣x∣|f(x)|\le P(|x|)+|x|; בלעדיו ההרכבה של הפולינומים אינה מוצדקת.
  • להתעלם מקלט לא תקין. הרדוקציה היא פונקציה על כל Σ∗\Sigma^*; יש להגדיר פלט קבוע ובלתי‑ספיק לקלט פסול.

צ'ק‑ליסט — אחרי השיעור אני יודע:

  • להגדיר CNF, 3CNF, השמה, ספיקות, SAT, 3SAT, NP‑קשה, NP‑שלמה.
  • לתאר את אלגוריתם הפיצול ולהריץ אותו על נוסחה קונקרטית עד לפלט 3CNF.
  • להוכיח את שני כיווני הנכונות של צעד הפיצול, בפירוט מקרים מלא.
  • לנתח את זמן הריצה ואת גודל הפלט של הרדוקציה ולהסביר מדוע הוא פולינומי.
  • להסביר מדוע נדרש משתנה חדש ולתת דוגמה נגדית לגרסה שחוסכת.
  • להוכיח NP⊆PSPACE\mathrm{NP}\subseteq\mathrm{PSPACE} וסגירות תחת ≤p\le_p, ולנסח את משמעות NP‑שלמות.
  • לקודד אילוצים פשוטים ("לפחות אחד", "לכל היותר אחד", "בדיוק אחד") כנוסחת CNF — הכנה ישירה למשפט קוק–לוין.

Questions left open

  • לא קיימת בקורפוס הקלטה של השיעור הזה: נבדקו כל 30 הקבצים, ואף אחד מהם אינו מכיל את הבנייה SAT ≤p 3SAT; ככל הנראה החומר ניתן ללימוד עצמי.
  • כל ליבת השיעור — הבנייה, ההוכחה הדו‑כיוונית וניתוח הגודל — נשענת על הסיכום הכתוב בלבד, ללא מקור שני להצלבה.
  • עמוד 8 בסיכום: הנוסחה C (אילוץ העמודות בבעיית 8 המלכות) נכתבה כמעט זהה ל‑B; כאן נכתבה הגרסה המתוקנת שבה תפקידי i ו‑j מוחלפים.
  • עמוד 7 בסיכום: החסם |φ̂| ≤ 2|φ| — ספירת מופעי ליטרלים מדויקת נותנת 3|φ|; האסימפטוטיקה זהה ולכן O(|φ|²) נשמר.
  • עמודים 5–6 בסיכום: המקרה השני בכיוון 'φ ספיקה ⟸ φ̂ ספיקה' נכתב כ'באופן דומה'; הפירוט כאן הוא השלמה שלי.
  • בסיכום 3CNF מוגדרת כ'לכל היותר 3 ליטרלים בכל פסוקית'; הווריאנט 'בדיוק 3' טופל כאן בנפרד ואינו מופיע במקור.