Çıkarım arıtma türleri


11

İş yerinde dinamik bir dil hakkında bazı tür bilgiler çıkarmakla görevlendirildim. letİfade dizilerini iç içe ifadelere yeniden yazar , şöyle:

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 }

Genel tip bilgisinden başladığımdan ve daha spesifik türler çıkarmaya çalıştığımdan, doğal seçim arıtma türleridir. Örneğin, koşullu işleç, doğru ve yanlış dallarının türlerinin birliğini döndürür. Basit durumlarda, çok iyi çalışır.

Ancak, aşağıdakilerin türünü çıkarmaya çalışırken bir engelle karşılaştım:

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

Hangi yeniden yazılır:

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

f:IntIntg:(IntInt)Int

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

Ben zaten aşırı yüklenmiş bir +operatörün türünü çözmek için fonksiyonel bağımlılıklar kullanıyorum , bu yüzden fiçinde türünü çözmek için kullanmak için doğal bir seçim olduğunu düşündüm g. Yani, ftüm uygulamalarındaki türleri birlikte türünü benzersiz bir şekilde belirler g. Ancak, ortaya çıktığı gibi, fundeps değişken kaynak türlerine çok iyi borç vermez.

Her neyse, polimorfizm ve arıtma yazımının etkileşimi sorunludur. Yani kaçırdığım daha iyi bir yaklaşım var mı? Şu anda “ML için Arıtma Türleri” ni hazmediyorum ve daha fazla literatür veya diğer göstergeleri takdir ediyorum.

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 

Yanıtlar:


9

Teoride kararsız olmanın yanı sıra, yüksek dereceli diller için statik değişmezlerin çıkarılmasının pratikte oldukça zor olduğu gerçeğini tökezlediniz. Sorunuza kesin yanıtın ne olduğundan emin değilim, ancak birkaç şeye dikkat edin:

  • Polimorfizm ve arıtma türleri birlikte kötü davranır, belirttiğiniz gibi, özellikle genel türlerin çoğu kavramı kaybolur. Bunun bir sonucu, polimorfizm varlığında arıtma türlerine dayanan analizlerin, tüm program analizi (kompozisyon analizinin aksine) ve programınıza hangi türü atamak istediğinize karar vermek için sezgisel tarama arasında seçim yapması gerekebilir.

  • Çıkarılan arıtma türleri ile aşağıdakiler arasında güçlü bir ilişki vardır:

    1. Programınızın soyut yorumunun hesaplanması

    2. Döngü değişmezlerini zorunlu bir dilde hesaplama.

Bunu akılda tutarak, ayrıntılandırma türlerinin çıkarımıyla ilgili birkaç dağınık referans bulunmaktadır. Ayrıntılandırma türlerinin birçok farklı çeşidi olduğunu unutmayın: Endüktif veri türlerinin ayrıntılandırmalarıyla daha fazla ilgileniyorum, bu nedenle bu liste bu yönde eğri olabilir.

  1. Klasiklerle başlayın: Üst Düzey Fonksiyonel Programların İlişkisel Özet Yorumu Cousot & Cousot tarafından. Bu, ilişkisel anlambilim kullanarak soyut yorumlamanın üst düzey programlara nasıl genişletileceğini açıklar.

  2. Sıvı Tipler : Rhondon, Kawaguchi ve Jhala. Bu, ML tarzı programlar için güvenlik ek açıklamalarını (örneğin dizi bağlı kontroller) çıkarmak için HM ve bir tür hassas ayrıntılandırmayı birleştiren çok gelişmiş bir çalışmadır. Çıkarım 2 adımda ilerler; birincisi, gerçekleştirilecek ayrıntılandırma seçimine rehberlik eden HM tip ek açıklamalarıdır.

  3. FF#

  4. Bir yoktur güzel kağıt boyutu ek açıklamaları içeren tipleri: arıtım türlerinin belirli bir tür çıkarsamadan Chin ve Khoo tarafından.

  5. ATS programlama dili çeşitli refinements izin verir ve onlarla programları yazmak için olanaklar sağlar bir sistemdir. Ancak ek açıklamalar keyfi olarak karmaşık olabilir (ve dolayısıyla kararsız olabilir) ve bu nedenle kullanıcı etkileşimi gerektirebilir. Bu tür bir çıkarım biçimi olduğuna inanıyorum, ancak hangi makaleyi önereceğimi bilmiyorum.

  6. Son olarak, ancak en az değil , Ole Agesen tarafından Kartezyen Ürün Algoritması . Ayrıntılandırma türlerinden açıkça bahsetmemekle birlikte, bu, karşılaştığınız sorunun çözülmesine en yakın çalışma gibi görünüyor. Soyutta parametrik polimorfizmden söz etmekten aldanmayın: sadece olası atom türlerinin tuplleri olan beton türlerini çıkarmaya bakarlar . Verimliliğe önem verilir. Sorununuzu çözüp çözmediğini görmek için önce bu makaleyi okumanızı tavsiye ederim.

λ

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.