Sebuah quine dalam kalkulus lambda murni

13

Saya ingin contoh quine dalam kalkulus lambda murni . Saya cukup terkejut bahwa saya tidak dapat menemukannya dengan googling. Halaman quine mencantumkan quine untuk banyak bahasa "nyata", tetapi tidak untuk kalkulus lambda.

Tentu saja, ini berarti mendefinisikan apa yang saya maksudkan dengan quine dalam kalkulus lambda, yang saya lakukan di bawah ini. (Saya meminta sesuatu yang sangat spesifik.)

Di beberapa tempat, misalnya Larkin dan Stocks (2004), saya melihat yang berikut ini dikutip sebagai ekspresi "replikasi diri": (λx.xx)(λx.xx) . Ini berkurang pada dirinya sendiri setelah satu langkah pengurangan beta, memberikannya perasaan seperti quine. Namun, ini tidak seperti quine karena tidak berhenti: pengurangan beta lebih lanjut akan terus menghasilkan ekspresi yang sama, sehingga tidak akan pernah berkurang ke bentuk normal. Bagi saya quine adalah program yang mengakhiri dan mengeluarkan sendiri, jadi saya ingin ekspresi lambda dengan properti itu.

Tentu saja, setiap ekspresi yang tidak mengandung redex sudah dalam bentuk normal, dan karena itu akan berakhir dan dihasilkan sendiri. Tapi itu terlalu sepele. Jadi saya mengusulkan definisi berikut dengan harapan akan menerima solusi yang tidak sepele:

Definisi (tentatif): Sebuah quine dalam kalkulus lambda adalah ekspresi dari bentuk

(λx.A)
(di mana A adalah singkatan dari beberapa ekspresi kalkulus lambda tertentu) sedemikian rupa sehingga ((λx.A)y) menjadi(λx.A) , atau sesuatu yang setara dengan itu di bawah perubahan nama variabel, ketika direduksi menjadi bentuk normal, untuksetiapinputy .

Mengingat bahwa kalkulus lambda adalah setara dengan Turing seperti bahasa lain, sepertinya ini mungkin, tetapi kalkulus lambda saya berkarat, jadi saya tidak bisa memikirkan contohnya.

Referensi

James Larkin dan Phil Stocks. (2004) "Ekspresi mereplikasi diri dalam Kalkulus Lambda" Konferensi dalam Penelitian dan Praktek dalam Teknologi Informasi, 26 (1), 167-173. http://epublications.bond.edu.au/infotech_pubs/158

Nathaniel
sumber
Bukan jawaban untuk pertanyaan saya, tetapi untuk referensi saya di masa depan (dan untuk pengunjung masa depan) akan bermanfaat untuk memiliki tautan ke wiki.haskell.org/Combinatory_logic , di mana seseorang memiliki pemikiran yang lebih dalam tentang quine daripada saya.
Nathaniel
Perhatikan bahwa quine perlu menghasilkan kode sumbernya sendiri . Memproduksi fungsi yang diwakilinya tidak cukup.
PyRulez
@PyRulez apa kode sumber untuk ekspresi lambda? Jika itu adalah urutan karakter maka tidak mungkin ekspresi lambda menghasilkannya, dan akibatnya kita dapat mendefinisikan kata "quine" untuk mengartikan sesuatu yang sedikit berbeda untuk ekspresi lambda tanpa takut ambiguitas. Di sisi lain, jika Anda menganggap kode sumber sebagai ekspresi lambda itu sendiri maka "kode sumber" dan "fungsi yang diwakilinya" adalah hal yang sama. Jadi saya pikir saya baik-baik saja di sini.
Nathaniel
ada penyandian gereja untuk string. Sebuah kalkulus kalkulus lambda harus menampilkan pengkodean gereja dari string karakter yang mewakilinya.
PyRulez
Tentu, itu tidak sulit dilakukan, jika Anda mendefinisikannya seperti itu. Pertanyaan ini tentang hal yang berbeda.
Nathaniel

Jawaban:

8

Anda ingin istilah sedemikian rupa sehingga M Λ :QMΛ

QMβQ

Saya tidak akan menentukan batasan lebih lanjut pada (misalnya mengenai bentuknya dan apakah itu normalisasi) dan saya akan menunjukkan kepada Anda bahwa itu pasti harus non-normalisasi.Q

  1. Asumsikan adalah dalam bentuk normal. Pilih M x (kita dapat melakukannya karena teorema perlu dipegang untuk semua M ). Lalu ada tiga kasus.QMxM

    • adalah beberapa atom a . Kemudian Q M a x . Ini tidak dapat direduksi menjadi a .QaQMaxa
    • Q adalah beberapa aplikasi . Kemudian Q M ( R S ) x . ( R S ) adalah bentuk normal dengan hipotesis, jadi ( R S ) x juga dalam bentuk normal dan tidak dapat direduksi menjadi ( R S ) .(RS)QM(RS)x(RS)(RS)x(RS)
    • adalah beberapa abstraksi ( λ x . A ) (jika x seharusnya gratis di A , maka untuk kesederhanaan kita bisa memilih MQ(λx.A)xAM setara dengan variabel apa pun abstrak di atas). Kemudian Q M ( λ x . A ) x ß A [ x / x ] A . Karena ( λ x . A ) dalam bentuk normal, maka A jugaλQM(λx.A)xβA[x/x]A(λx.A)A. Akibatnya kita tidak bisa mengurangi ke ( λ x . A ) .A(λx.A)

    Jadi jika seperti itu ada, tidak mungkin dalam bentuk normal.Q

  2. Untuk kelengkapan, misalkan Q memiliki bentuk normal, tetapi tidak dalam bentuk normal (mungkin itu adalah normalisasi lemah), yaitu dengan N Q sehingga M Λ : Q M ß Q ß NNβ-nfNQMΛ

    QMβQβN

    Maka dengan juga harus ada urutan reduksi Q x β N x β N , karena:MxQxβNxβN

    • dimungkinkan oleh fakta bahwa Q ß N .QxβNxQβN
    • harus dinormalisasi karena N adalah β- nf dan x hanya atom.NxNβx
    • Jika dinormalisasi ke hal lain selain N , maka Q x memiliki dua β- nfs, yang tidak mungkin oleh akibat wajar dari teorema Gereja-Rosser. (Teorema Church-Rosser pada dasarnya menyatakan bahwa reduksi adalah pertemuan, seperti yang mungkin sudah Anda ketahui.)NxNQxβ

    Tetapi perhatikan bahwa tidak dimungkinkan oleh argumen (1) di atas, jadi asumsi kami bahwa Q memiliki bentuk normal tidak dapat dipertahankan.NxβNQ

  3. Jika kita mengizinkan seperti itu , maka, kami yakin itu harus non-normalisasi. Dalam hal ini kita bisa menggunakan kombinator yang menghilangkan argumen apa pun yang diterimanya. Saran Denis bekerja dengan baik: Q ( λ z . ( Λ x . Λ zQ Kemudian hanya dalam duapengurangan β : Q M

    Q(λz.(λx.λz.(xx))(λx.λz.(xx)))
    β
    QM(λz.(λx.λz.(xx))(λx.λz.(xx)))M1β(λx.λz.(xx))(λx.λz.(xx))1β(λz.((λx.λz.(xx))(λx.λz.(xx)))Q

Hasil ini tidak terlalu mengejutkan, karena Anda pada dasarnya meminta istilah yang menghilangkan argumen apa pun yang diterimanya, dan ini adalah sesuatu yang sering saya lihat disebutkan sebagai aplikasi langsung dari teorema titik tetap.

Roy O.
sumber
Jika saya dapat menerima jawaban Denis juga maka saya akan melakukannya, tetapi (setelah saya belajar sedikit lebih banyak dan dapat memahaminya sepenuhnya) jawaban inilah yang benar-benar meyakinkan saya bahwa "kombinator quine" ini tidak dapat dilaksanakan oleh seorang ekspresi lambda dalam bentuk normal.
Nathaniel
9

Di satu sisi ini tidak mungkin, karena quine seharusnya mengeluarkan kodenya sendiri, dan kalkulus lambda murni tidak memiliki sarana untuk melakukan keluaran.

Di sisi lain, jika Anda menganggap bahwa istilah yang dihasilkan adalah output, maka setiap bentuk normal adalah quine.

Misalnya, istilah lambda sudah merupakan bentuk normal, kemudian dengan asumsi bahwa outputnya adalah bentuk normal yang dihasilkan, outputnya adalah ( λ(λx.x) . Jadi ( λ x . X ) adalah quine.(λx.x)(λx.x)

Dave Clarke
sumber
2
Itu poin yang menarik. Dalam pertanyaan saya mencoba memberikan definisi tentang apa yang mungkin dianggap sebagai quine non-sepele dalam kalkulus lambda: fungsi yang, ketika diterapkan pada input apa pun, pengurangan beta pada dirinya sendiri (hingga penggantian nama variabel). Mungkin ini tidak mungkin, tetapi tidak jelas, setidaknya bagi saya.
Nathaniel
8

Berikut ini proposisi:

Kami memilih untuk menjadi titik fokus fungsi f = λ t .A .f=λt.(λz.t)

Ini dapat dilakukan dengan menggunakan fixpoint combinator , dan pengaturan A = Y f = ( λ x . λ z . ( x x ) ) ( λ xY=λg.((λx.g (x x)) (λx.g (x x))) .A=Yf=(λx.λz.(x x)) (λx.λz.(x x))

Sekarang kami menunjukkan bahwa adalah quine. Memang A tereduksi menjadi λ z . A , jadi itu berarti bahwa untuk setiap y , ( λ z . A ) y β A β ( λ zAAλz.Ay .(λz.A)yβAβ(λz.A)

Denis
sumber
Ini cukup rapi, dan menjawab pertanyaan ketika saya menanyakannya, jadi saya merasa tidak enak karena tidak menerimanya --- tapi sayangnya saya membuat sedikit kesalahan dalam menentukan apa yang saya inginkan. Saya sebenarnya ingin menjadi ( λ z . A ) ketika direduksi menjadi bentuk normal, bukan hanya setelah langkah reduksi beta. (Lihat pertanyaan terbaru untuk alasannya.) Ini berarti bahwa A tidak dapat memuat redeks apa pun, karena jika ya maka reduksi tidak akan berakhir. (λz.A)y(λz.A)A
Nathaniel
1
Ah dalam hal ini saya cukup yakin itu tidak mungkin, karena intuisi berikut (bukan bukti tapi hampir): Anda ingin memainkan peran karena harus bekerja untuk setiap y , sehingga y tidak harus bebas di A . Kemudian ( λ z . A ) y hanya mengurangi ke A . Sekarang Anda ingin A dikurangi menjadi λ z . A . Ungkapan terakhir ini tidak bisa menjadi bentuk normal, karena A di dalam lagi dapat dikurangi ...yyyA(λz.A)yAAλz.AA
Denis
1
Perilaku ini tidak terlalu mengejutkan, karena sejak "pencetakan" lagi instruksi, quine yang mencetak kode sendiri selalu dapat dieksekusi. Apa yang Anda minta mirip dengan meminta quine sehingga jika Anda mengeksekusi output, tidak mencetak apa-apa (yang tidak mungkin menurut definisi). λcalculus
Denis
Ahh, tentu saja kau benar. Saya seharusnya melihat itu. Saya tidak yakin apakah akan menerima jawaban Anda atau mengedit pertanyaan untuk meminta definisi yang lebih baik. Saya akan memberikan sedikit pemikiran. (Menurut saya masih mungkin untuk memberikan definisi non-sepele di mana Anda meminta sesuatu yang akan berakhir, tetapi saya tidak yakin caranya.)
Nathaniel
zzAAif z==p then return q, otherwise return q