เป้าหมายของการตีความเชิงนามธรรมในภาษาการเขียนโปรแกรมคืออะไร


9

ตอนนี้ฉันกำลังพยายามที่จะเข้าใจดีขึ้นว่า "การตีความเชิงนามธรรม" ในภาษาโปรแกรมคืออะไร ฉันพบบทหนังสือที่ดีที่อธิบายแนวคิดในการขยายโดเมนด้วยองค์ประกอบที่มีค่าคงที่น้อยที่สุด axioms ทั้งสี่ที่ให้จุดคงที่สำหรับฟังก์ชั่นต่อเนื่องและอื่น ๆ ฉันเข้าใจรายละเอียดทางเทคนิคเหล่านี้ (แม้ว่าฉันไม่แน่ใจว่า "การตีความเชิงนามธรรม" หมายถึงอะไรในรูปแบบทั้งหมดนี้)

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

ก็จะดีใจที่ได้รับภาพรวมระดับสูงซึ่งจะไปทางเทคนิคลึกพอสำหรับคนที่มีปริญญาวิทยาศาสตร์คอมพิวเตอร์ ฉันพบหน้าวิกิพีเดียค่อนข้างไม่มั่นคง


อ้างถึงหนังสือเล่มนี้ การตีความนามธรรมของ
vzn

คุณช่วยพูดถึงบทที่คุณกำลังอ่านหนังสือได้ไหม
วีเจย์ D

Wikipedia ไม่ใช่สถานที่ที่ดีที่สุดสำหรับการสอนเกี่ยวกับหัวข้อทางเทคนิคเพิ่มเติม
วีเจย์ D

@Vijay และ vzn นั่นคือสิ่งหนึ่งที่ฉันดู: cs.berkeley.edu/~necula/cs263/handouts/AbramskiAI.pdf
newToPL

คำตอบ:


16

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

ความแข็งในการคำนวณเป็นแรงจูงใจ

เริ่มจากปัญหาการตัดสินใจซึ่งโซลูชันมีโครงสร้างดังนี้:

ปัญหาการตัดสินใจ

มักจะมีขอบล่างของ NP-hard บนโพรซีเดอร์ การตรวจสอบคุณสมบัติเชิงความหมายของโปรแกรมนั้นยังไม่สามารถตัดสินใจได้ พวกเราทำอะไรได้บ้าง?

ลองทำข้อสังเกตสองข้อ อันดับแรกเราบางครั้งสามารถแก้ปัญหากรณีเฉพาะแม้ว่าเราไม่สามารถแก้ปัญหาทั่วไป ประการที่สองแอปพลิเคชันเช่นการปรับให้เหมาะสมของคอมไพเลอร์ทนต่อการประมาณค่าในคอมไพเลอร์ที่กำจัดแหล่งที่มาของความไร้ประสิทธิภาพบางอย่าง แต่ไม่ใช่ทั้งหมดที่มีประโยชน์ เพื่อให้สัญชาตญาณแม่นยำเราต้องตอบ:

  1. การแก้ปัญหาอย่างเป็นทางการหมายถึงอะไร แต่ไม่ใช่ทุกกรณีที่เป็นปัญหา
  2. แนวทางแก้ไขปัญหาการตัดสินใจโดยประมาณคืออะไร?

แนวคิดการตีความที่เป็นนามธรรม 1: เปลี่ยนคำชี้แจงปัญหา

สำหรับฉันความเข้าใจที่สำคัญของการตีความเชิงนามธรรมคือการเปลี่ยนการกำหนดปัญหาดังนั้นแทนที่จะขอคำตอบใช่ / ไม่ใช่เราขอคำตอบใช่ / ไม่ใช่ / อาจจะตอบ

ใช่ไม่อาจ

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

ความคิดนี้ไม่ จำกัด เฉพาะปัญหาการตัดสินใจ พิจารณาปัญหาเหล่านี้เกี่ยวกับโปรแกรม

  1. บรรทัดใดของรหัสในโปรแกรมที่มีการตาย (จะไม่ถูกดำเนินการ)
  2. ตัวแปรใดในโปรแกรมที่มีค่าคงที่
  3. คำยืนยันใดในโปรแกรมที่ถูกละเมิด

ในสถานการณ์ทั้งหมดนี้เราสามารถเปลี่ยนจากโซลูชันที่แน่นอนเป็นโซลูชันที่ใกล้เคียงโดยพิจารณาจากโซลูชันที่มีความไม่แน่นอน

  1. อะไรคือชุดของเส้นของรหัสที่ตายไปแล้วหรือ
  2. อะไรคือชุดของตัวแปรในโปรแกรมที่มีค่าคงที่?
  3. อะไรคือสิ่งที่ชุดยืนยันในโปรแกรมที่ไม่ได้ละเมิด?

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

  1. แทนที่จะเพิ่ม m และ nเราสามารถขอช่วงได้ [a,b] ซึ่งผลรวมอยู่
  2. แทนที่จะเป็นแบบทวีคูณ m โดย n เราสามารถขอ k บิตของผลลัพธ์ (เฉพาะตัวอย่างทั่วไปคือเครื่องหมายหรือบิตพาริตี)
  3. แทนที่จะถามหาการมอบหมายที่น่าพอใจให้กับสูตรเราสามารถขอชุดที่มีการมอบหมายที่น่าพอใจ

โปรดทราบว่าเราไม่เพียง แต่แก้ไขปัญหาเท่านั้น แต่ยังรวมถึงปัญหาทั่วไปอย่างเคร่งครัดเพราะการแก้ไขปัญหาเดิมยังคงเป็นวิธีการแก้ไขปัญหา คำถามใหญ่ที่ยังไม่ได้ตอบตอนนี้คือ: เราจะหาวิธีแก้ปัญหาโดยประมาณได้อย่างไร?

แนวคิดการตีความที่เป็นนามธรรม 2: การกำหนดลักษณะเฉพาะจุดของโซลูชันดั้งเดิม

ความคิดที่ใหญ่ที่สองคือการสังเกตว่าชุดของการแก้ปัญหามากมายมีลักษณะเป็นจุดคงที่ในการแก้ปัญหาของผู้สมัครตาข่าย ตัวอย่างเช่นสมมติว่าคุณมีกราฟและคุณต้องการทราบว่าจุดยอดt สามารถเข้าถึงได้จากจุดสุดยอด s. เราสามารถแยกมันออกเป็นชุดได้Reach(s) ของทุกจุดที่เข้าถึงได้จาก s จากนั้นตรวจสอบว่า tอยู่ในชุดนี้ เราสามารถสังเกตได้อีกว่าReach(s) เป็นวิธีแก้สมการน้อยที่สุด:

X={s}{w | v is in X and (v,w) is an edge}

ค่าของการกำหนดลักษณะจุดคงที่คือการแก้ปัญหาที่แน่นอนสามารถดูได้เป็นข้อ จำกัด ของชุดของการประมาณ ในตัวอย่างนี้nองค์ประกอบ -th ของซีรีส์คือชุดของกราฟจุดยอดที่สามารถเข้าถึงได้ n ขั้นตอนจาก s และการประมาณเป็นส่วนย่อยของจุดยอดเหล่านี้

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

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

แนวคิดการตีความนามธรรม 3: การประมาณจุดคงที่

แทนที่จะคำนวณจุดคงที่ของฟังก์ชั่น F ในขัดแตะ Lเราสามารถคำนวณจุดคงที่ของฟังก์ชันอื่นได้ G ในขัดแตะ M. ให้เงื่อนไขบางประการที่จะพบที่เกี่ยวข้องM ถึง Lโซลูชันที่คำนวณใน M รับประกันได้ว่าจะเป็นการประมาณของการแก้ปัญหาใน L. นี้เป็นหนึ่งในผลพื้นฐานของการตีความนามธรรมมักจะเรียกว่าทฤษฎีบทจุดคงที่การถ่ายโอน สภาพความสมบูรณ์นั้นได้รับจากการเชื่อมต่อของ Galois หรือการตั้งค่าที่อ่อนแอกว่าซึ่งเกี่ยวข้องกับสิ่งที่เป็นนามธรรมหรือฟังก์ชั่นการปรับความสมดุลหรือความสัมพันธ์ด้านความมั่นคง

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

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

แนวคิดของการประมาณขึ้นอยู่กับแอปพลิเคชัน หากคุณใช้ความสามารถในการเข้าถึงกราฟเพื่อวางแผนการเดินทางคุณอาจยอมรับการประมาณที่บอกว่าไม่มีเส้นทางระหว่างs และ t แม้ว่าจะมีเส้นทาง แต่คุณจะไม่มีความสุขหากอัลกอริทึมกล่าวว่ามีเส้นทางจาก s ถึง t ในกรณีที่ไม่มีเส้นทาง

แนวคิดการตีความนามธรรม 4: อัลกอริทึมการประมาณจุดคงที่

ทุกสิ่งที่เห็นมาเป็นผลการดำรงอยู่ทางคณิตศาสตร์ ขั้นตอนสุดท้ายคือการคำนวณการประมาณ เมื่อ lattice of approximations มี จำกัด (หรือหากตรงตามเงื่อนไขของ chain น้อยไปมาก / มากไปหาน้อย) เราสามารถใช้ขั้นตอนการทำซ้ำแบบง่ายได้ หากขัดแตะไม่มีที่สิ้นสุดกระบวนการวนซ้ำอาจไม่เพียงพอแม้ว่าการคำนวณจุดคงที่อาจยังคงสามารถตัดสินใจได้ ในสถานการณ์เช่นนี้มีการใช้เทคนิคมากมายในการประมาณค่าโซลูชันเพิ่มเติมหรือเพื่อข้ามไปยังโซลูชันที่แน่นอนเร็วกว่าอัลกอริทึมการทำซ้ำแบบไร้เดียงสา ในบริบทของการคำนวณวิธีการแก้ปัญหาที่คุณได้ยินคำเช่นขยับขยาย , กวดขัน , ย้ำกลยุทธ์ , การเร่งความเร็วและอื่น ๆ

สรุป

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

การคำนวณหาปัญหาที่ไม่มีตัวชี้วัดตามธรรมชาติคือศิลปะที่พัฒนาและกลั่นกรองโดยผู้ปฏิบัติงานอย่างต่อเนื่อง การตีความเชิงนามธรรมเป็นทฤษฎีทางคณิตศาสตร์หนึ่งข้อสำหรับวิทยาศาสตร์ที่อยู่เบื้องหลังศิลปะนี้

เอกสารอ้างอิง มีบทแนะนำที่ดีหลายประการเกี่ยวกับการตีความเชิงนามธรรมที่คุณสามารถอ่านได้

  1. บทนำเบื้องต้นเกี่ยวกับการตีความนามธรรม , Patrick Cousot (ทำงานร่วมกับ Radhia Cousot), การประชุมเชิงปฏิบัติการเกี่ยวกับชีววิทยาระบบและวิธีการของ Formals (SBFM'12)
  2. การแนะนำการตรวจสอบอย่างเป็นทางการของระบบคอมพิวเตอร์โดยการตีความนามธรรม Patrick และ Radhia Cousot, Marktoberdorf Summer School 2010
  3. การบรรยายครั้งที่ 13: สิ่งที่เป็นนามธรรมส่วนที่ 1 , Patrick Cousot, การตีความเชิงนามธรรม, หลักสูตร MIT
  4. รู้เบื้องต้นเกี่ยวกับการตีความนามธรรมแซมซั่นเอบรัมสกีและคริสฮันชินการตีความนามธรรมของภาษาที่ประกาศ 2530
  5. การตีความเชิงนามธรรมและการประยุกต์ใช้กับโปรแกรมเชิงตรรกะ Patrick และ Radhia Cousot, 1992 สองส่วนแรกมีภาพรวมทั่วไประดับสูงพร้อมตัวอย่างหลายตัวอย่าง

7

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

นี่คือวิธีที่ฉันคิดว่า:

การตีความเชิงนามธรรมกำลังเรียกใช้โปรแกรมโดยประมาณในชุดอินพุตขนาดใหญ่ทั้งหมดพร้อมกัน

สิ่งนี้ไม่ได้ครอบคลุมทุกอย่าง แต่ก็สามารถใช้งานได้ดีโดยทั่วไป

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

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

คุณไม่สามารถแสดงชุดของตัวเลขที่เป็นบวกทั้งหมดได้โดยตรง คุณต้องมีนามธรรมของชุดนั้นแทน นอกจากนี้คุณยังต้องสรุปจำนวนลบและศูนย์ให้เป็นนามธรรม คุณท้ายด้วยครอบครัว จำกัดนามธรรมชุด{neg,zero,pos}ที่แสดงถึงชุดคอนกรีต{{...,2,1},{0},{1,2,...}}.

ตอนนี้คุณสามารถสร้างกฎได้เช่น "การบวกตัวเลขสองตัวให้ผลลัพธ์เป็นจำนวนบวก" หรือ add:pos×pospos. กำหนดกฎสำหรับภาษาดั้งเดิมของคุณแต่ละภาษาและคุณสามารถแกล้งประเมินผลการคำนวณทางคณิตศาสตร์ในอินพุตจำนวนมากได้พร้อมกัน

แน่นอนว่ากฎ "การเพิ่มจำนวนบวกและลบ" จะทำให้คุณเดือดร้อนเนื่องจากการเพิ่มเช่นนั้นสามารถส่งคืนสิ่งใดก็ได้ กรอบการตีความที่เป็นนามธรรมช่วยคุณออกมาที่นี่: มันบอกว่าคุณควรคืนค่าประมาณเสียงที่แน่นที่สุดเท่าที่จะเป็นไปได้ หากกฎของคุณมีเสียงดีและพวกเขาบอกว่าการเติมจะส่งคืนบางสิ่งในชุดนามธรรมการประเมินที่เป็นรูปธรรมใด ๆ ควรส่งคืนตัวเลขในชุดคอนกรีตที่สอดคล้องกัน ตัวอย่างเช่นadd:pos×pospos กฎคือเสียงถ้า add(a,b) เป็นบวกสำหรับทุกบวก a และ b. นอกจากนี้pos×neg(poszeroneg) เป็นเสียงที่ไหน ""คือการดำเนินการสหภาพของชุดนามธรรมของคุณ

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

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

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

IOW สิ่งที่คุณระบุว่าเป็นแรงจูงใจในการตีความเชิงนามธรรมคือแรงจูงใจสำหรับเครื่องจักรที่จำเป็นสำหรับการตีความเชิงนามธรรมในภาษาที่เทียบเท่ากับทัวริง แรงจูงใจที่เกิดขึ้นจริงคือการสรุปพฤติกรรมของโปรแกรมโดยใช้พวกเขาในปัจจัยการผลิตหลายครั้ง

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