Halting Problem
ปัญหา Halting Problem เนี่ย เป็นปัญหาสุดคลาสสิกอันนึงสำหรับคนที่เรียนคอมพิวเตอร์ โจทย์มีอยู่ว่า
เราจะสร้างโปรแกรม (หรือคำสั่ง) ชื่อว่า H ที่รับ input 2 ตัว คือH(X, Y) ทำงานเสร็จในเวลาจำกัด แปลว่า H(H, (X, Y)) ให้คำตอบเป็น "หยุด" เสมอน่ะนะและมี output เป็น
- X = โปรแกรม (คือ source code หรือ object code หรือ อะไรก็ได้)
- Y = input (ทั้งหมด) ของโปรแกรม X
โดยที่ H(X, Y) ทำงานเสร็จในเวลาจำกัด (นับเป็นจำนวนคำสั่งก็ได้) ได้รึเปล่า?
- "หยุด" ถ้า X(Y) หยุดการทำงานในเวลาจำกัด
- "ไม่หยุด" ถ้า X(Y) ไม่หยุดการทำงาน (ก็คือ ติด loop หนะ)
คำตอบของปัญหานี้ ก็มีคนตอบได้มานานแล้วหละ แต่วิธีการหาคำตอบเนี่ย น่าสนใจ ... เค้าใช้วิธีพิสูจน์แบบขัดแย้ง แบบนี้...
สมมติว่า H(X, Y) มีอยู่จริง เราจะสร้างโปรแกรม L(X) แบบนี้ได้
L(X)
- If H(X, X) = "หยุด", then loop forever.
- Else (if H(X, X) = "ไม่หยุด"), do nothing.
คราวนี้ เราก็ลองคิดดูว่า H(L, L) มันจะเป็นอะไร ...
ถ้า H(L, L) = "หยุด"
- ตามนิยามของ H: L(L) ต้องหยุด
- ตามนิยามของ L: แปลว่ามันไปตกที่ "Else, ..." ดังนั้น H(L, L) = "ไม่หยุด"
- ตามนิยามของ H: L(L) ต้องไม่หยุด
- ตามนิยามของ L: แปลว่ามันไปตกที่ "If ..., then ..." ดังนั้น H(L, L) = "หยุด"
ความพยายามสร้าง H(X, Y) ที่ใกล้เคียงที่สุด ก็คือ
- H(X, Y) ตอบว่า "หยุด" ในเวลาจำกัด ถ้า X(Y) หยุดการทำงานในเวลาจำกัด
- H(X, Y) ไม่สามารถตอบอะไรได้ และไม่หยุดการทำงาน ถ้า X(Y) ไม่หยุดการทำงาน
โยงกลับไปที่ภาษาอันดับหนึ่งนิดนึง เคยพูดไว้ในตอนท้ายเรื่อง ตรรกศาสตร์: Unification แล้วว่า
"จะว่าไป มันก็เทียบได้กับ halting problem น่ะแหละ (เทียบได้จริง ๆ นะ เหมือนกัันเด๊ะเลย)"
ก็เลยเอามาเทียบกันให้ดูอีกที ว่าทำไมมันเหมือนกัน ... อันนี้คือ ความเป็นจริงเกี่ยวกับการพิสูจน์ว่า ประพจน์เป็นจริงรึเปล่า เมื่อมีกฎต่าง ๆ ให้
"ถ้าประพจน์ที่ต้องการพิสูจน์เป็นจริง เมื่อได้ประพจน์ว่าง (จาก resolution) เราก็จะรู้ แต่ถ้ามันไม่จริง เราก็อาจจะต้องทำไปเรื่อย ๆ เรื่อย ๆ ... เหมือนกับ ไม่มีทางรู้เลย ว่ามันเป็นจริงรึเปล่า"
ส่วนในกรณีของ H(X, Y) ที่สามารถสร้างได้ ...
"ถ้า X(Y) หยุดการทำงาน เราก็จะได้คำตอบจาก H(X, Y) แต่ถ้า X(Y) ไม่หยุดการทำงาน H(X, Y) ก็จะทำงานไปเรื่อย ๆ ... ไม่มีทางรู้ว่ามันจะหยุดรึเปล่า"
จบละ
5 Comments:
ทำไมมาอ่านอีกทีมันออกจะเข้าใจยากนิดๆ แฮะ สงสัยเราจะโง่กว่าสมัยเรียนซะแล้ว
(หรือแกเขียนไม่ดีวะขวัญ 55)
อ่าวเรอะ ... โทษที :P 555
OK เข้าใจแล้วครับ
ในที่นี้ถ้าเราเปลี่ยนจาก X เป็นประพจน์ทางคณิตศาสตร์ ,Y เป็นตัวแปรในประพจน์ X และ
H(X,Y) ให้ค่าเป็น T ถ้าแทน Y ในประพจน์ X แล้วทำให้ X เป็นจริง
H(X,Y) ให้ค่าเป็น F ถ้าแทน Y ในประพจน์ X แล้วทำให้ X เป็นเท็จ
โดยการให้เหตุผลในทำนองเดียวกัน เราจะได้ว่า H ดังกล่าวไม่มีทางเกิดขึ้นได้ นั่นคือเราไม่มีวิธีการตรวจสอบที่แน่นอนที่จะชี้ชัดลงไปว่า ประพจน์นั้นเป็นจริง หรือ เป็นเท็จ นอกจากจะลองถูกลองผิดโดยหาวิธีการพิสูจน์ หรือ พยายามหาตัวอย่างค้านไปเรื่อยๆ
อ่า ... อันนี้ฟังดูแปลก ๆ นะ ...
ยินดีต้องรับ 2024 !!!
Post a Comment
<< Home