อัลกอริทึมใดที่สามารถแสดงได้โดยใช้ภาษาที่ใช้งานได้ทั้งหมดกับตัวดำเนินการขนานข้อมูล


11

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

  • ชัดเจนลูป (ไม่ค่อยได้ใช้โดยไม่มีผลข้างเคียง)
  • เรียกซ้ำ
  • ฟังก์ชั่นชั้นหนึ่งโดยพลการ (ไม่มี y-combinator)

อย่างไรก็ตามภาษานี้มี:

  • ฟังก์ชั่นระดับบนสุด
  • ขอบเขตที่ จำกัด ให้การเชื่อม
  • การควบคุมการไหลของกิ่ง
  • ฟังก์ชันสเกลาร์คณิตศาสตร์และตรรกะทั่วไป
  • ตัวสร้างอาร์เรย์แบบง่าย ๆ เช่น fill (n, x) ซึ่งสร้างอาร์เรย์ n-element ที่มีค่าเหมือนกัน x
  • สิ่งสำคัญที่สุด: ชุด จำกัด ของตัวดำเนินการลำดับสูงกว่าซึ่งดำเนินการวนซ้ำที่มีโครงสร้างแบบขนาน (เช่นแผนที่ลดสแกนทุกคู่)

หากต้องการเฉพาะเจาะจงมากขึ้นเกี่ยวกับตัวดำเนินการขนานของข้อมูล:

  • y = แผนที่ (f, x) => y [i] = f [i]
  • y = ลด (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ... ))) สำหรับการเปลี่ยนแปลง p
  • y = สแกน (f, a, x) => y [i] = ลด (f, a, y [0 ... i-1])
  • y = ทุกคู่ (f, x, y) => y [i, j] = f (x [i], y [j])

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

เห็นได้ชัดว่ามีโครงสร้างบางอย่างที่ไม่สามารถแสดงในภาษานี้ได้เช่น:

while f(x) > tol:
    x <- update(x)   

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

คำตอบ:


7

คุณอาจต้องการดูภาษาการเขียนโปรแกรมแบบเก่าNESLซึ่งมีแนวคิดเหล่านี้อย่างจริงจัง ภาษานั้นมีพื้นฐานมาจากการดำเนินการเกี่ยวกับคอลเล็กชั่นรายการเป็นหลักและรายการของรายการเป็นต้น แต่ฉันคิดว่าต้นไม้และกราฟได้รับการพิจารณาด้วยการเข้ารหัสที่ซับซ้อน งานวิจัยบางส่วนที่ทำในโครงการนั้น (ในช่วงกลางปี ​​1990) สามารถช่วยตอบคำถามของคุณได้ วิทยานิพนธ์ระดับปริญญาเอก (มีอยู่ในหนังสือ) Guy E. Blelloch โมเดลเวกเตอร์สำหรับการประมวลผลข้อมูลแบบขนาน กด MIT, 1990 อาจให้คำตอบบางอย่าง เมื่อไม่นานมานี้ตั้งแต่ฉันดูมัน

งานที่ทำในนก Meertens พิธี (BMF) ตกอยู่ในประเภทนี้มากเกินไปเช่นเดียวกับภาษาการกุศล จากหน้าวิกิพีเดียการกุศลกล่าวว่าภาษาไม่ได้ทัวริงสมบูรณ์ แต่สามารถแสดงฟังก์ชั่นของ Ackermann ซึ่งหมายความว่ามันเป็นมากกว่าการเรียกซ้ำแบบดั้งเดิม ทั้ง BMF และการกุศลเกี่ยวข้องกับผู้ประกอบการเช่นการพับและการสแกน (catamorphisms, anamorphisms, ฯลฯ ) และพวกเขามีรากฐานมาจากทฤษฎีหมวดหมู่

ฉันสั้นคำตอบที่ไม่ชัดเจนคือคุณสามารถแสดงออกได้ค่อนข้างมาก


1
NESL ไม่ใช่ภาษาทั้งหมด
ต่อ Vognsen

ฉันได้รับรู้เพียงนิดหน่อยเกี่ยวกับ NESL เพียงแค่อ่านเอกสารของ Blelloch อย่างละเอียดเป็นครั้งแรก ขอบคุณสำหรับทิป. NESL ค่อนข้างคล้ายกับภาษาที่ฉันอธิบายไว้ข้างต้นยกเว้นว่าตามที่ Vognsen สังเกตเห็นมันอนุญาตการเรียกซ้ำ
Alex Rubinsteyn

ฉันสนใจในตัวเลือกดั้งเดิมของ Blelloch เช่น map, dist (ฉันเชื่อว่าเหมือนกับที่ฉันเรียกว่า 'fill') ความยาวการอ่านแบบอาเรย์การเขียนอาเรย์การสแกนพาร์ติชัน ดั้งเดิมของ NESL "สมบูรณ์" หรือมีการดำเนินการอื่นที่มีการใช้งานข้อมูลแบบขนานซึ่งไม่สามารถแสดงได้อย่างมีประสิทธิภาพโดยใช้สิ่งเหล่านี้หรือไม่?
Alex Rubinsteyn

2
ลบการสอบถามซ้ำจากนั้นคุณมีภาษาที่แสดงออกโดยเฉพาะอย่างยิ่งถ้าคุณพิจารณาที่จะพับและอื่น ๆ เมื่อมองที่ BMF และงานที่ตามมามันอาจจะน่าสนใจมากกว่านี้ ฉันขอโทษ แต่ฉันไม่ทันสมัยในพื้นที่นี้
Dave Clarke

7

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

การพับในรายการภาษาทั้งหมดใช้:

fold :: (a -> b -> b) -> b -> List a -> b

การแฉในภาษาทั้งหมดจะสร้างสตรีมซึ่งไม่ได้ จำกัด ขอบเขต:

unfold :: (b -> Maybe (a, b)) -> b -> Stream a

น่าเสียดายที่รายการและสตรีมอาศัยอยู่ในโลกที่แตกต่างกันดังนั้นผู้ประกอบการเหล่านี้จึงไม่สามารถสร้างได้ เราต้องการการโต้ตอบบางส่วน:

stream :: List a -> Stream a
list :: Int -> Stream a -> List a

ผู้ประกอบการกระแสฝังรายการลงในกระแสที่ถูกผูกไว้ ฟังก์ชั่นรายการแยกองค์ประกอบ n แรก (หรือน้อยกว่าถ้ากระแสสิ้นสุดก่อนหน้านี้) ลงในรายการ เราจึงมีสมการต่อไปนี้:

for all xs :: List a, xs == list (length xs) (stream xs)

ในการเพิ่มประสิทธิภาพเราสามารถตัดสตรีมทั้งหมดออกเป็นโครงสร้างข้อมูลระดับกลาง:

unfoldList :: Int -> (b -> Maybe (a, b)) -> b -> List a

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

ตามคำนิยามภาษา L อยู่ใน P เมื่อมีทัวริงเครื่อง M และพหุนามเช่นว่าสมาชิกของ x ใน L สามารถตัดสินใจได้โดยการใช้ M ในการทำซ้ำมากที่สุด p (n) โดยที่ n = | x | ตามอาร์กิวเมนต์มาตรฐานสถานะของเทปของเครื่องในการวนซ้ำ k สามารถเข้ารหัสด้วยรายการความยาวสูงสุด 2k + 1 แม้ว่าเทปของเครื่องจะไม่มีที่สิ้นสุด

แนวคิดนี้เป็นตัวแทนของการเปลี่ยนแปลงของ M ในฐานะฟังก์ชันจากรายการไปสู่รายการ การดำเนินการของเครื่องจะทำโดยการแฉสถานะเริ่มต้นด้วยฟังก์ชั่นการเปลี่ยนแปลง สิ่งนี้จะสร้างรายการ การสันนิษฐานว่า L อยู่ใน P หมายความว่าเราไม่จำเป็นต้องมองหาองค์ประกอบอื่นนอกเหนือจาก p (n) ในกระแส ดังนั้นเราสามารถเขียนแฉlist p(n)เพื่อให้ได้รายชื่อที่แน่นอน สุดท้ายเราพับมันเพื่อตรวจสอบว่าคำตอบของปัญหาการตัดสินใจคือใช่หรือไม่

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


4

มันเป็นภาษาที่ขมขื่นมาก ลองโปรแกรมฟังก์ชันแฟกทอเรียล:

fact 0 = 1
fact n = n * fact (n-1)

ปัญหาคือภาษาของคุณมีเท่า แต่ไม่มีการเปิดเผย วิธีธรรมชาติของการแสดงแฟกทอเรียลคือการเขียนแฉของ n ลงในรายการ [1, 2, ... , n] ด้วยการพับที่ทำให้มันพังทลายลงในขณะที่ทวีคูณ

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

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


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

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