โครงสร้างข้อมูลในภาษาโปรแกรมที่มีชนิดเชิงเส้น


15

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

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

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

ตัวอย่างที่เกี่ยวข้องมากที่สุดที่ฉันค้นพบคือรายการที่ลิงก์สองเท่า มีตัวอย่างอื่นอีกไหม?

คำตอบ:


20

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

หากความหมายของการอ้างอิงที่คุณต้องการบอกว่าพอยน์เตอร์ทั้งหมดเป็นค่าที่ไม่ซ้ำกัน (กล่าวคือมีการอ้างอิงไปยังวัตถุมากที่สุด) จากนั้นโครงสร้างของกราฟและกราฟจะไม่สามารถแสดงออกได้เนื่องจากเหตุผลทางด้านความคิดที่ซ้ำซาก วัตถุเดียวกัน ในกรณีนี้จะต้องเป็นการคำนวณซึ่งจะสร้างค่าใหม่ประเภทเนื่องจากคุณต้องการแผนที่และδ : ! A ! A ! ε : ! A A!AAδA:!A!A!AεA:!AA

แต่สมมติว่าคุณต้องการเพื่อเป็นตัวแทนของการแบ่งปัน จากนั้นวัตถุสามารถถูกรวบรวมขยะด้วยการนับการอ้างอิงด้วย maps และสามารถรับรู้เป็นการดำเนินการซึ่งเพิ่งนับจำนวนการอ้างอิง ในกรณีนี้คุณไม่สามารถใช้ลิเนียริตี้เพื่อสมมติว่ามันปลอดภัยเสมอที่จะเปลี่ยนแปลงค่าเนื่องจากมีการแชร์ แต่คุณสามารถมั่นใจได้ว่าการจัดสรรหน่วยความจำทั้งหมดชัดเจนในโปรแกรมของคุณและไม่มีรอบในฮีปδ : ! A ! A ! ε : ! A A!AδA:!A!A!AϵA:!AA

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

new:α.αc:ι.cap(c)ref(α,c)get:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)set:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)copy:α,c:ι.ref(α,c)ref(α,c)ref(α,c)

ใน API ที่ร่างไว้ด้านบน,มีช่วงเหนือ , ดัชนีโดเมนเวลารวบรวมบางส่วนและมีช่วงเหนือประเภท เรามีประเภทซึ่งเป็นความสามารถในการสร้างดัชนีโดยและประเภทซึ่งเป็นชนิดของการอ้างอิงไปยังเข้าถึงได้โดยความสามารถในการคการเรียกและในการอ้างอิงต้องใช้ความสามารถและการเรียกสร้างการอ้างอิงใหม่และความสามารถใหม่ที่แบ่งปันดัชนีทั่วไป อย่างไรก็ตามcιαcap(c)cref(α,c)αก.อีเสื้อsอีเสื้อnอีWโอพีY- การอ้างอิงไม่จำเป็นต้องเข้าถึงความสามารถใด ๆ ดังนั้นทุกคนสามารถคัดลอกการอ้างอิงได้ตราบใดที่พวกเขาไม่ได้มองเข้าไปข้างใน


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

1
1. นามแฝงและการแบ่งปันนั้นเป็นคำพ้องความหมาย 2. ใช่การตีความแบบความสามารถเสริมด้วยสิทธิ์แบบเศษส่วนของ Boyland อนุญาตให้ทำได้ ดูผลงานล่าสุดเกี่ยวกับความสามารถในการคำนวณทางทฤษฎีของ Pottier และงานของ Aldrich และ Bierhof เกี่ยวกับ Plural สำหรับการนำไปใช้
Neel Krishnaswami
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.