ภาษาโปรแกรมสำหรับการคำนวณที่มีประสิทธิภาพ


32

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

ยกตัวอย่างเช่นบางอย่างเช่น : ใช้ภาษาการเขียนโปรแกรมที่คุณชื่นชอบและหลังจากที่คุณเขียนโปรแกรมของคุณ (ตรงกับทัวริงเครื่อง ), เพิ่มสามค่าส่วนหัว: จำนวนเต็มและจำนวนเต็มและเอาท์พุทเริ่มต้นdเมื่อคอมไพล์โปรแกรมเอาท์พุทเครื่องทัวริงที่ให้อินพุตของขนาดรันบนสำหรับขั้นตอน หากไม่หยุดก่อนที่ขั้นตอนจะเพิ่มขึ้นให้เอาต์พุตเอาต์พุตดีฟอลต์PPMMcckkddMMxxnnMMxxcnkcnkMMcnkcnkdd. ภาษาของการเขียนโปรแกรมนี้จะทำให้เราสามารถแสดงการคำนวณทั้งหมดในและไม่มีอะไรเพิ่มเติมนอกจากว่าฉันเข้าใจผิด อย่างไรก็ตามภาษาที่นำเสนอนี้ไม่ได้มีความน่าสนใจPP

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


7
ตัวอย่างง่ายๆของภาษาการเขียนโปรแกรมที่จับชุดย่อยของฟังก์ชันที่คำนวณได้: นิพจน์ทั่วไปและไวยากรณ์ที่ไม่มีบริบท
Jukka Suomela

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

การเขียนโปรแกรมเชิงเส้นและจำนวนเต็มจับส่วนย่อยของฟังก์ชั่นที่คำนวณได้
Diego de Estrada

Datalog สามารถแสดงอัลกอริทึมเวลาพหุนามเท่านั้น แต่ฉันไม่รู้ว่ามันสามารถแสดงอัลกอริทึมเวลาพหุนามทั้งหมดได้หรือไม่
Jules

กระดาษที่รู้จักกันดี "การเขียนโปรแกรมการทำงานทั้งหมด" ทำให้การโต้แย้งว่าภาษาการเขียนโปรแกรมที่ไม่มีปัญหาการหยุดชะงักไม่สามารถตัดสินใจได้จริงและเป็นประโยชน์ jucs.org/jucs_10_7/total_functional_programming
ไม่มี

คำตอบ:


32

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

งานอื่น ๆ ใช้วิธีการตรวจสอบว่าโปรแกรมใช้จำนวนหนึ่งของทรัพยากรที่ใช้ประเภทขึ้นอยู่กับหรือพิมพ์ภาษา Assembly

แต่วิธีการอื่น ๆ จะขึ้นอยู่กับแคลคูลัสอย่างเป็นทางการของขอบเขตทรัพยากรเช่นตัวแปรของแคลคูลัสที่ล้อมรอบ

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

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

Charity language programming เป็นภาษาที่ใช้งานได้ดีซึ่งหยุดการทำงานของอินพุตทั้งหมด ฉันไม่รู้ว่ามันซับซ้อนแค่ไหนที่สามารถแสดงออกได้ แต่ฟังก์ชัน Ackermann สามารถเขียนได้ในการกุศล


'อย่างน้อย' คุณหมายถึงอะไรที่นี่
nponeccop

'อย่างน้อย' ที่นี่หมายถึง 'บางส่วน' ฉันจะเปลี่ยนคำตอบเพื่อให้แม่นยำยิ่งขึ้น
Dave Clarke

ฉันค่อนข้างมั่นใจว่าความซับซ้อนของฟังก์ชั่นที่กำหนดได้ในระบบ F คือคลาสของฟังก์ชันที่ยุติลงในเวลา ไม่ได้เป็นระดับความซับซ้อนธรรมดามาก แต่ก็ยัง ...
cody

โคดี้: ตามทฤษฎีของ Wadler "ทฤษฎีบทฟรี", ระบบ F สามารถแสดง "ทุกฟังก์ชั่นวนซ้ำซึ่งสามารถพิสูจน์ได้ทั้งหมดในลำดับที่สอง Peano เลข" และ "รวมถึง [... ] ฟังก์ชันของ Ackermann" ฉันไม่แน่ใจว่าคุณเป็นคนเดียวกันหรือไม่ คุณสมบัติหลักของ Charity คือการรองรับ codata ในขณะที่ฉันคิดว่าการตรวจสอบการยกเลิกของ Agda นั้นให้ความชัดเจนมากกว่า Coq และ System F ในขณะที่รับประกันการยกเลิก
Blaisorblade

10

ดูกระดาษ Guillaume Bonfante ที่เสนอคุณสมบัติสองอย่างสำหรับ Logspace และเวลาพหุนามโดยใช้ภาษาการเขียนโปรแกรม

Guillaume Bonfante ภาษาการเขียนโปรแกรมบางภาษาสำหรับ Logspace และ Ptime, AMAST 2006, LNCS 4019, pp. 66-80, 2006


8

ฉันอยากจะพูดถึงทฤษฎีความซับซ้อนโดยนัยโดยนัยเป็นวิธีการนี้เนื่องจากฉันได้เห็นมันเกิดขึ้นในหลายคำถามที่เกี่ยวข้อง เพื่อพูดคำตอบนี้โดย Neel Krishnaswami :

เทคนิคพื้นฐานคือการเชื่อมโยงคลาสของความซับซ้อนกับระบบย่อยของลอจิกเชิงเส้น (ที่เรียกว่า "light linear logics") ด้วยความคิดที่ว่าการตัดการกำจัดสำหรับระบบลอจิกควรจะเสร็จสมบูรณ์สำหรับคลาสความซับซ้อนที่กำหนด (เช่น LOGSPACE PTIME ฯลฯ ) จากนั้นผ่านทาง Curry-Howard คุณจะได้รับภาษาการเขียนโปรแกรมซึ่งโปรแกรมในชั้นเรียนที่กำหนดนั้นมีความชัดเจน


5

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


1
มันเป็นคลาสย่อยที่เหมาะสมของฟังก์ชั่นทั้งหมด แต่การเรียกมันว่าคลาสของฟังก์ชั่น "ประสิทธิภาพ" อาจจะยืดออกไปหน่อย
Raphael

ฉันเดาว่าคุณสามารถแก้ไขมันเพื่อจับโดยใช้ลักษณะของของ Cobham เป็นการวนซ้ำแบบวนซ้ำแบบโพลิโนเมียล P PP
Kaveh

คนอื่น ๆ พูดถึง System F และภาษาที่ใช้บรรทัดคำสั่งอย่างรุนแรงอื่น ๆ ซึ่งในความหมายเพียงสนับสนุน อย่างไรก็ตามเนื่องจากรองรับฟังก์ชันชั้นหนึ่งจึงอนุญาตให้เขียนโปรแกรมได้มากขึ้น (เช่นฟังก์ชัน Ackermann)
Blaisorblade

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