כך ש:
התוכנה U היא תוכנה שמקבלת כקלט זוג מחרוזות P, w, ופועלת כך:
ניתן להוכיח ש ATM קבילה עם U
נשים לב, U היא תוכנה, אין צורך להוכיח שהיא שקולה למכונה כלשהי כי כבר הראנו שכל תוכנה שקולה למכונת טיורינג. השפה המכונה הזו מקבל היא השפה ATM כלומר כל זוג בשפה מגיע למצב מקבל. לעומת זאת כל זוג שאינו בשפה יכול לגרום ל U לא לעצור. זה תלוי בתוכנה עצמה שהיא חלק מהזוג הסדור
נניח בשלילה ש ATM כריעה, נסמן D-ATM התוכנית שמכריעה את השפה. נרשום את התוכנית
stupid(z) {
return(!D-ATM(z,z))
}
כעת נחלק למקרים עבור הקריאה ל stupid(stupid) :
1)
מסקנה מצאנו שפה שלא ניתנת להכרעה בעזרת מחשב....
נניח בשלילה ש
במילים, השפה halt הינה שפה של זוגות , תוכנית ומחרוזת כך שהפעלת התוכנית על המחרוזת , עוצרת. (חץ למטה מסמל עצירה חץ למעלה מסמל אי עצירה).
HALT אינה כריעה
נניח בשלילה שהיא כן , אז קיימת תוכנית D-HALT המכריעה אותה
D-HALT(Q,y){...}
D-ATM(P,w) {
if (D-HALT(P,w)==0) {
return 0;
}
return (U(P,w));
}
בעצם הצלחנו עכשיו להכריע את השפה ATM כי קיבלנו את הידע של ״האם התוכנית עוצרת או לא״
אם התוכנית לא עוצרת אז אנחנו יודעים להכריע את המצב הזה כעת ולהחזיר 0 כאילו D-ATM דוחה מצבים כאלה, אחרת התוכנית עוצרת בוודאות ונוכל להריץ את מכונת הטיורינג האוניברסלית ולקבל תשובה. בסתירה לכך שהפה ATM כריעה.
HALT קבילה
A-HALT(Q,y) {
U(Q,y)
return (1);
}
קל להבין למה התוכנית מקבלת את השפה . אם U עוצרת נחזיר 1 אחרת היא לעולם לא תעצור או תחזיר 0, אין לנו איך לדעת .
כלומר שהשפה של P ריקה. המשמעות היא שלכל קלט התוכנית לא תחזיר 1 , או שהיא תחזיר 0 או שלא תעצור בכלל .
E לא כריעה
נב״ש שקיימת תוכנית שמכריע את E. D-E(Q).
_
D-ATM(P,w) {
Q= "Q(x){
return U(P,w)
}"
return D-E(Q)
}
באופן הזה יתקיים
כלומר
זה בעצם המטרה שלנו, לקחת תוכנית לא כריעה אחרת ולהצליח להכריע אותה על ידי שפה שהנחנו שהיא כריעה. אנחנו נרצה להעזר בקופסה השחורה הזאת של D-E או של כל בחירה אחרת, כדי להצליח להכריע את הקלט של השפה האחרת במקרה זה D-ATM משלים. מה שאנחנו עושים בעצם זה רידוקצייה (אפרט בהמשך) על הקלט הראשון, ממירים אותו לקלט של התוכנית השנייה באופן כזה שיעזור לנו להכריע את התוכנית הראשונה.
E לא קבילה
נוכיח ש
A-EC(Q) {
guess(w)
return U(Q,w)
}
EC זה E משלים (סימון נוסף)
מנחשים מחרוזת ומריצים את המחרוזת על תוכנית הקלט. יכול להיות שהיא תקבל ויכול להיות שהיא תדחה , וגם יכול להיות שהיא לא תעצור. לכן מדובר בקבלה.
EQ אינה קבילה
A-E(P) {
Q1=P
Q2= "Q(x){return(0)}"
return A-EQ(Q1,Q2)
}
כעת יתקיים
ולכן
כלומר הראנו ש A-EQ מחזירה בידיוק מה שצריך כדי לקבל את A-E . כלומר הצלחנו לבנות תוכנית המקבלת את E בסתירה לכך שהיא קבילה
אם היא לא קבילה אז היא בהכרח גם לא כריעה.
האפשרות של שפת המשלים היא אם כן , שהיא תהיה קבילה בלבד. לא ייתכן שהיא תהיה כריעה. לא אוכיח זאת פה אבל זאת שפה שאינה כריעה.ֿ
תכלס, זה מה שעשינו עד עכשיו. אבל נסביר מה זה רדוקצייה באופן מפורש. מטרת הרידוקצייה היא לפתור בעיה אחת באמצעות בעייה אחרת. באופן פורמלי יותר.
רידוקצייה היא בעצם פונקציית המרה.
בהינתן
סימון : אם קיימת רידוקציית התאמה חישובית מ
טענה : תהיינה שתי שפות
אזי
הוכחה
D-L1(x) {
return D-L2(R(x))
}
בהינתן קלט מ
אנחנו עשינו זאת בדרך השלילה... כלומר
הוכחה תהי
R(w){
if D-A(w)==1 {
return "Q(A){return 1}, abba"
}
return "Q(A){return 0}, abba"
}
קל לראות שזאת רידוקצייה חישובית, והיא תמיד עוצרת. כמו כן הפלט תמיד יהיה שייך ל ATM אם הקלט שייך ל A.
נשים לב, קיימת רידוקצייה חישובית משפה כריעה לכל שפה פרט לשפה הריקה ו
כל התוכניות שהשפה שמקבלת אותן אינה רגולרית.
נוכיח שזאת שפה שאינה כריעה
נוכיח שיש רידוקציית התאמה חישובית בין לשפה לא כריעה ל not-reg נבחר את HALT.
יתקיים
כעת נרצה ליצור פונקצייה
כלומר
R(P,w) {
"Q(x) {
U(P,w)
return Palindrom(x)
}"
}
נשים לב ש R לא מחשבת את Q היא רק מייצרת אותו
מה עשינו כאן בעצם? יצרנו פונקצייה שבשלב הראשון מריצה את המכונה האוניברסלית על התוכנית עם המחרוזת. אם היא לא עוצרת אז השפה המקבלת את Q היא השפה הריקה שהיא רגולרית. אחרת זאת שפת הפלינדרום שהיא לא רגולרית.
כנדרש .
נוכיח שזאת שפה שאינה קבילה
כעת לפי המתכון צריך לבצע רידקוצייה משפה אחרת שאינה כבילה. נבנה רידוקצייה מ
הרידוקצייה תקבל זוג סדור של תוכנית ומחרוזת , ותבנה מחרוזת אחרת שמייצגת תוכנית שתקיים שהזוג יהיה שייך ל ATM משלים אם ורק אם התוכנית שהרידוקצייה תחזיר תיהיה שייכת ל NOT-REG.
נוכל לבנות את הקוד הבא
R(P,w) {
"Q(x) {
if Palindrom(x) {return 1}
return U(P,w)
}"
}
כאן קודם בדקנו אם הקלט הוא פלינדרום כי אם כן אז המחרוזת שייכת לשפה שאינה רגולרית. מה שיקרה כאן בעצם זה שאם P(w) שווה ל1 אז הקלט לא משנה, בין אם הוא פלינדרום ובין אם לא לכן השפה תהיה כל המחרוזות. אחרת השפה תהיה שפת הפולינדרום. כלומר רק אם P(w) נדחה או לא עוצר, נקבל שהשפה של Q היא שפת הפלינדרום כדרוש כי זאת שפה שאינה רגולרית.