Memecahkan persamaan fungsional untuk fungsi yang tidak diketahui dalam kalkulus lambda

14

Apakah ada teknik untuk menyelesaikan persamaan fungsional untuk fungsi yang tidak diketahui dalam kalkulus lambda?

Misalkan saya memiliki fungsi identitas yang didefinisikan secara ekstensi sebagai:

Ix=x

(yaitu, dengan menuliskan persamaan untuk perilaku yang diharapkan dari fungsi itu) dan sekarang saya ingin menyelesaikannya untuk dengan melakukan beberapa transformasi aljabar untuk mendapatkan rumus intens untuk fungsi tersebut:I

I=λx.x

yang memberitahu bagaimana tepatnya fungsi melakukan apa yang diharapkan (yaitu, bagaimana mengimplementasikannya dalam kalkulus lambda).

Tentu saja fungsi identitas digunakan hanya sebagai contoh. Saya tertarik pada metode yang lebih umum untuk menyelesaikan persamaan tersebut. Secara khusus, saya ingin menemukan fungsi yang memenuhi persyaratan berikut:B

Bf(λx.M)=(λx.fM)

yaitu, "menyuntikkan" fungsi yang diberikan ke dalam fungsi lambda yang diberikan ( λ x . M ) sebelum "tubuh" M (yang merupakan ekspresi lambda sewenang-wenang), mungkin dengan mengambilnya terpisah dan membangun yang baru, sehingga menjadi parameter fungsi f diterapkan.f(λx.M)Mf

BarbaraKwarc
sumber

Jawaban:

13

Ini adalah masalah yang diketahui, dikenal sebagai Unifikasi Pesanan Tinggi .

Sayangnya, masalah ini secara umum tidak dapat ditentukan. Ada fragmen decidable, yang dikenal sebagai Fragmen Pola Miller. Ini digunakan secara luas dalam, antara lain, pemeriksaan ketik program dependen dengan metavariables atau pencocokan pola. Fragmen ini adalah tempat variabel unifikasi diterapkan hanya untuk variabel program terikat yang berbeda.

Makalah ini memberikan tutorial yang bagus tentang cara kerja unifikasi tingkat tinggi, dan berjalan melalui (relatif) implementasi sederhana itu.

Sayangnya, sepertinya fungsi Anda tidak termasuk dalam fragmen pola ini. Yang mengatakan, apa yang saya cari terlihat sangat mirip dengan komposisi fungsi. Apakah fungsi berikut memuaskan properti Anda?

B=λf g x .f (g x)

Kita punya:

  • B f (λx.M)
  • dengan α- equivalence=B f (λy.[y/x]M)α
  • =λx.f ((λy.[y/x]M)x)
  • =λx.f ([x/y][y/x]M)
  • =λx.f M
Ya ampun
sumber
1
Yup, sepertinya itu :) Lucunya, saya hampir mendapatkan solusi itu, tetapi dari beberapa alasan saya berpikir bahwa memanggil pada sesuatu akan "mengeksekusinya", mengacaukan ungkapan: q Yang saya lewatkan adalah bahwa kita dapat mengganti variabel dengan variabel lain yang terikat di luar. (λx.M)
BarbaraKwarc
1
Terima kasih atas tautannya ke surat kabar itu, saya akan memeriksanya, dan saya akan menerima jawaban Anda dalam beberapa hari untuk memberi orang lain kesempatan juga.
BarbaraKwarc
3
Apakah ini penyatuan pesanan lebih tinggi? Pertanyaannya tampaknya tentang kalkulus lambda yang tidak diketik daripada kalkulus lambda yang diketik sederhana.
Peter Taylor
2

Saya pikir saya punya jawaban parsial, mengenai persamaan dengan fungsi identitas:

Ix=x

Kami ingin menyelesaikannya dengan mencari formula untuk , yang akan berbentuk ( λ hal . M ) dengan beberapa ekspresi M yang belum diketahui sebagai tubuhnya. Mari gantikan dengan saya dalam persamaan asli:I(λp.M)MI

(λp.M)x=x

lalu terapkan fungsi ke di sebelah kiri:x

M[p/x]=x

Mpx

I=(λx.x)

yang tentu saja merupakan jawaban yang tepat :)


ω

ωω=ωω

ω(λx.M)M

(λx.M)ω=ωω

M

M[x/ω]=ωω

xMωωωMxx

ω=(λx.xx)

yang memang demikian :)


Tapi saya punya perasaan, bahwa itu bisa menjadi sangat mudah hanya karena sisi kanan sudah dalam bentuk yang kita cari.

BarbaraKwarc
sumber
M[x/ω]=ωωω=(λx.xx)
Dalam dua kasus sederhana ini - ya, ada: cukup membalikkan substitusi. Tapi seperti yang saya katakan, kasus-kasus ini mungkin bekerja dengan "keberuntungan" murni: bahwa sisi kanan sudah dalam bentuk yang diperlukan. Ketika saya mencobanya dengan beberapa contoh yang lebih kompleks, itu tidak berhasil. Tapi itu yang saya cari: untuk cara algoritmik.
BarbaraKwarc
1
ωω=ωωωω