คุณจะตรวจสอบว่าสองอัลกอริทึมส่งคืนผลลัพธ์เดียวกันสำหรับอินพุตใด ๆ ได้อย่างไร


18

คุณจะตรวจสอบได้อย่างไรว่าอัลกอริธึมสองตัว (เช่นการเรียงแบบผสานและเรียงแบบไร้เดียงสา) ส่งคืนผลลัพธ์เดียวกันสำหรับอินพุตใด ๆ หรือไม่เมื่อชุดของอินพุตทั้งหมดไม่มีที่สิ้นสุด

ปรับปรุง:ขอขอบคุณคุณเบ็นที่อธิบายว่าเป็นไปไม่ได้ที่จะทำอัลกอริทึมในกรณีทั่วไป คำตอบของเดฟเป็นบทสรุปที่ยอดเยี่ยมของวิธีการอัลกอริธึมและแมนนวล (ขึ้นอยู่กับวิธีการของมนุษย์และการเปรียบเทียบ) ที่ไม่ได้ผลเสมอไป แต่มีประสิทธิภาพมาก


5
ตามที่ yuval กล่าวว่าไม่มีขั้นตอนใดที่สามารถระบุได้ว่าสำหรับสองโปรแกรมใด ๆ แต่ในกรณีพิเศษเช่นตัวอย่างของคุณคุณสามารถพิสูจน์ได้: ตัวอย่างเช่นถ้าคุณพิสูจน์ว่าอัลกอริทึมของคุณส่งคืนลำดับที่เรียงและมั่นคงคุณจะทำ
Sasho Nikolov

1
คุณต้องการเทคนิคอัตโนมัติ / อัลกอริทึมหรือชุดของคู่มือเทคนิคหรือไม่?
Dave Clarke

@SashoNikolov หากประสิทธิภาพถือว่าเป็นส่วนหนึ่งของเอาต์พุตคุณก็ต้องแสดงให้พวกเขาเห็นว่าทั้งสองทำงานในเวลา / พื้นที่ที่ซับซ้อนเดียวกัน
edA-qa mort-ora-y

1
คุณหมายถึง "เช็ค" หรือพิสูจน์? หมายความว่า "อินพุตใด ๆ " หรืออินพุตทั้งหมดหรือไม่ แรงจูงใจและบริบทของคำถามคืออะไร
Kaveh

2
@AndresRiorio: เทคนิคการพิสูจน์แตกต่างจากอัลกอริทึมที่แก้ปัญหาทั่วไป ตัวอย่างเช่นปัญหาการหยุดทำงานไม่สามารถตัดสินใจได้ แต่แน่นอนว่าเป็นไปได้ที่จะพิสูจน์การยกเลิกโปรแกรมหลายโปรแกรม (ด้วยตนเองหรือการวิเคราะห์พฤติกรรมอัตโนมัติ)
Raphael

คำตอบ:


16

ตรงกันข้ามกับสิ่งที่ผู้พูดไม่พูดมีเทคนิคที่มีประสิทธิภาพมากมายสำหรับการทำเช่นนี้

  • Bisimulation เป็นวิธีการหนึ่ง ดูตัวอย่างกระดาษของ Gordon เกี่ยวกับการเขียนโปรแกรมเชิงเหรียญและฟังก์ชั่นการใช้งานใช้งาน

  • อีกวิธีหนึ่งคือการใช้ทฤษฎีการปฏิบัติงานของโปรแกรมเทียบเท่าเช่นงานของพิตส์พิตส์

  • วิธีที่สามคือการตรวจสอบว่าทั้งสองโปรแกรมเป็นไปตามข้อกำหนดคุณสมบัติการทำงานเดียวกัน มีเอกสารนับพันเกี่ยวกับวิธีการนี้

  • วิธีที่สี่คือการแสดงให้เห็นว่าโปรแกรมหนึ่งสามารถเขียนลงในโปรแกรมอื่นได้โดยใช้เสียง การแปลงโปรแกรม

แน่นอนว่าวิธีการเหล่านี้ไม่สมบูรณ์เนื่องจากความไม่สามารถตัดสินใจได้ แต่ปริมาณและปริมาณงานได้ถูกสร้างขึ้นเพื่อแก้ไขปัญหา


HEU · RIS ·กระตุก [Gr εὑρίσκω "ค้นพบ"] n 1. เทคนิคที่ออกแบบมาเพื่อแก้ปัญหาที่ละเลยว่าการแก้ปัญหานั้นสามารถพิสูจน์ได้ว่าถูกต้อง แต่โดยปกติแล้วจะสร้างทางออกที่ดีหรือแก้ปัญหาที่ง่ายกว่าซึ่งประกอบด้วยหรือตัดกับการแก้ปัญหาที่ซับซ้อนมากขึ้น 2. ( Theor. ) อัลกอริทึมที่ไม่ทำงาน
JeffE

1
บาร์ตซิมป์สัน: "ไม่สามารถชนะอย่าพยายาม"
Dave Clarke

9
@JeffE: หากคุณต้องการตรวจสอบว่าอัลกอริทึมสองรายการส่งคืนผลลัพธ์เดียวกันหรือไม่คุณต้องพิสูจน์ มีเทคนิคที่ดีมากมายสำหรับการทำเช่นนี้ แน่นอนว่าวิธีการทั้งหมดไม่สมบูรณ์ แต่ใครจะสนใจ? ทฤษฎีความไม่สมบูรณ์ของ Goedel ไม่ใช่เหตุผลที่จะยอมแพ้ต่อคณิตศาสตร์!
Neel Krishnaswami

3
@JeffE เพียงเพราะไม่มีฟังก์ชั่นที่คำนวณได้เพื่อพิจารณาว่าอัลกอริทึมสองตัวส่งคืนผลลัพธ์เดียวกันไม่ได้หมายความว่าคุณไม่สามารถตอบคำถามสำหรับอัลกอริทึมเฉพาะสองใด ๆโดยเฉพาะอย่างยิ่งเมื่อกระบวนการค้นหาหลักฐานไม่ใช่การคำนวณ ฟังก์ชัน ในทำนองเดียวกันมีเอกสารจำนวนมากที่พิสูจน์ว่ามีการยกเลิกการรับประกันสำหรับอัลกอริทึมเฉพาะโดยไม่คำนึงถึงความจริงที่ว่ามันเป็นไปไม่ได้ที่จะตัดสินโดยทางกลไกว่าอัลกอริทึมโดยพลการจะยุติลงเสมอ
เบ็น

2
ในการปฏิบัติสองอัลกอริทึมที่ควรจะคำนวณฟังก์ชั่นเดียวกันแทบจะไม่เคยอนุญาตให้มีการพิสูจน์ความเท่าเทียม bisimulation - based (ในกรณีของอัลกอริธึมการเรียงลำดับที่กล่าวถึงข้างต้นระยะกลางของลูป / การเรียกซ้ำนั้นแตกต่างกัน) ฉันพูดโดยใช้ Hoare-logic แบบเก่าที่ดีเพื่อแสดงว่าพวกเขาทั้งสองใช้ข้อกำหนด I / O พฤติกรรมแบบเดียวกัน ไป.
ไก่

10

หากต้องการอธิบายรายละเอียดเล็กน้อยเกี่ยวกับข้อความ "เป็นไปไม่ได้" ต่อไปนี้เป็นภาพร่างหลักฐานที่เรียบง่าย

เราสามารถสร้างอัลกอริธึมกับเอาท์พุทโดยเครื่องจักรทัวริงซึ่งหยุดกับผลลัพธ์บนเทป หากคุณต้องการมีเครื่องจักรที่สามารถหยุดโดยการยอมรับกับเอาต์พุตบนเทปหรือปฏิเสธ (ซึ่งในกรณีที่ไม่มีเอาต์พุต) คุณสามารถสร้างการเข้ารหัสที่อนุญาตให้คุณสร้างโมเดลเครื่องเหล่านี้ด้วย "หยุดหรือหยุดไม่ได้ ไม่มีเครื่อง "ปฏิเสธ"

ทีนี้สมมติว่าฉันมีอัลกอริทึมPสำหรับพิจารณาว่า TMs สองตัวนั้นมีเอาต์พุตเหมือนกันสำหรับทุกอินพุตหรือไม่ จากนั้นด้วย TM AและอินพุตXฉันสามารถสร้าง TM Bใหม่ที่ทำงานดังนี้:

  1. ตรวจสอบว่าอินพุตเป็นXอย่างแน่นอน
  2. ถ้าใช่แล้วป้อนวงวนไม่สิ้นสุด
  3. หากไม่มีให้รันAบนอินพุต

ตอนนี้ฉันสามารถรันPบนAและBได้ Bไม่หยุดบนXแต่มีเอาต์พุตเหมือนกับAสำหรับอินพุตอื่นทั้งหมดดังนั้นหากAไม่หยุดบนXดังนั้นอัลกอริธึมทั้งสองนี้จึงมีเอาต์พุตเดียวกันสำหรับทุกอินพุต แต่สันนิษฐานว่าPสามารถบอกได้ว่าอัลกอริธึมสองตัวมีเอาต์พุตเหมือนกันสำหรับอินพุตทุกตัวหรือไม่ดังนั้นถ้าเรามีPเราสามารถบอกได้ว่าเครื่องใด ๆ หยุดทำงานชั่วคราวกับอินพุตโดยพลการซึ่งเป็นปัญหาการหยุดทำงาน เนื่องจากปัญหา Halting เป็นที่ทราบกันว่า undecidable, Pจึงไม่มีอยู่

ซึ่งหมายความว่าไม่มีวิธีการทั่วไป (คำนวณได้) ในการพิจารณาว่าอัลกอริธึมสองตัวมีเอาต์พุตเหมือนกันที่ใช้งานได้ตลอดเวลาหรือไม่ดังนั้นคุณต้องใช้เหตุผลโดยเฉพาะกับอัลกอริธึมที่คุณกำลังวิเคราะห์อยู่ อย่างไรก็ตามในทางปฏิบัติอาจมีวิธีการคำนวณที่ใช้งานได้สำหรับคลาสใหญ่ของอัลกอริทึมและมีแน่นอนเทคนิคที่คุณสามารถใช้เพื่อพยายามพิสูจน์หลักฐานสำหรับกรณีเฉพาะใด ๆ คำตอบของ Dave Clarke ให้สิ่งที่เกี่ยวข้องกับคุณดูที่นี่ ผลลัพธ์ "ความเป็นไปไม่ได้" จะใช้กับการคิดค้นวิธีการทั่วไปที่จะแก้ปัญหาเพียงครั้งเดียวและสำหรับทุกคนสำหรับอัลกอริทึมทั้งหมด


บางทีฉัน Pใช้งานได้เฉพาะการจัดเรียงอัลกอริทึม (คำถามยั่วยุ)
ราฟาเอล

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

2
โดยทั่วไปแล้วทฤษฎีบทของไรซ์ระบุว่าไม่มีวิธีที่คำนวณได้เพื่อพิสูจน์บางสิ่งเกี่ยวกับอัลกอริทึมทันทีที่มีอัลกอริทึมอย่างน้อยหนึ่งตัวที่มีคุณสมบัติที่คุณพยายามพิสูจน์และอย่างน้อยก็ไม่ได้ ตัวอย่างเช่นเมื่อใช้อัลกอริธึม A จะไม่มีฟังก์ชั่นการคำนวณที่ใช้อัลกอริทึม B เป็นอินพุตและทดสอบว่า B เทียบเท่ากับ A หรือไม่
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

สิ่งสำคัญคือให้สังเกตว่าทฤษฎีบทของไรซ์ใช้กับคุณสมบัติของภาษาเท่านั้นไม่ใช่ของทัวริงเครื่องจักร (เมื่อคุณใช้สิ่งเหล่านั้นเป็นแบบจำลองของ "อัลกอริทึม") หากมีความเป็นไปได้ที่ทัวริงเครื่องจักรสองเครื่องที่ทั้งคู่รู้จักภาษาเดียวกัน แต่มีคุณสมบัติและอีกอันไม่มีทฤษฎีบทของไรซ์ใช้ไม่ได้และอาจมีวิธีการคำนวณโดยทั่วไปสำหรับการทดสอบคุณสมบัติ แต่ทฤษฎีบทของไรซ์ใช้กับกรณีนี้อย่างชัดเจนใช่
เบ็น

2

โดยทั่วไปเป็นไปไม่ได้ แต่มีข้อ จำกัด มากมายที่ทำให้เป็นไปได้ ตัวอย่างเช่นคุณสามารถตรวจสอบความเท่าเทียมกันของโปรแกรมโค้ดแบบเส้นตรงสองโปรแกรมโดยใช้ BDD การใช้สัญลักษณ์สามารถจัดการกับกรณีอื่น ๆ ได้


1

มันเป็นไปไม่ได้ที่จะสร้างอัลกอริทึมที่พิสูจน์ความเท่าเทียมกันโดยทั่วไป คำแนะนำ: การลดลงของปัญหาการหยุดชะงัก


มีหลายเทคนิคแม้ว่าจะไม่มีระบบอัตโนมัติทั้งหมด
Dave Clarke

ฉันไม่รู้ว่าเป็นไปได้หรือไม่คำตอบของคุณเป็นเพียงความคิดเห็น ไม่ใช่คำตอบ

@ SaeedAmiri: ฉันมีเนื้อกับบริบทของคำตอบออกเล็กน้อย ฉันคิดว่ามันสมบูรณ์เพียงพอถ้าบางทีอาจไม่ดี
Raphael

@ ราฟาเอล, การลดลงซึ่งอยู่ในใจของ Yuval ชัดเจนและฉันไม่คิดว่า OP ไม่รู้ตัว แต่ปัญหาที่ยาก IMO กำลังหาวิธีสำหรับกรณีพิเศษดังนั้นการลดลงอย่างเห็นได้ชัดนี้อาจเป็นความคิดเห็นเพียงเตือน OP สำหรับกรณีทั่วไป

2
@ SaeedAmiri: นั่นสำหรับ OP และผู้มีสิทธิเลือกตั้งในการตัดสินใจไม่ใช่เรา
Raphael
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.