คำถามติดแท็ก type-inference

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

1
สิ่งที่เป็นปัญหาในทางปฏิบัติกับทางแยกและสหภาพประเภทคืออะไร?
ฉันกำลังออกแบบภาษาการเขียนโปรแกรมฟังก์ชั่นแบบเรียบง่ายที่พิมพ์ได้ง่ายเป็นประสบการณ์การเรียนรู้ ดูเหมือนว่าระบบประเภทที่ฉันได้นำไปใช้จนถึงตอนนี้ (มีงานเพิ่มเติมเล็กน้อย) รวมประเภทการแยกและสหภาพเข้าด้วยกันเช่นคุณอาจมี: <Union String Integer> <Union Integer Foo> จุดตัดของทั้งสองประเภทด้านบนจะเป็นที่ราบ Integer สหภาพของทั้งสองประเภทจะเป็น <Union String Integer Foo> ความจริงที่ว่านี่เป็นไปได้แน่นอนไม่จำเป็นต้องหมายความว่ามันเป็นแนวคิดการออกแบบที่ดี โดยเฉพาะอย่างยิ่งฉันค่อนข้างกังวลเกี่ยวกับความยากลำบากในการใช้งานของการรักษาประเภทไม่ปะติดปะต่อและ / หรือการจัดการการทับซ้อน ข้อดี / ข้อเสียของการรวมคุณสมบัติดังกล่าวในระบบพิมพ์คืออะไร?

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

2
polymorphism ระดับสูงกว่าประเภทที่ไม่มีกล่อง
ฉันมีภาษาที่ไม่มีประเภทกล่องโดยค่าเริ่มต้นด้วยการอนุมานประเภทตาม Hindley – Milner ฉันต้องการเพิ่ม polymorphism ที่มีอันดับสูงกว่าโดยเฉพาะอย่างยิ่งสำหรับการทำงานกับประเภทที่มีอยู่ ฉันคิดว่าฉันเข้าใจวิธีตรวจสอบประเภทเหล่านี้ แต่ฉันไม่แน่ใจว่าต้องทำอย่างไรเมื่อรวบรวม ขณะนี้ฉันรวบรวมคำจำกัดความ polymorphic โดยการสร้างความเชี่ยวชาญเช่นเทมเพลต C ++ เพื่อให้สามารถทำงานกับค่าที่ไม่ได้ทำกล่อง เช่นให้คำจำกัดความของf<T>หากโปรแกรมเรียกใช้เท่านั้นf<Int32>และf<Char>จากนั้นเฉพาะความเชี่ยวชาญเหล่านั้นจะปรากฏในโปรแกรมรวบรวม (ตอนนี้ฉันกำลังรวบรวมโปรแกรมทั้งหมดไว้) แต่เมื่อผ่านฟังก์ชั่น polymorphic เป็นอาร์กิวเมนต์ฉันไม่เห็นว่าฉันสามารถสร้างความเชี่ยวชาญเฉพาะทางแบบสแตติกได้เนื่องจากฟังก์ชั่นสามารถเลือกได้ที่รันไทม์ ฉันไม่มีทางเลือกนอกจากใช้การแสดงแบบกล่องหรือไม่? หรือมีวิธีแก้ไขปัญหาหรือไม่ ความคิดแรกของฉันคือการเข้ารหัสอย่างใด rank- n polymorphism เป็นอันดับ 1 แต่ผมไม่เชื่อว่ามันเป็นไปได้ในทั่วไปเพราะสูตรในตรรกะที่สร้างสรรค์ไม่จำเป็นต้องมี prenex แบบปกติ

2
ชนิดย่อยเป็นชุดย่อยของประเภทข้อมูล SML
หนึ่งในสองสามสิ่งที่ฉันไม่ชอบเกี่ยวกับหนังสือของโอกาซากิในโครงสร้างข้อมูลที่ใช้งานได้อย่างหมดจดคือโค้ดของเขาเกลื่อนไปด้วยการจับคู่รูปแบบที่ไม่สิ้นสุด ตัวอย่างเช่นฉันจะให้การใช้คิวแบบเรียลไทม์ของเขา (ปรับปรุงใหม่เพื่อกำจัดการระงับที่ไม่จำเป็น): infixr 5 ::: datatype 'a stream = Nil | ::: of 'a * 'a stream lazy structure RealTimeQueue :> QUEUE = struct (* front stream, rear list, schedule stream *) type 'a queue = 'a stream * 'a list * 'a stream (* the front stream is …

3
การอนุมานประเภทสำหรับคำสั่งที่จำเป็นนอกเหนือจากที่ได้รับมอบหมาย
ในการค้นหาเอกสารวิจัยเกี่ยวกับระบบการพิมพ์สำหรับภาษาที่จำเป็นฉันจะหาวิธีแก้ปัญหาสำหรับภาษาที่มีการอ้างอิงที่ไม่แน่นอน แต่ไม่มีโครงสร้างการควบคุมที่จำเป็นอย่างแท้จริงเช่นตัวดำเนินการผสมลูปหรือเงื่อนไข ดังนั้นจึงไม่มีความชัดเจนว่าภาษาที่จำเป็นกับการอนุมานบางส่วนเช่นhttp://rust-lang.orgสามารถนำไปใช้ได้อย่างไร เอกสารไม่ได้กล่าวถึงประเภท parametrized เช่นList of aเนื่องจากประเภท parametrized เป็นส่วนขยายเล็กน้อยของระบบประเภท Hindley-Milner - อัลกอริทึมการรวมควรจะขยายและการอนุมานที่เหลือทำงานตามที่เป็นอยู่ อย่างไรก็ตามไม่สามารถเพิ่มงานที่มอบหมายได้เนื่องจากความขัดแย้งเกิดขึ้นดังนั้นต้องใช้เทคนิคพิเศษเช่นข้อ จำกัด ค่า ML คุณสามารถแนะนำเอกสารหรือหนังสือที่อธิบายถึงระบบการพิมพ์สำหรับภาษาที่มีลูปคำสั่งเงื่อนไขเงื่อนไข IO และคำสั่งผสมได้หรือไม่?

2
ความสามารถในการตัดสินใจของการอนุมานประเภทและการตรวจสอบประเภทใน MLTT
ใน Martin-Löf's An Intuitionistic Theory of Types: Predicative Partเป็นการพิสูจน์การตรวจสอบชนิดนั้นa : Aa:Aa \colon A เป็นที่ตัดสินใจได้ ขึ้นอยู่กับการaaaถูกพิมพ์ได้ในสถานที่แรกโดยการพิสูจน์ทฤษฎีบทการทำให้เป็นมาตรฐานสำหรับคำที่พิมพ์ได้ปิด ในทางกลับกันฉันได้เห็นมันเขียนไว้ในหลาย ๆ แห่ง (Wikipedia, Nördstrom ฯลฯ ) ที่การตรวจสอบประเภทใน (intensional) MLTT นั้นสามารถตัดสินใจได้ พวกเขา จำกัด การพิมพ์คำโดยปริยายหรือไม่? มีสิ่งใดที่ทราบเกี่ยวกับความสามารถในการอนุมานของการอนุมานประเภทหรือการตรวจสอบประเภทใน MLTT แบบอินทิกรัลถ้าเราไม่ จำกัด เฉพาะคำที่พิมพ์ได้? ตัวอย่างเช่นอาจมีกระบวนการตัดสินใจที่รับรู้เงื่อนไขที่ไม่สามารถพูดได้พูดโดยทำให้เป็นรูปแบบปกติที่ไม่สอดคล้องกับตัวสร้างหรือโดยแสดงว่าไม่มีลำดับการลดระยะเวลาสำหรับคำที่ไม่สามารถพิมพ์ได้ ฉันไม่สามารถค้นหามากในวรรณคดี

1
หลักฐานง่าย ๆ ที่ความสามารถในการพิมพ์ได้ใน System F (
สมมติว่าเราไม่ทราบว่าผลลัพธ์ของ Joe B. Wells ในปี 1994 นั้นทั้งการพิมพ์ดีดและการตรวจสอบประเภทไม่สามารถบอกได้ใน System F (AKA λ 2λ2\lambda 2) ในแลมบ์ดาของนิวเดลีของ Barendregt ที่มีประเภท (1992) ฉันพบหลักฐานเนื่องจาก Malecki 1989 ที่การตรวจสอบชนิดนั้นแสดงถึงความสามารถในการพิมพ์ดีด นี้เป็นเพราะ ที่มีอยู่ σσ\sigma ดังนั้น M:σM:σM:\sigma เทียบเท่ากับ (λxy.y)M:(α→α)(λxy.y)M:(α→α)(\lambda xy.y)M : (\alpha\rightarrow\alpha) (นี่เป็นเพราะหากคำใดคำหนึ่งสามารถพิมพ์ได้ใน System F ดังนั้นเทอมย่อยทั้งหมดจะเป็นเช่นนั้น) มีวิธีง่ายๆในการพิสูจน์วิธีอื่น ๆ ? นั่นคือหลักฐานที่แสดงว่าการพิมพ์ดีดหมายถึงการตรวจสอบประเภทใน System F หรือไม่

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

1
อะไรคือบทบาทของแคลคูลัส Bicolored ของการก่อสร้าง?
โดยเฉพาะอย่างยิ่งอัลกอริทึมที่ยึดตามแคลคูลัส Bicolored ของการก่อสร้างและฉันสับสนเล็กน้อย ฉันไม่เข้าใจว่าจุดประสงค์ของCCbiCCbiCC^{bi}คือ. ดูเหมือนว่าจะเหมือนกันกับCCCCCCยกเว้นว่ามีความแตกต่างระหว่างข้อโต้แย้งโดยนัยและข้อโต้แย้งที่ชัดเจนสำหรับฟังก์ชั่น โดยเฉพาะฉันไม่เห็นว่ามันช่วยให้คุณเขียนได้อย่างไร(id0)(id0)(id\; 0) แทน (idN0)(idN0)(id\; \mathbb{N}\; 0). หากเราถือว่าระบบสำหรับคำจำกัดความสากลแล้ว id:(ΠA|Type.(Πx:A.A))id:(ΠA|Type.(Πx:A.A))id : (\Pi A\; |\; \mathsf{Type}\; . (\Pi x : A\; . A)) และ id=(λA|Type.(λx:A.x))id=(λA|Type.(λx:A.x))id = (\lambda A\; |\; \mathsf{Type}\; . (\lambda x : A . x)). ทำกฎอนุญาตจริงๆ (id0)(id0)(id\; 0)? แน่นอนว่าไวยากรณ์ทำ แต่ฉันไม่เห็นมันในความสัมพันธ์การพิมพ์ ฉันพลาดอะไรไปรึเปล่า? ฉันเข้าใจบทบาทของCCbiCCbiCC^{bi} ไม่ถูกต้อง? นอกจากนี้ทรัพย์สินที่บรรจบกันจะสูญหายไปหรือไม่ ฉันเดาว่าปัญหาของฉันคือฉันกำลังอ่านเกี่ยวกับความประณีตโดยไม่ต้องอ่านอะไรมากมายCCbiCCbiCC^{bi}ก่อนหน้านี้. กระดาษที่ดีอะไรที่แนะนำและมันคนเดียว? …

1
ใน System F à la Church เราสามารถทำให้การอนุมานแบบอัตโนมัติสำหรับการกำจัดทั้งหมดได้หรือไม่?
คำถามมีดังต่อไปนี้ โดยทั่วไปเมื่อมีคำเช่นΛ X. เสื้อΛX.t\Lambda X.tเราสามารถกำจัด forall โดยใช้คำนี้กับประเภทเช่น( Λ X. t ) [ T] → t [ X: = T](ΛX.t)[T]→t[X:=T](\Lambda X.t)[T]\to t[X:=T]. ทีนี้สมมติว่านี่คือลูกศรและเราต้องการโต้แย้งมันแล้วเราจะต้องใช้เทอมนี้กับประเภทที่เหมาะสมเพื่อให้สามารถรับอาร์กิวเมนต์ได้ นั่นคือสิ่งที่ฉันถามถ้าฉันสามารถทำให้เป็นอัตโนมัติ: มันเป็นไปได้ที่จะสร้างฟังก์ชั่นฉff รับสองเทอมและคืนค่าประเภทนั้น ฉ&lt; Λ X. t &gt; &lt; r &gt;f&lt;ΛX.t&gt;&lt;r&gt;f<{\Lambda X.t}><{r}> โปรดระบุประเภทที่จำเป็นสำหรับการแทนที่ด้วย XXX ใน ttt ดังนั้น ttt สามารถยอมรับข้อโต้แย้ง rrr? ตัวอย่างบางส่วน: f&lt;ΛX.λxX→X.t&gt;&lt;λxT.x&gt;=Tf&lt;ΛX.λxX→X.t&gt;&lt;λxT.x&gt;=Tf<{\Lambda X.\lambda x^{X\to X}.t}><{\lambda x^T.x}>=T. f&lt;ΛX.λxX.r&gt;&lt;(λxR.tT) s&gt;=Tf&lt;ΛX.λxX.r&gt;&lt;(λxR.tT) …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.