รถควรทำยังไง เมื่อกฎจราจรมีบั๊ก
ที่จริงผมเขียนบทความนี้ตั้งแต่ช่วงเหตุการณ์รถไฟชนรถเมล์ที่มักกะสัน แต่ตั้งใจจะเอามาลงช้าหน่อยเพราะอยากให้สามารถคุยได้โดยไม่มีอารมณ์เข้ามาปะปนมากนัก
ท่ามกลางประเด็นที่ถูกแตกออกมามากมาย หนึ่งในประเด็นที่ผมสนใจในตอนนั้นคือเรื่องของกฎจราจรที่ “บั๊ก” ซึ่งถูกเปิดประเด็นโดยผู้ใช้เฟสบุ๊กท่านหนึ่ง และต่อมาก็ได้ถูกเอาไปขยายความต่อในรายการเรื่องเล่าเช้านี้

คือแม้หลายคนจะเห็นตรงกันว่ารถเมล์ไม่ควรจอดคร่อมอยู่บนรางรถไฟ หรืออยู่ในเขตห้ามหยุด เพราะถ้ามองตามกฎจราจรอย่างตรงไปตรงมา การเข้าไปค้างอยู่ในพื้นที่แบบนั้นคือความเสี่ยงที่ไม่ควรเกิดขึ้นตั้งแต่แรก
แต่ด้วยความที่รถเมล์นั้นไม่ใช่รถเล็ก มันยาว ต้องการพื้นที่ข้างหน้ามากพอให้ทั้งคันพ้นราง ถ้าข้างหน้ามีรถจากอีกทางพยายามแทรกออกมาตลอด การทำตามกฎแบบสมบูรณ์อาจแปลว่า รถเมล์ต้องรอจนกว่าจะมีช่องว่างยาวพอให้ทั้งคันข้ามไปได้โดยไม่เสี่ยงติดค้างบนราง คำถามคือ จังหวะแบบนั้นเกิดขึ้นจริงบ่อยแค่ไหน หรือต้องรอนานแค่ไหน ซึ่งอาจเป็น “บั๊ก” ของกฎจราจร
สำหรับเราที่เป็นมนุษย์ เมื่อเจอสถานการณ์ที่กฎจราจรนั้นขัดแย้งกันเอง หรือปฏิบัติตามไม่ได้จริง เราก็อาจจะตัดสินใจเลือกทำบางอย่าง เช่นฝ่าฝืนกฎบางข้อที่เราเห็นว่าสำคัญน้อยกว่า ซึ่งมีความเป็นอัตวิสัยอยู่สูง เพราะแต่ละคนก็จะประเมินความเสี่ยง ประเมินระยะ และประเมินพฤติกรรมรถรอบข้างต่างกันออกไปตามกรอบประสบการณ์
แต่ถ้าเป็นรถอัตโนมัติล่ะ
รถอัตโนมัติเป็นระบบที่ต้องถูกออกแบบล่วงหน้า ถ้ามันเจอสถานการณ์ที่กฎหลายข้อดึงมันไปคนละทาง ผู้ที่ออกแบบระบบจะต้องบอกมันให้ชัดว่าอะไรคือพฤติกรรมที่ยอมรับได้ อะไรคือพฤติกรรมที่ห้ามทำ และถ้าทำตามทุกกฎพร้อมกันไม่ได้ กฎข้อไหนต้องมาก่อน
นี่คือเหตุผลที่นักวิจัยด้านรถไร้คนขับต้องพยายามแปลงกฎจราจรจากภาษาคนให้กลายเป็นประโยคทางตรรกศาสตร์ที่คอมพิวเตอร์สามารถประมวลผลได้
กฎภาษาคนอย่างคำว่า “ห้ามจอดคร่อมราง” หรือ “ต้องหยุดเมื่อไฟแดง” นั้นอาจจะฟังดูเข้าใจง่ายสำหรับมนุษย์ แต่ประโยคพวกนี้คลุมเครือมากสำหรับคอมพิวเตอร์ คำว่าจอดนี่คืออะไร ความเร็วต้องเป็นศูนย์เลยไหม ต้องเป็นศูนย์นานแค่ไหนถึงจะเรียกว่าจอด แล้วจอดนี่เหมือนกันหยุดไหม หรือคำว่า “คร่อมราง” นี่คืออะไร วัดจากส่วนไหนของรถ คำว่า “พื้นที่พอ” ต้องพอสำหรับทั้งคันหรือพอแค่หัวรถ และต้องเผื่อระยะปลอดภัยเท่าไหร่
เห็นไหมฮะ ว่ามีความกำกวมเต็มไปหมด ดังนั้นถ้าเราจะออกแบบให้รถอัตโนมัติขับตามกฎหมาย เราต้องสามารถแปลงกฎหมายภาษาคนเหล่านี้ให้เป็นภาษาตรรกศาสตร์ ที่คอมพิวเตอร์สามารถตรวจสอบและตัดสินใจได้
คล้าย ๆ กับตอนที่เราเรียนตรรกศาสตร์ตอนมัธยม ที่ต้องเปลี่ยนประโยคภาษาปากให้อยู่ในรูปของประพจน์ และตัวดำเนินการของประพจน์ อย่างพวก “และ” “หรือ” “ถ้า...แล้ว...” และ “ไม่”
แต่ปัญหาคือ การขับรถไม่ได้เกิดขึ้นในเวลาแช่แข็งจังหวะเดียว มันเป็นลำดับของเหตุการณ์
รถไม่ได้ “หยุดไฟแดง” ในวินาทีเดียวกับที่เห็นไฟแดง แต่มันต้องเห็นไฟแดง ชะลอ แล้วหยุดก่อนเส้นหยุด รถไม่ได้ “ข้ามราง” ในจุดเดียว แต่มันต้องตัดสินใจก่อนเข้าราง เข้าไปในเขตราง แล้วต้องออกจากเขตรางให้พ้นภายในเวลาที่ปลอดภัย
ซึ่งในตรรกศาสตร์พื้นฐานแบบที่เราเคยเรียนกันมักไม่ได้ถูกออกแบบมาเพื่ออธิบายลำดับเหตุการณ์ตามเวลาโดยตรง จึงมีคนเสนอคอนเซปที่เรียกว่า Temporal Logic หรือตรรกศาสตร์ที่มีเวลา
แรกเริ่มเดิมทีนั้น Temporal Logic ถูกนักคณิตศาสตร์และวิทยาการคอมพิวเตอร์ออกแบบขึ้นมา เพื่อใช้สำหรับอธิบายระบบที่เปลี่ยนสถานะไปตามเวลา เช่น โปรแกรม วงจรดิจิทัล ระบบควบคุม หุ่นยนต์ และภายหลังจึงถูกนำมาใช้กับรถไร้คนขับ เพราะรถก็เป็นระบบที่ต้องตัดสินใจต่อเนื่องตามเวลาเช่นกัน
ใน temporal logic เราไม่ได้มีแค่ “และ” “หรือ” “ไม่” “ถ้า...แล้ว...” แต่มีสัญลักษณ์ที่พูดถึงเวลาด้วย อย่างเช่น
- φ U ψ แปลว่า φ เป็นจริงต่อเนื่องไปจนกว่า ψ จะเป็นจริง
- □φ แปลว่า φ เป็นจริงตลอดเวลา
- ○φ แปลว่า φ เป็นจริงในสถานะถัดไป
- ◇φ แปลว่า φ จะเป็นจริงในอนาคตสักจุดหนึ่ง

เช่นถ้าเราอยากบอกรถว่า ถ้าเจอไฟแดงแล้วรถจะต้องหยุด ในตรรกศาสตร์ปกติเราอาจเขียนประมาณว่า
Red Light → Stop
แต่ประโยคนี้แข็งเกินไป เพราะมันเหมือนบอกว่าทันทีที่เห็นไฟแดง รถต้องอยู่ในสถานะหยุดเลย ทั้งที่ในโลกจริงการหยุดรถต้องใช้เวลา รถต้องเห็นไฟแดง ประเมินระยะ ชะลอ แล้วจึงหยุดก่อนเส้นหยุด ดังนั้นถ้าเขียนแบบ temporal logic อย่างหยาบ ๆ มันจึงควรเป็นประมาณว่า
Red Light → ◇Stop
คือถ้าเจอไฟแดงแล้ว ในอนาคตสักจังหวะหนึ่งรถจะต้องหยุด
แต่แค่นี้ก็ยังหลวมอยู่ เพราะ ◇Stop บอกแค่ว่า “สุดท้ายต้องหยุด” แต่ไม่ได้บอกว่าต้องหยุดเมื่อไร ต้องหยุดก่อนเส้นหยุด หรือห้ามฝ่าไฟแดงไปก่อนแล้วค่อยหยุดทีหลัง ถ้าจะให้รัดกุมขึ้น เราอาจต้องเขียนประมาณว่า
Red Light → (¬Cross Stop Line U Stop Before Stop Line)
คือเมื่อเจอไฟแดง รถต้องไม่ข้ามเส้นหยุด จนกว่าจะหยุดก่อนเส้นหยุดได้จริง

หรือถ้าเราเห็นว่ามีคนเดินลงมาบนถนนในจุดที่ไม่ใช่ทางม้าลาย เพื่อความปลอดภัยเราอาจอยากให้รถหยุด ซึ่งถ้าเขียนง่าย ๆ ก็อาจเป็น
Pedestrian On Road → ◇Stop
แต่ถ้าสั่งแบบนี้ตรง ๆ อยู่ตลอดเวลา ก็อาจกลายเป็นว่ารถต้องหยุดทุกครั้งที่เห็นคนลงมาบนถนน ไม่ว่าสถานการณ์รอบข้างจะเป็นอย่างไร ซึ่งบางกรณีก็อาจทำให้เกิดความเสี่ยงแบบอื่นตามมา เช่นถูกรถหลังชน หรือทำให้การจราจรติดขัดโดยไม่จำเป็น
สมมติว่าเราอยากสั่งให้รถชะลอและคงความระมัดระวังไว้จนกว่าคนเดินถนนจะปลอดภัย คำสั่งที่ใช้อาจกลายเป็น
Pedestrian On Road → (Slow Down U Pedestrian Safe)
ที่แปลว่า ถ้ามีคนเดินถนนอยู่บนถนน รถต้องชะลอต่อไปจนกว่าคนเดินถนนจะอยู่ในสถานะปลอดภัย หรือถ้าต้องการบอกให้รถเริ่มตอบสนองทันทีในจังหวะถัดไป ก็อาจใช้ ○ เข้ามาช่วย เช่น
Pedestrian On Road → ○Slow Down
คือถ้าตรวจพบคนเดินถนนบนถนน ในจังหวะถัดไปรถต้องเริ่มชะลอ ไม่ใช่รอไปเรื่อย ๆ แล้วค่อยตอบสนองเมื่อสายเกินไป
ถ้ากลับมาที่ตัวอย่างทางรถไฟ กฎ “ห้ามจอดคร่อมราง” อาจเขียนหยาบ ๆ ได้ว่า
□(¬Stop On Railway)
ที่แปลว่า ในทุกจังหวะของการขับขี่ รถต้องไม่อยู่ในสถานะหยุดอยู่บนรางรถไฟ
แต่ถ้าเป็นรถอัตโนมัติ แค่นี้อาจยังไม่พอ เพราะรถไม่ควรรอให้ตัวเองเข้าไปค้างบนรางก่อน แล้วค่อยรู้ว่าผิด มันควรประเมินตั้งแต่ก่อนเข้าไปว่า ถ้าเข้าไปแล้วจะออกได้ไหม
ดังนั้นกฎที่เข้มขึ้นอาจไม่ใช่แค่ “ห้ามหยุดบนราง” แต่เป็นกฎก่อนเข้าสู่ราง เช่น
○Enter Railway → Enough Space Ahead
หรือพูดเป็นภาษาคนคือ ถ้าในจังหวะถัดไปรถกำลังจะเข้าสู่เขตราง ข้างหน้าต้องมีพื้นที่พอให้รถทั้งคันผ่านพ้นรางไปได้
และถ้าต้องการบอกว่า เมื่อเข้าสู่เขตรางแล้ว รถต้องไม่ค้างอยู่ในนั้นจนเสี่ยงอันตราย ก็อาจเขียนเป็น
Enter Railway → (¬Stop On Railway U Clear Railway)
คือเมื่อรถเข้าสู่เขตราง รถต้องไม่หยุดอยู่บนราง จนกว่าจะผ่านพ้นเขตรางไปได้
ตรงนี้ทำให้เห็นว่า logic ไม่ได้มีไว้แค่จับผิดย้อนหลังว่า รถทำผิดกฎหรือไม่ แต่มันใช้ถามล่วงหน้าได้ด้วยว่า แผนการขับนี้ควรถูกอนุญาตให้เกิดขึ้นไหม ตั้งแต่ก่อนที่รถจะเคลื่อนเข้าไปอยู่ในสถานการณ์เสี่ยงนั้นจริง ๆ
เริ่มเห็นความวุ่นวายไหมฮะ คือเราที่เป็นมนุษย์นั้นมีสิ่งที่เรียกว่าวิจารณญาณ ซึ่งคือการตัดสินใจสิ่งต่าง ๆ ตามความเหมาะสมอยู่ แต่ลองนึกภาพคอมพิวเตอร์ที่ถูกออกแบบมาให้ปฏิบัติตามกฎอย่างเถรตรงดูสิ ถ้าเราใส่กฎให้มันไม่รัดกุม มันก็อาจตัดสินใจผิดบริบท หรือทำตามกฎแบบเถรตรงจนไม่เหมาะกับสถานการณ์จริง
และทุกอย่างจะยากขึ้นเมื่อเราเอากฎต่าง ๆ มาบังคับใช้พร้อมกัน นึกภาพว่ารถอัตโนมัติอาจมีกฎหลายข้อพร้อมกัน เช่น รถต้องไม่ชนรถต้องอยู่ในเลน รถต้องไม่หยุดอยู่บนรางรถไฟ รถต้องไม่ขับเกินความเร็วที่กำหนด และรถต้องไม่กีดขวางการจราจร
ในสถานการณ์ปกติ กฎเหล่านี้อาจไปด้วยกันได้ แต่ในสถานการณ์บางแบบ มันอาจดึงรถไปคนละทาง เช่นถ้าหยุดก่อนถึงราง รถอาจไม่คร่อมราง แต่จะไปกีดขวางรถด้านหลัง แต่ถ้าขยับเข้าไป รถอาจไม่ขวางทางเดิม แต่เสี่ยงติดค้างบนราง แต่ถ้าหักหลบ รถอาจหลบอันตรายได้ แต่หลุดออกนอกเลน ถ้าเบรกแรง รถอาจหยุดทัน แต่เสี่ยงถูกชนท้าย
ดังนั้นประเด็นสำคัญนอกจากแค่ว่ารถจะทำตามกฎอะไร คือถ้าทำตามทุกกฎพร้อมกันไม่ได้ รถควรยอมผิดกฎข้อไหนก่อน ซึ่งคือแนวคิดเรื่อง priority rules หรือการจัดลำดับความสำคัญของกฎ แทนที่จะมองว่ากฎทุกข้อสำคัญเท่ากัน เราอาจต้องบอกระบบว่า กฎบางข้อสำคัญกว่ากฎอื่น เช่น การไม่ชนสำคัญที่สุด รองลงมาคือการไม่ติดค้างบนราง ต่อมาคือการอยู่ในเลน และสุดท้ายคือการไม่กีดขวางการจราจร

หรือเอาให้ยากเข้าไปอีก คือต้องนึกด้วยว่าการแหกกฎมันก็มีระดับของมันอยู่ เช่นการเกิน Speed Limit มานิดหน่อย กับเกินมาก ๆ ก็ควรจะรุนแรงไม่เท่ากัน การขับเกินความเร็วเล็ก ๆ น้อย ๆ เพื่อเลี่ยงการชนคนก็อาจจะเป็นเรื่องที่ควรทำ
หลายคนน่าจะเห็นตรงกันว่าการคุยเรื่องรถยนต์ขับขี่อัตโนมัติในบ้านเราอาจจะฟังดูไกลเกินฝันและคงยังเร็วไปที่จะเอามาถกกัน แต่ผมว่าความน่าสนใจของการคิดเรื่องรถอัตโนมัติในบริบทถนนบ้านเรา จึงไม่ได้อยู่ที่ว่าเทคโนโลยีนี้จะมาถึงเมื่อไหร่ แต่คือการเปลี่ยนวิธีการมองการจราจรอย่างที่เราไม่เคยมองมาก่อน
เพราะถ้าจะให้คอมพิวเตอร์ขับรถบนถนนแบบนี้ได้ เราต้องอธิบายให้ได้ว่า อะไรคือกฎ อะไรคือข้อยกเว้น อะไรคือธรรมเนียมที่ทุกคนทำกันแต่ไม่มีใครเขียนไว้ และเมื่อสิ่งเหล่านี้ขัดกัน อะไรควรมาก่อน
พอคิดแบบนี้ ถนนก็ไม่ได้เป็นแค่ที่ที่รถวิ่งผ่านไปมา แต่มันกลายเป็นระบบหนึ่งที่เต็มไปด้วยกฎที่กำกวม กฎที่ใช้ไม่ได้จริง และข้อตกลงเงียบ ๆ ที่มนุษย์เรียนรู้กันเองทุกวัน เข้าใจกันบ้าง ไม่เข้าใจกันบ้าง และอาจบีบให้เราต้องปะทะกันเองโดยไม่รู้ตัว
และเช่นเดิม ใครที่อยากสนับสนุนเพจเว็บไซต์ของเรา ให้ผลิตคอนเทนต์คณิตศาสตร์แบบนี้ต่อไป ก็สามารถสมัครเป็นสมาชิกรายเดือนได้โดยกดปุ่ม 'สมัครสมาชิก' ได้เลยนะฮะ
เอกสารอ้างอิง
https://www.sciencedirect.com/science/article/pii/S0005109822005568
https://ieeexplore.ieee.org/document/9827153
https://www.sciencedirect.com/topics/computer-science/linear-temporal-logic
https://www.emergentmind.com/topics/linear-temporal-logic-ltl