-calculus yansıması


23

Çalışan programların iç içe geçmesi ve manipülasyonu gibi yansıma mantığını destekleyen basit bir hesabı arıyorum .

Birinin λ- termleri sözdizimsel olarak manipüle edilebilecek ve daha sonra değerlendirilebilecek bir forma dönüştürmesini sağlayan türetilmemiş bir hesabı uzantısı var mı?λλ

Analizin iki ana ek terimi olduğunu hayal ediyorum:

  • : alır v ve bir temsilini üretir v sözdizimsel manipülasyona iyileştirilebilir.reflect vvv
  • : bir terimin sözdizimsel gösterimini alır ve değerlendirir.eval v

Yansımayı desteklemek için, terimlerin sözdizimsel gösterimi gereklidir. Gibi bir şey olurdu:

  • bir terim olarak temsil edilen ( L A M R ( e ) ) , R ( E ) yansıyan versiyonu e ,λx.e(LAM R(e))R(e)e
  • ( A P P R ( e ) R ( e ) ) terimi olarak temsil edilirvee e(APP R(e) R(e))
  • , ( V A R x ) olarak temsil edilir.x(VAR x)

Bu gösterimle, kalıp eşleştirme terimleri değiştirmek için kullanılabilir.

Fakat bir sorunla karşılaşıyoruz. ve E v bir l desen eşleştirme olduğu gibi ihtiyaç terimler olarak kodlanacak. Bununla başa çıkmak basit görünüyor, R E F L E C T , E V A L ve M A T C H , ancak bunların manipülasyonunu desteklemek için başka terimler eklemem gerekecek mi?reflectevalREFLECTEVALMATCH

Yapılması gereken tasarım seçenekleri var. Ne gereken işlevi gövdesi ile yapılacak Yukarıda değinildiği r e f l e c t ve E v bir L ? Meli R ( - ) vücudu dönüşümü ya da değil?R()reflectevalR()

Yansımanın kendisini incelemekle pek ilgilenmediğim için - matematik diğer araştırmalar için bir araç görevi görür - tekerleği yeniden icat etmek istemiyorum.

Az önce tarif ettiğim ile eşleşen herhangi bir hesap var mı?

Söyleyebileceğim kadarıyla, MetaML gibi bir yorumda önerilen hesaplar çok uzun bir yol kat ediyor, ancak zaten eşleştirilen kalıp parçalarını yok etme ve daha önce oluşturulmuş kod parçalarını kaldırma yeteneğini içermiyor.

Yapabilmek istediğim bir şey:

  • let x=λy.y in reflect x(LAM (VAR y) (VAR y))

Ve sonra tamamen farklı bir ifade oluşturmak için sonuç üzerinde desen eşleştirme yapın.

Bu kesinlikle calculus için muhafazakar bir uzantı değildir ve meta-teorinin çirkin olması muhtemeldir, ancak bu benim başvurum için önemli bir nokta. Λ- soyutlamaları birbirinden ayırmak istiyorum .λλ


MetaML, REFLECT'inizi yapmak ve EVAL'ı açmak için destekleme operatörü ile yazılmış yansıtıcı bir dildir. Yazma basit, ancak S4 modundan kalıtılan parçayı , size yardımcı olabilecek bu makale gibi çalışmalarda görebilirsiniz.
ex0du5

@ ex0du5: Teşekkürler, ama söyleyebileceğim kadarıyla, bu yeterince ileri gitmiyor. Elbette, çeşitli aşamalarda kod oluşturabilirim, ancak terimleri ayıramayacak gibi görünmüyorum. (Bir şeyleri kaçırıp kaçırmadığımı görmek için daha yakından okuyacağım.)
Dave Clarke

Şema (değişkenlik ve diğer komplikasyonlar olmadan)?
Gilles 'SO- kötü olmaktan vazgeç'

@Gilles: Scheme bir programlama dilidir, bir hesap değil. Ayrıca istediğimi yapabileceğini sanmıyorum.
Dave Clarke

@DaveClarke Bir programlama dili, siğilleri çok fazla olan bir hesaptır. Bir Scheme çekirdeği ilk bakışta uygun gözüküyor, ancak emin olmak için gerekli düşünceleri henüz vermedim. Sence işe yaramayacak ne düşünüyorsun? ( İsterseniz sohbete
katılın

Yanıtlar:


15

Jean Louis Krivine, "Krivine Makinesi" ni önemsiz olmayan bir şekilde genişleten soyut bir hesap çıkardı (Krivine makinesinin lisp'ten çağrı / cc komutunu zaten desteklediğini unutmayın):

O bir "alıntı" operatörünü tanıtır Bu makalede aşağıdaki şekilde tanımlanmaktadır: eğer bir olduğunu λ uzun dönem, not n j imajını cp bazı bijection tarafından tt : N- N doğal sayılar lambda terimlerinden. Not ¯ n tekabül kilise numarası n N . Krivine, operatörü χ değerlendirme kuralı ile tanımlar : χ ϕ ϕ ¯ n ϕϕλnϕϕπ:ΛNn¯nNχ

χ ϕϕ nϕ¯
Ben Kleene bu istediğiniz şeyi yapmaya yeterli olduğunu gösterecektir sihirbazlık inanıyoruz: eğer yani bir alıntı ve eval operatörleri tanımlamak hesaplanabilir olduğunu.π

Krivine’in okumanın çok zor olduğunu unutmayın (lütfen bunu okuyorsanız kızmayın, Jean-Louis!) Ve bazı araştırmacılar teknik içeriği daha okunaklı bir şekilde çıkarmaya çalışarak hayırsever davrandılar. Christophe Raffali'nin notlarına bakmaya çalışabilirsin .

Bu yardımcı olur umarım!


λ

(λ(x y).x)((λx.x x) (λy.y))

λx.x x


Görünüşe göre makul görünen bir cevabı yükseltmek isterim, ancak soruyu cevaplamaya başlayıp başlamayacağı hakkında hiçbir fikrim yok.
Raphael

@Raphael makaleleri oku ve bul :) Gerçekte, bu sadece kısmi bir cevap: Makaleler gerçekten de lambda matematiğinde bulunmayan lisp'ın önemli bir özelliğini resmileştiriyor: QUOTE operatörü. Bununla birlikte, kapsamlı bir meta-teorik çalışma yoktur, sadece bunu, küme teorisinin karmaşık aksiyomlarını gerçekleştirmek için bir çeşit tuhaf, şeffaf olmayan bir hesaplamayı ifade etmenin bir aracı olarak sunarlar.
cody

1
(λx.x x) (λy.y)λy.y(x y)

1
quotereflectquote

8

Bunu yapmak çok zor, imkansız değilse de, birleştikten vazgeçmeden zordur. Söyleyeceğim, kıllı bir meta-teori konusunda haklı olduğunuzdan şüpheleniyorum. Öte yandan, tüm turing hesaplanabilir fonksiyonlarını ifade edebilen ve şartlarını inceleme yeteneğine sahip bir birleştirici hesabı tasarlamak mümkündür: Jay ve Give-Wilson'a bakınız .

Bununla birlikte, bu kabiliyete sahip olmanın, sizin denk teorinize bazı kötü şeyler yaptığına inanıyorum. Özellikle, eğer alfa denkliklerine eşitse, iki değerin eşit olduğunu kanıtlama eğiliminde olacaksınız.

Henüz bağlantılı Krivine ödevini okudum, ancak Klasik mantıkta aslında sadece iki şeyin olduğunu unutmayın: doğru ve yanlış. Her şey bunlardan birine eşittir. Yani, zaten çökmüş bir denklem teorisine sahip olma eğilimindesiniz.


1
Krivine hesabının, önemsiz olmayan bir denklem teorisine sahip olan önermelerin bir hesaplaması değil, bunlar için gerçekleştiricilerden oluştuğunu unutmayın .
cody 19

5

Programlama dilleri teorisinde bahsettiğiniz özellik genellikle "alıntı" olarak adlandırılır. Örneğin, John Longley çalışmalarının bir kısmında bunun hakkında yazdı, bu makaleyi görün .

Teorik düşüncelerden hemen sonraysanız (gerçek anlamda faydalı bir uygulamanın aksine) , argümanının bir Gödel kodunu döndürerek , tamsayı tipine eşleştiğini quote(ya reflectda sizin söylediğiniz gibi) belirterek şeyleri basitleştirebilirsiniz nat. Ardından, sayıyı soyut bir sözdizimi ağacında yaptığınız gibi çözebilirsiniz. Ayrıca, evaldilde uygulanabileceği için buna ihtiyacınız yok - bu aslında dil için bir tercüman.

nmφn(m)φnnλquote

Bana neyin peşinde olduğunuzu söylerseniz, size daha spesifik referanslar verebilirim.

Bu arada, işte açık bir problem:

λquoteξ

ξ

e1e2λx.e1λx.e2
λλquotequote
e1e2quotee1quotee2,
quote((λx.x)y)quotey.
quoteλ

βquoteλξ

ξβ

Aşağıdaki makale, (ξ) denklemiyle ilgili bazı problemleri göstermektedir: Lambda Matematik, Cebirsel, Peter Selinger. İlginç, yeni bilmediğim bir şey! Güzel.
Transfinite Numbers,

4

İşte alternatif bir cevap, halen deneysel olan nominal yaklaşımımı kullanmak yerine, kağıda geri dönen daha yerleşik bir yaklaşım var:

LEAP: Değerlendirilen ve polimorfizmi olan bir dil
Frank Pfenning ve Peter Lee
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf

Kağıt şununla başlar:

Bu da bizi Reynolds tarafından ilk kez güçlü bir şekilde yazılmış dillerin metacircular tercümanları kabul edip etmediği sorusuna yönlendirdi. Geleneksel bilgelik, cevabın "Hayır" olduğunu gösteriyor gibiydi. Cevabımız "Neredeyse".

Lütfen, LEAP'in OP'nin istediğinden daha güçlü olduğunu unutmayın. Her şeyden önce yazılır. İkincisi ise, metacircularity'yi sorar, yani eval, kendi tanımını uygulayabileceği anlamına gelir. Prolog'da çözme / 1 için metacircularity elde edersiniz:

solve(true).
solve((A,B)) :- solve(A), solve(B).
solve(H) :- clause(H,B), solve(B).

Çözmek için aşağıdaki maddeyi eklerseniz / 1:

solve(clause(H,B)) :- clause(H,B).

Ve eğer onu görürseniz, bu madde / 2 de, / / ​​'ın cümlelerini döndürür. O zaman çözme (çözme (...)) diyebilir ve çözmenin kendini nasıl yürüttüğünü görebilirsiniz.

Kendini temsil eden sorular hala biraz araştırmaya neden oluyor, örneğin bakınız:

Girards Sisteminde kendini temsil etme U
Brown Brown, Jens Palsberg
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf


3

Sorun, Coq ve Isabelle / HOL gibi ispat yardımcılarının varlığında belirlenir. HOAS kısaltması altında gider . Λ-Prolog etrafında yeni ifier niceleyici aracılığıyla bu tür şeylerin yapılabileceği iddiası var. Ancak bu iddiayı henüz anlamadım. Sanırım şu ana kadar elde ettiğim temel içgörü kesin bir yaklaşım olmadığı, birkaç olası yaklaşım olduğu.

Henüz bitmemiş olan kendi almam, Paulson'un Gödels'in eksikliğini kanıtlamak üzerine yaptığı son bir yazıdan ilham aldı . Nesne düzeyi bağlayıcıları, meta düzey adları olan bazı veri yapılarıyla bağlantılı olarak kullanırdım. Temel olarak OP’den olan ve bağımlı tiplerle ilgilendiğim için Church kodlaması ile benzer ancak ayrı bir veri yapısı

datatype Expr = var Name                 /* written as n */
              | app Expr Expr            /* written as s t */
              | abs Name Expr Expr       /* written as λn:s.t */

Meta seviye ifadeleri, n, m, .. etc .. değişken adlarını kullandığımız nesne seviyesindeki ifadelerden ayırt edilebilir. Oysa nesne düzeyinde x, y, .. etc .. değişken isimlerini kullanıyoruz. Nesne mantığındaki meta terimin yorumlanması aşağıdaki şekilde çalışır. [T] σ işaretini, t nesnesini vermesi gereken, σ nominal bağlamında yorumlamak için yazalım. O zaman olurdu:

 [n]σ = lookup σ n
 [s t]σ = [s]σ [t]σ
 [λn:s.t]σ = λx:[s]σ.[t]σ,n:x

Yukarıdakiler OP'nin bir EVAL işlevi olarak adlandırdığı şeyi tanımlar. Paulson için küçük bir fark, σ sadece sonlu bir listedir ve işlevsel değildir. Benim düşünceme göre sadece bir EVAL işlevini tanıtmak mümkün olacaktır, bir REFLECT işlevi değil. Nesne seviyesinde bazı eşitliklere sahip olabilirsiniz, böylece farklı lambda ifadeleri aynı olur. Yapmanız gereken, eval'ü ihtiyaç duyduğunuz takdirde muhtemelen yansıma hakkında da akıl yürütmek için kullanmak olacaktır.

Eğer duvarı nominal ile nominal olmayan arasında yıkmak istiyorsanız, hiçbir şeyin genişletilmediği Prolog gibi uç noktalara gitmeniz gerekir. Ancak λ-Prolog sistemi örneğinin gösterdiği gibi, yüksek dereceli durumda, örneğin ∇ niceleyici gibi yeni araçlar getirerek yalnızca mantıksal olarak üstesinden gelinebilecek ilave problemler vardır!

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.