บริบทไวและไวยากรณ์ที่สำคัญ


25

1) อะไรคือสิ่งที่ถ้ามีความสัมพันธ์ระหว่างการพิมพ์แบบคงที่และไวยากรณ์อย่างเป็นทางการคืออะไร?

2) โดยเฉพาะอย่างยิ่งมันเป็นไปได้ไหมที่หุ่นยนต์ที่มีข้อ จำกัด เชิงเส้นเพื่อตรวจสอบว่าพูดว่าโปรแกรม C ++ หรือ SML นั้นพิมพ์ได้ดีหรือไม่? ออโตเมติกแบบซ้อนกัน?

3) มีวิธีธรรมชาติในการแสดงกฎการพิมพ์แบบคงที่ในแง่ไวยากรณ์ที่เป็นทางการ?

คำตอบ:


20

เป็นไปไม่ได้ที่ออโตมาต้าที่มีขอบเขตเชิงเส้นจะตรวจสอบว่าโปรแกรม C ++ หรือไม่และเป็นไปไม่ได้ที่ LBA จะตรวจสอบว่าโปรแกรม SML นั้นพิมพ์ได้ดีหรือไม่ C ++ มีระบบชนิดทัวริงสมบูรณ์เนื่องจากคุณสามารถโค้ดโปรแกรมโดยพลการเป็นเทมเพลต metaprograms

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

fun delta x = (x, x)        (* this has type 'a -> ('a * 'a), so its return value
                               has a type double the size of its argument *)

fun f1 x = delta (delta x)  (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)        
fun f3 x = f2 (f2 x)        (* This function has a HUGE type *)

สำหรับระบบประเภทที่เรียบง่ายเช่น C หรือ Pascal ฉันเชื่อว่าเป็นไปได้ที่ LBA จะตรวจสอบ

ในวันแรก ๆ ของการวิจัยภาษาโปรแกรมบางครั้งผู้คนใช้van Wingaarden grammars (หรือที่เรียกว่าgrammarsสองระดับ) เพื่อระบุระบบชนิดสำหรับภาษาโปรแกรม ฉันเชื่อว่า Algol 68 ถูกระบุด้วยวิธีนี้ อย่างไรก็ตามฉันได้รับการบอกว่าเทคนิคนี้ถูกทอดทิ้งด้วยเหตุผลเชิงปฏิบัติเป็นหลักมันกลายเป็นเรื่องยากสำหรับคนที่จะเขียนไวยากรณ์ที่ระบุสิ่งที่พวกเขาคิดว่าพวกเขากำลังระบุ! (โดยทั่วไปคนไวยากรณ์ที่เขียนสร้างภาษาขนาดใหญ่กว่าที่พวกเขาตั้งใจ)

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

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


4

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

ฉันรู้ว่าเครื่องปั่นไฟคอมไพเลอร์ที่สำคัญช่วยให้ภาคพลกฎระเบียบที่ป้องกันไม่ให้การปกครองจากการถูกประหารถ้ากริยาไม่ได้ประเมินเช่นtrue { type(e1) == type(e2) } (expression e1) '+' (expression e2)แนวคิดนี้สามารถทำให้เป็นระเบียบได้ง่าย ข้อ จำกัด ที่เหมาะสมของเพรดิเคตที่อนุญาตจากนั้นสามารถให้ผลการตัดสินใจโดย LBAs

kk+1

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