Saya mencari kalkulus sederhana yang mendukung pemikiran tentang refleksi , yaitu introspeksi dan manipulasi program yang sedang berjalan.
Apakah ada ekstensi -calculus yang tidak diketik yang memungkinkan seseorang untuk mengkonversi -terms ke dalam bentuk yang dapat dimanipulasi secara sintaksis dan kemudian dievaluasi?λ
Saya membayangkan bahwa kalkulus memiliki dua istilah tambahan utama:
- : mengambil dan menghasilkan representasi dari bisa dikembangkan untuk manipulasi sintaksis.v
- : mengambil representasi sintaksis dari suatu istilah dan mengevaluasinya.
Untuk mendukung refleksi, diperlukan representasi sintaksis dari istilah-istilah. Itu akan terlihat seperti:
- akan direpresentasikan sebagai sebuah istilah , di mana adalah versi yang direfleksikan dari ,R ( e ) e
- akan direpresentasikan sebagai term , dan
- akan direpresentasikan sebagai .
Dengan representasi ini, pencocokan pola dapat digunakan untuk memanipulasi istilah.
Tapi kami mengalami masalah. dan perlu dikodekan sebagai istilah, seperti halnya pencocokan pola. Berurusan dengan ini tampaknya mudah, menambahkan , dan , tetapi apakah saya perlu menambahkan istilah lain untuk mendukung manipulasi ini?e v a l R E F L E C T E V A L M A T C H
Ada pilihan desain yang perlu dibuat. Apa yang harus dilakukan fungsi disinggung di atas dengan tubuh dan ? Haruskah mengubah tubuh atau tidak?r e f l e c t e v a l R ( - )
Karena saya tidak begitu tertarik untuk mempelajari refleksi itu sendiri - kalkulus akan berfungsi sebagai wahana untuk penelitian lain - saya tidak ingin menemukan kembali roda.
Adakah kalkuli yang ada yang cocok dengan yang baru saja saya jelaskan?
Sejauh yang saya tahu, kalkulus seperti MetaML, disarankan dalam komentar, berjalan jauh, tetapi mereka tidak termasuk kemampuan untuk pola pertandingan dan mendekonstruksi fragmen kode yang telah dibangun.
Satu hal yang ingin saya lakukan adalah sebagai berikut:
Dan kemudian lakukan pencocokan pola pada hasil untuk membangun ekspresi yang sama sekali berbeda.
Ini tentu saja bukan perpanjangan konservatif ke -kalkulus dan meta-teori cenderung jelek, tetapi ini adalah semacam titik untuk aplikasi saya. Saya ingin memecah λ -straksi terpisah.
sumber
Jawaban:
Jean Louis Krivine memperkenalkan kalkulus abstrak yang memperluas "Mesin Krivine" dengan cara yang sangat tidak sepele (perhatikan bahwa mesin Krivine sudah mendukung instruksi panggilan / cc dari lisp):
Dia memperkenalkan "quote" operator dalam artikel ini didefinisikan dengan cara berikut: jika adalah λ -istilah, catatan n φ citra φ oleh beberapa bijection π : Λ → N dari segi lambda untuk bilangan. Catatan ¯ n angka gereja yang sesuai dengan n ∈ N . Krivine mendefinisikan operator χ berdasarkan aturan evaluasi: χ ϕ → ϕ ¯ n ϕϕ λ nϕ ϕ π:Λ→N n¯¯¯ n∈N χ
Perhatikan bahwa Krivine terkenal sulit dibaca (tolong jangan marah jika Anda membaca ini, Jean-Louis!), Dan beberapa peneliti telah melakukan tindakan amal dengan mencoba mengekstraksi konten teknis dengan cara yang lebih mudah dibaca. Anda dapat mencoba melihat catatan ini oleh Christophe Raffali.
Semoga ini membantu!
Terjadi pada saya bahwa ada referensi lain yang mungkin relevan dengan minat Anda: Kalkulus Pola Murni oleh Jay dan Kesner memformalkan varian dari -kalkulus yang memperluas abstraksi sederhana atas variabel ke abstraksi atas suatu pola yang mewakili kalkulus pola diri. Ini sangat ekspresif dan khususnya memungkinkan seseorang untuk mendekonstruksi aplikasi itu sendiri: jika saya tidak salah, istilahnya:λ
berkurang menjadi . Sekali lagi, saya percaya bahwa ini lebih dari cukup untuk mengimplementasikan operator kutipan dan evaluasi .λx.x x
sumber
Melakukan hal itu sangat sulit, jika tidak mustahil, tanpa menyerah pada pertemuan. Artinya, saya curiga Anda benar tentang meta-teori berbulu. Di sisi lain, dimungkinkan untuk merancang kalkulus combinator yang dapat mengekspresikan semua fungsi yang dapat dihitung, dan yang memiliki kemampuan penuh untuk memeriksa persyaratannya: lihat Jay dan Give-Wilson .
Saya percaya bahwa memiliki kemampuan ini melakukan beberapa hal buruk pada teori persamaan Anda. Khususnya Anda akan cenderung hanya dapat membuktikan dua nilai yang sama jika nilai yang sama hingga kesetaraan alfa.
Saya belum membaca makalah Krivine yang ditautkan, tetapi saya harus mencatat bahwa dalam logika Klasik Anda pada dasarnya hanya memiliki dua hal: benar, dan salah. Semuanya setara dengan salah satunya. Artinya, Anda cenderung memiliki teori persamaan runtuh.
sumber
Dalam teori bahasa pemrograman fitur yang Anda bicarakan biasanya disebut sebagai "kutipan". Misalnya, John Longley menulis tentang itu di beberapa karyanya, lihat makalah ini .
Jika Anda hanya setelah pertimbangan teoritis (sebagai lawan dari implementasi yang benar-benar bermanfaat) maka Anda dapat menyederhanakan hal-hal dengan menyatakan bahwa
quote
(ataureflect
seperti yang Anda sebut) memetakan ke dalam tipe bilangan bulatnat
dengan mengembalikan kode Gödel dari argumennya. Anda kemudian dapat menguraikan angka seperti yang Anda lakukan pohon sintaksis abstrak. Selanjutnya, Anda tidak perlueval
karena itu dapat diimplementasikan dalam bahasa - itu pada dasarnya adalah juru bahasa.quote
Jika Anda memberi tahu saya apa yang Anda cari, saya mungkin bisa memberi Anda referensi yang lebih spesifik.
Omong-omong, ini adalah masalah terbuka:
quote
quote
quote
sumber
quote
Inilah jawaban alternatif, alih-alih menggunakan pendekatan nominal saya yang masih eksperimental ada beberapa pendekatan yang lebih mapan yang kembali ke koran:
LEAP: Bahasa dengan eval dan polimorfisme
Frank Pfenning dan Peter Lee
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf
Makalah ini dimulai dengan:
Harap dicatat bahwa LEAP jauh lebih kuat dari yang diinginkan OP. Pertama-tama itu diketik. Dan kedua meminta metacircularity, yang berarti misalnya eval dapat menjalankan definisi sendiri. Di Prolog Anda mendapatkan metacircularity untuk mengatasi / 1:
Jika Anda menambahkan klausa berikut untuk menyelesaikan / 1:
Dan jika Anda memastikannya bahwa klausa / 2 juga mengembalikan klausa penyelesaian / 1. Anda kemudian dapat memanggil resol (memecahkan (...)) dan melihat bagaimana memecahkan mengeksekusi sendiri.
Pertanyaan tentang keterwakilan diri masih memacu beberapa penelitian, lihat misalnya:
Representasi diri dalam Sistem
Girards U Matt Brown, Jens Palsberg
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf
sumber
Masalahnya diidentifikasi dalam berbagai asisten bukti seperti Coq dan Isabelle / HOL. Ini berjalan di bawah singkatan HOAS . Ada beberapa klaim di sekitar λ-Prolog bahwa melalui ∇ kuantifier baru hal-hal seperti itu dapat dilakukan. Tapi saya belum bisa memahami klaim ini. Saya kira wawasan utama yang saya dapatkan sejauh ini adalah bahwa tidak ada pendekatan yang pasti, ada beberapa pendekatan yang mungkin.
Pandangan saya sendiri, belum selesai , terinspirasi oleh sebuah makalah baru-baru ini oleh Paulson tentang pembuktian ketidaklengkapan Gödels. Saya akan menggunakan pengikat tingkat objek sehubungan dengan beberapa struktur data yang memiliki nama meta-level. Pada dasarnya struktur data yang serupa namun berbeda dengan yang ada di OP, dan dengan pengkodean Gereja karena saya tertarik pada tipe dependen:
Ekspresi level meta dapat dibedakan dari ekspresi level objek karena kita menggunakan nama variabel n, m, .. dll. Untuk menunjukkan nama. Sedangkan kita menggunakan nama variabel x, y, .. dll. Pada tingkat objek. Penafsiran istilah meta dalam logika objek kemudian bekerja sebagai berikut. Mari kita menulis [t] σ untuk interpretasi istilah nominal t dalam konteks nominal σ, yang harus memberikan istilah objek. Kami kemudian akan memiliki:
Di atas akan menentukan apa OP sebut fungsi EVAL. Perbedaan kecil dengan Paulson, σ hanya daftar terbatas dan bukan fungsional. Menurut pendapat saya hanya mungkin untuk memperkenalkan fungsi EVAL dan bukan fungsi REFLECT. Karena pada level objek Anda mungkin memiliki beberapa persamaan sehingga ekspresi lambda yang berbeda adalah sama. Yang harus Anda lakukan adalah menggunakan eval sebagai alasan, mungkin juga tentang refleksi jika Anda merasa perlu.
Anda harus pergi ke ekstrem seperti Prolog di mana tidak ada yang diperluas, jika Anda ingin meruntuhkan tembok antara nominal dan non-nominal. Tapi seperti contoh sistem λ-Prolog menunjukkan, dalam kasus tingkat tinggi ada memikat masalah tambahan yang misalnya hanya dapat diatasi dengan cara yang logis dengan memperkenalkan cara baru seperti ∇ kuantifier!
sumber