หากคุณมีความคุ้นเคยกับการตรวจสอบโปรแกรมที่คุณมีแนวโน้มที่จะชอบอ่านคำถามก่อนที่จะมีประวัติความเป็นมา หากคุณไม่คุ้นเคยกับการยืนยันโปรแกรมคุณอาจยังสามารถตอบคำถามนี้ได้ แต่คุณน่าจะชอบอ่านแบ็คกราวน์ก่อน
พื้นหลัง
มันมักจะระบุว่าการตรวจสอบความถูกต้องบางส่วนไม่สามารถตัดสินใจได้ เพื่อการถกเถียงกันขอเลือกหนึ่งวิธีที่เจาะจงมากในการทำให้คำสั่งนี้แม่นยำในรูปแบบของ Floyd - Hoare flowgraphคือเดี่ยวกับที่แตกต่างโหนดเริ่มต้นจากการที่ทุกโหนดสามารถเข้าถึงได้ โปรแกรมเป็น flowgraph มีโหนดมีคำสั่ง มีสามประเภทของคำสั่ง (1) สมมุติฐานสมมติว่า q , (2) การยืนยันยืนยัน qและ (3) การมอบหมาย v: = e ที่นี่qคือสูตร fol (ตรรกะอันดับหนึ่ง) eคือคำศัพท์ fol และvคือตัวแปร
เราบอกว่าโปรแกรมนั้นถูกต้องบางส่วนเมื่อมีวิธีการใส่คำอธิบายประกอบแต่ละโหนดxด้วยเงื่อนไขa (x)และ postcondition b (x)เช่นนั้น (1) เงื่อนไขเบื้องต้นของโหนดเริ่มต้นนั้นถูกต้อง (2) { A (x) } x { B (x) } ถือสำหรับทุกคำสั่งxและ (3) ( ข (x)หมายถึงA (y) ) ที่ถูกต้องสำหรับขอบทั้งหมดจากxไปY นี่คือสิ่งที่ Hoare triples ถูกกำหนดดังนี้:
- { p } ยืนยัน q { r } หมายความว่า ( pหมายถึง ( qและr )) ถูกต้อง
- { p } สมมติว่า q { r } หมายความว่า (( pและq ) หมายถึงr ) ถูกต้อง
- { p } v: = e { r } หมายความว่า (( p ที่มีeแทนสำหรับv ) หมายถึงr ) ถูกต้อง
นี่เป็นข้อโต้แย้งมือหยักว่าทำไมการตรวจสอบนี้ถูกต้องบางส่วนเป็น undecidable: เมื่อคุณกรอกข้อมูลในบางA (x)และบางข (x)คุณต้องตรวจสอบถ้าบางสูตร Fol ที่ถูกต้องและที่เป็นที่ตัดสินไม่ได้
วิธีทั่วไปในการเข้ารหัสการยกเลิกในความถูกต้องเพียงบางส่วนคือการเพิ่มการยืนยันพิเศษบางอย่างที่กล่าวว่า "ตั้งแต่ครั้งที่ฉันถูกประหารชีวิตครั้งสุดท้าย การยืนยันความก้าวหน้าเหล่านี้จะต้องถูกวางไว้เพื่อให้การเดินแบบไม่มีที่สิ้นสุดทั้งหมดบนโฟลกราฟ (ที่เริ่มต้นที่โหนดเริ่มต้น) มีการยืนยันความคืบหน้าจำนวนมากอย่างไม่ จำกัด การจะมีความเฉพาะเจาะจงมากขึ้นขอบอกว่ายืนยันความคืบหน้ามักจะมีแบบฟอร์มยืนยัน ยู < วีที่UและVเป็นจำนวนเต็มบวกจะนำหน้าด้วยการกำหนดU = Fและจะตามมาด้วยการกำหนดV = U นี่ฉเป็นฟังก์ชั่นที่แตกต่างกัน , ยูเป็นค่าปัจจุบันของตนและวีคุ้มค่าในอดีต ตอนนี้เนื่องจากเราพูดถึง "จำนวนเต็มบวก" และเราเปรียบเทียบพวกเขาเราต้องให้แน่ใจว่ามีจำนวนมากกว่าเล็กน้อยที่มีอยู่: สมมุติว่าPeanoสามารถใช้เลขคณิตได้ (ฉันไม่รู้สึกอย่างแรงกล้าเกี่ยวกับตัวเลือกนี้อย่าลังเลที่จะเพิกเฉยหากสะดวก) แน่นอนว่าfอาจใช้ฟังก์ชั่นและค่าคงที่อื่น ๆ ที่กล่าวถึงในโปรแกรม (โปรดทราบว่าการเพิ่มสมมติฐานที่จุดเริ่มต้นของโปรแกรมนั้นเทียบเท่ากับการแนะนำความจริงที่ไม่ใช่ตรรกะ)
ตอนนี้หากโปรแกรมที่มีการยืนยันความคืบหน้ายังคงถูกต้องเพียงบางส่วนเราก็รู้ว่าโปรแกรมดั้งเดิมสิ้นสุดลง
คำถาม
เมื่อให้โปรแกรมยุติแล้วรู้สึกว่าการใช้ฟังก์ชันที่แตกต่างกันสำหรับการยืนยันความก้าวหน้านั้นยาก แต่มันยากแค่ไหน? (ฉันรู้ว่าแม้จะมีพื้นหลังขนาดใหญ่ด้านบนฉันยังคงทิ้งคำถามประเภทนี้ไว้ที่ปลายเปิดหรือไม่ชัดเจนขึ้นอยู่กับว่าคุณต้องการมองมันอย่างไร)
เพื่อให้แตกต่าง: ฉันกำลังมองหาการอ้างอิงที่เป็นทางการปัญหาของการลดการเลิกจ้างเพื่อความถูกต้องบางส่วนแล้วพูดอะไรบางอย่างเกี่ยวกับความซับซ้อนของมัน คำตอบที่ทำทั้งหมดนี้แน่นอนยินดีต้อนรับ