การแยกประเภทการปรับแต่ง


11

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

return x; Z            =>  x
var x; Z               =>  let x = undefined in Z
x = y; Z               =>  let x = y in Z
if x then T else F; Z  =>  if x then { T; Z } else { F; Z }

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

ฉันวิ่งเข้าไปในอุปสรรค์อย่างไรก็ตามเมื่อพยายามสรุปประเภทต่อไปนี้:

function g(f) {
  var x;
  x = f(3);
  return f(x);
}

ซึ่งเขียนใหม่เป็น:

\f.
  let x = undefined in
    let x = f 3 in
      f x

f:IntIntg:(IntInt)Int

g:τ1τ2.(Intτ1τ1τ2)τ2

ฉันใช้การอ้างอิงการทำงานในการแก้ไขประเภทของมากเกินไป+ผู้ประกอบการดังนั้นฉันคิดว่ามันก็เป็นทางเลือกที่เป็นธรรมชาติที่จะใช้พวกเขาในการแก้ไขประเภทของภายในf gนั่นคือประเภทของการใช้งานในทุกของตนร่วมกันไม่ซ้ำกันกำหนดประเภทของf gอย่างไรก็ตามตามที่ปรากฎ fundeps ไม่ได้ให้ยืมตัวเองอย่างดีเยี่ยมกับจำนวนตัวแปรประเภทแหล่งที่มา

อย่างไรก็ตามการทำงานร่วมกันของ polymorphism และการปรับแต่งการพิมพ์นั้นเป็นปัญหา ดังนั้นจะมีวิธีที่ดีกว่าฉันหายไป? ขณะนี้ฉันกำลังแยกย่อย "ประเภทการปรับแต่งสำหรับ ML" และจะขอบคุณวรรณกรรมเพิ่มเติมหรือตัวชี้อื่น ๆ

programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

คำตอบ:


9

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

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

  • มีความสัมพันธ์ที่ดีระหว่างประเภทการปรับแต่งที่อนุมานกับ:

    1. คำนวณการตีความนามธรรมของโปรแกรมของคุณ

    2. การคำนวณค่าคงที่แบบวนซ้ำในภาษาที่จำเป็น

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

  1. เริ่มต้นด้วยความคลาสสิก: การตีความบทคัดย่อเชิงสัมพัทธ์ของโปรแกรมการทำงานระดับสูงโดย Cousot & Cousot สิ่งนี้อธิบายถึงวิธีการขยายการตีความที่เป็นนามธรรมไปยังโปรแกรมที่มีลำดับสูงกว่าโดยใช้ความหมายเชิงสัมพันธ์

  2. ประเภทของเหลวโดย Rhondon, Kawaguchi และ Jhala นี่เป็นงานที่ได้รับการพัฒนามากซึ่งรวมเอา HM และประเภทของการปรับแต่งเพรดิเคตลงในคำอธิบายประกอบด้านความปลอดภัย การอนุมานนั้นดำเนินการใน 2 ขั้นตอน สิ่งแรกคือการอนุมาน HM ของการเพิ่มความคิดเห็นประเภทซึ่งเป็นแนวทางในการเลือกการปรับแต่งเพื่อดำเนินการ

  3. FF#

  4. มีกระดาษที่ดีโดยชินและคูในการอนุมานประเภทการปรับแต่งเฉพาะประเภท: ชนิดที่มีคำอธิบายประกอบขนาด

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

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

λ

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