กับตื้นลึก Embeddings


47

เมื่อเข้ารหัสตรรกะลงในตัวช่วยพิสูจน์เช่น Coq หรือ Isabelle ต้องมีการเลือกระหว่างการใช้ตื้นและการฝังลึก ในการฝังสูตรตรรกะตื้น ๆ จะถูกเขียนโดยตรงในตรรกะของทฤษฎีบทพิสูจน์ในขณะที่ในสูตรตรรกะฝังลึกจะแสดงเป็นประเภทข้อมูล

  • อะไรคือข้อดีและข้อ จำกัด ของวิธีการต่าง ๆ มีอะไรบ้าง
  • มีแนวทางใดบ้างในการพิจารณาว่าจะใช้อย่างไร
  • เป็นไปได้หรือไม่ที่จะสลับระหว่างการเป็นตัวแทนสองประการในรูปแบบที่เป็นระบบ?

ฉันต้องการเข้ารหัส logics ที่เกี่ยวข้องกับความปลอดภัยต่าง ๆ เป็น Coq และฉันสงสัยว่าข้อดีข้อเสียของวิธีการที่แตกต่างกันคืออะไร

คำตอบ:


28

อะไรคือข้อดีและข้อ จำกัด ของวิธีการต่าง ๆ มีอะไรบ้าง

  • ข้อดีของการฝังลึก: คุณสามารถพิสูจน์และกำหนดสิ่งต่าง ๆ โดยการเหนี่ยวนำในโครงสร้างของสูตร ตัวอย่างของความสนใจคือขนาดของสูตร

  • ข้อเสียของการฝังลึก: คุณมีการจัดการอย่างชัดเจนกับการผูกของตัวแปร ซึ่งมักจะลำบากมาก

มีแนวทางใดบ้างในการพิจารณาว่าจะใช้อย่างไร

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

ในอีกด้านหนึ่งการฝังลึกนั้นมีผลบังคับใช้เมื่อคุณต้องการพิสูจน์เมตา - ทฤษฎีบทเกี่ยวกับตรรกะของวัตถุ (เช่นการตัดออกเป็นต้น)

เป็นไปได้หรือไม่ที่จะสลับระหว่างการเป็นตัวแทนสองประการในรูปแบบที่เป็นระบบ?

แนวคิดเบื้องหลังการฝังตื้นคือการทำงานโดยตรงในรูปแบบของสูตรวัตถุ โดยทั่วไปผู้คนจะแมปสูตรวัตถุ P โดยตรง (โดยใช้สัญลักษณ์หรือทำการแปลด้วยมือ) กับผู้อาศัยของ Prop แน่นอนว่ามีประชากรของ Prop ที่ไม่สามารถรับได้โดยการฝังสูตรของตรรกะวัตถุ ดังนั้นคุณสูญเสียความสมบูรณ์บางชนิด

ดังนั้นจึงเป็นไปได้ที่จะส่งทุกผลลัพธ์ที่ได้จากการฝังลึกผ่านฟังก์ชั่นการตีความ

นี่คือตัวอย่าง coq เล็กน้อย:

สูตรการเหนี่ยวนำ: ชุด: =
    Ftrue: สูตร
  | Ffalse: สูตร
  | Fand: formula -> formula -> formula
  | สำหรับ: สูตร -> สูตร -> สูตร

Fixpoint ตีความ (สูตร F): Prop: = จับคู่ F กับ 
    Ftrue => จริง
  | Ffalse => เท็จ
  | Fand ab => (ตีความ a) / \ (ตีความ b)
  | สำหรับ ab => (ตีความ a) \ / (ตีความ b)
 ปลาย

Inductive derivations: formula -> Prop: = 
    deep_axiom: หาอนุพันธ์ Ftrue ได้
  | deep_and: forall ab, สามารถหาอนุพันธ์ a -> derivable b -> อนุพันธ์ได้ (Fand ab)
  | deep_or1: forall ab, สามารถแปลง a -> อนุพันธ์ได้ (สำหรับ ab)
  | deep_or2: forall ab, สามารถเปลี่ยนแปลงได้ b -> อนุพันธ์ได้ (สำหรับ ab)

อุปนัย sderivable: Prop -> Prop: = 
    ตื้นเขิน: sderivable จริง 
  | ตื้น: และ forall ab, s averivable a -> sderivable b -> sderivable (a / \ b)
  | shallow_or1: forall ab, sderivable a -> sderivable (a \ / b)
  | shallow_or2: forall ab, sderivable b -> sderivable (a \ / b)

(* คุณสามารถพิสูจน์บทแทรกต่อไปนี้: *)
เลมมา willow_deep: 
   forall F, derivable F -> sderivable (ตีความ F)

(* คุณไม่สามารถพิสูจน์บทแทรกต่อไปนี้: *)
เล็มม่า t: 
   สำหรับ P, sderivable P -> มีอยู่ F แปล F = P

22

การพูดอย่างคร่าวๆด้วยการฝังลึกของตรรกะคุณ (1) กำหนดประเภทข้อมูลที่เป็นตัวแทนของไวยากรณ์สำหรับตรรกะของคุณและ (2) ให้รูปแบบของไวยากรณ์และ (3) พิสูจน์ว่าสัจพจน์เกี่ยวกับไวยากรณ์ของคุณนั้นมีความเคารพ เพื่อรูปแบบ ด้วยการฝังแบบตื้นคุณข้ามขั้นตอน (1) และ (2) และเริ่มต้นด้วยแบบจำลองและพิสูจน์การใช้งานระหว่างสูตร ซึ่งหมายความว่างานแต่งงานตื้น ๆ มักจะทำงานน้อยลงเพื่อลงจากพื้นเพราะมันเป็นงานที่คุณมักจะลงมือทำด้วยการฝังลึก

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

ลำดับที่ถูกต้องที่คุณควรทำคือ: (1) พยายามที่จะได้รับโดยการฝังตื้น (2) เมื่อไอน้ำหมดลองใช้กลยุทธ์และใบเสนอราคาเพื่อเรียกใช้ขั้นตอนการตัดสินใจที่คุณต้องการเรียกใช้ (3) ถ้าสิ่งนั้นไม่มีไอน้ำให้เลิกใช้ซินแท็กซ์ที่พิมพ์ได้อย่างสม่ำเสมอสำหรับการฝังลึกของคุณ

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

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

แก้ไข: ต่อไปนี้เป็นความคิดเห็นที่อธิบายว่าทำไมการขึ้นบันไดอย่างค่อยเป็นค่อยไปเป็นสิ่งล่อใจและทำไมมันถึงนำไปสู่ความทุกข์

รูปธรรมสมมติว่าคุณมีตื้นฝังของตรรกะแยกกับ connectivesและหน่วยงานฉันจากนั้นคุณจะพิสูจน์ทฤษฎีบทเช่นและเป็นต้น ตอนนี้เมื่อคุณพยายามใช้ตรรกะเพื่อพิสูจน์โปรแกรมที่ถูกต้องคุณจะต้องมีอะไรบางอย่างและคุณต้องการได้อะไรแบบI))ABIABBA(AB)CA(BC)(IA)(BC)A(B(CI))

ณ จุดนี้คุณจะรู้สึกรำคาญกับการต้องเชื่อมโยงสูตรด้วยตนเองอีกครั้งและคุณคิดว่า "ฉันรู้! ฉันจะตีความประเภทข้อมูลของรายการเป็นรายการของสูตรที่แยกกันด้วยวิธีนี้ฉันสามารถตีความเป็น การต่อรายชื่อเหล่านี้เข้าด้วยกันจากนั้นสูตรข้างต้นจะเท่ากับคำจำกัดความ!

นี่เป็นเรื่องจริงและได้ผล! อย่างไรก็ตามโปรดทราบว่าการรวมกันนั้นเป็น ACUI ด้วยเช่นกัน ดังนั้นคุณจะต้องผ่านกระบวนการเดียวกันในการพิสูจน์อื่น ๆ ที่มีรายการประเภทข้อมูลที่แตกต่างกันและจากนั้นคุณจะมีสามไวยากรณ์สำหรับส่วนที่แตกต่างกันของตรรกะการแยกและคุณจะมี metatheorems สำหรับแต่ละคนซึ่งจะแตกต่างกันอย่างหลีกเลี่ยงไม่ได้ และคุณจะพบว่าคุณต้องการ metatheorem ที่คุณพิสูจน์แล้วว่าแยกการเชื่อมต่อเพื่อแยกความแตกต่างแล้วคุณจะต้องผสมผสานไวยากรณ์แล้วคุณจะเสียสติ

เป็นการดีกว่าที่จะกำหนดเป้าหมายชิ้นส่วนที่ใหญ่ที่สุดที่คุณสามารถจัดการได้ด้วยความพยายามอย่างสมเหตุสมผลและทำมัน


ขอบคุณสำหรับคำตอบที่ดีนี้ Neel ฉันหวังว่าฉันจะยอมรับคำตอบได้สองข้อ (ฉันตัดสินใจจากคะแนนโหวตของผู้อื่น)
Dave Clarke

ไม่มีปัญหา. ฉันเพิ่งจำบางสิ่งที่ฉันต้องการเพิ่มในคำตอบนี้เกี่ยวกับสาเหตุที่เพิ่มขึ้นเป็นสิ่งที่ดึงดูดดังนั้น
Neel Krishnaswami

การจัดการกับคุณสมบัติ ACUI เป็นสิ่งที่สร้างความรำคาญเสมอ เหตุใด Coq จึงไม่สามารถละทิ้งหนังสือของม้อดได้?
Dave Clarke

14

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

ตัวอย่างเช่นเมื่อคุณต้องการให้เหตุผลเกี่ยวกับ Hoare Logic คุณสามารถสร้างแบบจำลองภาษาการแสดงออกในลักษณะที่ตื้น แต่โครงร่างของการกำหนดถ้าในขณะที่ภาษาควรเป็นประเภทข้อมูลที่เป็นรูปธรรม คุณไม่จำเป็นต้องใส่โครงสร้างของ x + y หรือ <b แต่คุณต้องทำงานกับwhileฯลฯ

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

ผิดปกติใน HOL แบบคลาสสิกโดยไม่ขึ้นอยู่กับวิธีการ HOL - Nominal วิธีการโดย C. Urban ทำงานค่อนข้างดีสำหรับการผูกตื้นแม้ว่ามันจะไม่ทันกับการเปลี่ยนแปลงทางวัฒนธรรมในชุมชนของการเขียนโปรแกรมภาษา

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