ตัวอย่างที่กระชับของต้นทุนชี้แจงของการอนุมานประเภท ML


11

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

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

# fun a -> a;;
- : 'a -> 'a = <fun>
# fun b a -> b a;;
- : ('a -> 'b) -> 'a -> 'b = <fun>
# fun c b a -> c b (b a);;
- : (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c = <fun>
# fun d c b a -> d c b (c b (b a));;
- : ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'd
= <fun>
# fun e d c b a -> e d c b (d c b (c b (b a)));;
- : (((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
   ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'e
= <fun>
# fun f e d c b a -> f e d c b (e d c b (d c b (c b (b a))));;
- : ((((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
     (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
    ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'e -> 'f) ->
   (((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
    (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'd -> 'e) ->
   ((('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'c -> 'd) ->
   (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'f
= <fun>

คำตอบ:


14

ในคำตอบนี้ผมจะยึดติดอยู่กับแกน ML ส่วนของภาษาที่มีเพียงแลมบ์ดาแคลคูลัสและ polymorphic letต่อไปHindley-มิลเนอร์ ภาษา OCaml แบบเต็มมีคุณสมบัติเพิ่มเติมเช่น polymorphism แถว (ซึ่งถ้าฉันจำได้อย่างถูกต้องไม่ได้เปลี่ยนความซับซ้อนทางทฤษฎี แต่ด้วยโปรแกรมจริงที่มักจะมีประเภทที่ใหญ่กว่า) และระบบโมดูล (ซึ่งถ้าคุณกระตุ้นยากพอที่จะไม่ - การกำจัดในกรณีทางพยาธิวิทยาที่เกี่ยวข้องกับลายเซ็นบทคัดย่อ)

ความซับซ้อนของเวลาในกรณีที่เลวร้ายที่สุดสำหรับการตัดสินใจว่าโปรแกรม core ML มีประเภทเป็นเลขชี้กำลังแบบง่ายในขนาดของโปรแกรมหรือไม่ การอ้างอิงแบบคลาสสิกสำหรับผลลัพธ์นี้คือ [KTU90] และ [M90] การรักษาขั้นต้นที่สมบูรณ์ แต่ไม่สมบูรณ์นั้นมีให้ใน [S95]

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

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

# fun d c b a -> d c b (c b (b a));;
t2 -> t2
where t2 = (t1 -> 'b -> 'c) -> t1 -> 'a -> 'd
where t1 = 'a -> 'b

นี่เป็นตัวอย่างแนวคิดที่เรียบง่าย: ขนาดของประเภทของทั้งคู่ที่(x,x)เป็นสองเท่าของขนาดของประเภทของที่xดังนั้นหากคุณเขียนpairฟังก์ชั่นครั้งคุณจะได้รับชนิดของขนาดN)NΘ(2N)

# let pair x f = f x x;;
# let pairN x = pair (pair (pair … (pair x)…));;
'a -> tN
where tN = (tN-1 -> tN-1 -> 'bN) -> 'bN
…
where t2 = (t1 -> t1 -> 'b2) -> 'b2
where t1 = ('a -> 'a -> 'b1) -> 'b1

ด้วยการแนะนำletคำจำกัดความpolymorphic แบบซ้อนขนาดของชนิดจะเพิ่มขึ้นอีกครั้งแทน ในครั้งนี้ไม่มีการแบ่งปันจำนวนมากที่จะสามารถกำจัดการเติบโตแบบเลขชี้กำลัง

# let pair x f = f x x;;
# let f1 x = pair x in
  let f2 x = f1 (f1 x) in
  let f3 x = f2 (f2 x) in
  fun z -> f3 (fun x -> x) z;;

อ้างอิง

[KTU90] Kfoury, J .; Tiuryn; Urzyczyn, P. (1990) "ความสามารถในการพิมพ์ดีดของ ML นั้นสมบูรณ์แบบสมบูรณ์" หมายเหตุการบรรยายในวิทยาการคอมพิวเตอร์ CAAP '90 431: 206-220 [ Springer ] [ Google ]

[M90] Mairson, Harry G. (1990) "การตัดสินใจความสามารถในการพิมพ์ดีด ML เสร็จสมบูรณ์สำหรับเวลาที่กำหนดได้ รายงานการประชุมวิชาการ ACM SIGPLAN-SIGACT ครั้งที่ 17 เรื่องหลักการภาษาโปรแกรม POPL '90 (ACM): 382–401 [ ACM ]

[P04] Benjamin C. Pierce หัวข้อขั้นสูงในประเภทและภาษาการเขียนโปรแกรม MIT Press, 2004. [ Amazon ]

[PR04] François Pottier และ Didier Rémy "สาระสำคัญของการอนุมานประเภท ML" บทที่ 10 ใน [P04] [ pdf ]

[S95] Michael I. Schwartzbach การอนุมานประเภทโพลีมอร์ฟิค BRICS LS-95-3, มิถุนายน 2538 ps


ดังนั้นโดยพื้นฐานแล้วธรรมชาติ "เรียงความ" ของการแสดงออกประเภทควบคู่กับการอนุมานประเภทเป็นรากของปัญหาหรือไม่
didierc

1
@didierc ฉันไม่เข้าใจความคิดเห็นของคุณ มีหลายสิ่งที่เป็นองค์ประกอบ ในทางหนึ่งเหตุผลพื้นฐานคือจากการดำเนินการพื้นฐานของการทำซ้ำวัตถุ (ข้อ จำกัด ที่ทั้งสองประเภทจะเหมือนกัน) และการจับคู่ ( ->ผู้ประกอบการ) คุณสามารถทำให้การเจริญเติบโตชี้แจง (ต้นไม้ Fibonacci)
Gilles 'หยุดความชั่วร้าย'

ใช่ฉันคิดว่านั่นคือสิ่งที่ฉันหมายถึง: พีชคณิตชนิดนั้นเป็นคำนิยามเรียงความ (คุณใช้คำว่า "เขียนฟังก์ชั่นการจับคู่" ในคำตอบของคุณนั่นอาจเป็นที่ที่ฉันหยิบคำขึ้นมา) ในความหมาย นิพจน์และโอเปอเรเตอร์ที่เล็กลงและองค์ประกอบใหม่ของนิพจน์แต่ละตัวจะปรับขนาดการแสดงออกอย่างน้อยที่สุดด้วยปัจจัย 2 (ด้วยประเภท polymorphic ที่ซับซ้อนมากขึ้น - triadic หรือมากกว่านั้นปัจจัยจะใหญ่กว่า)
didierc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.