Calculus of Constructions: kompres ekspresi ke bentuk terkecilnya


11

Saya sadar bahwa Kalkulus Konstruksi sangat normal, artinya setiap ekspresi memiliki normal untuk itu tidak boleh beta, dikurangi eta lebih lanjut. Jadi sebenarnya ini adalah ekspresi paling efisien yang menghitung nilai yang sama dengan ekspresi asli.

Tetapi dalam kasus-kasus tertentu, normalisasi dapat mengurangi ekspresi kecil menjadi ekspresi besar (dalam hal ukuran).

Apakah ada bentuk ekspresi terkecil? Formulir yang menghitung nilai yang sama dengan ukuran terkecil.

Dengan kata lain, alih-alih bentuk normal yang hemat waktu, bentuk yang efisien-ruang.

Jawaban:


8

Ada sedikit kebebasan dalam apa yang kami anggap "nilai yang sama". Biarkan saya menunjukkan bahwa tidak ada algoritma seperti itu jika "nilai yang sama" berarti "setara dengan pengamatan". Saya akan menggunakan sebagian dari kalkulus konstruksi, yaitu Sistem T Gödel (cukup ketik kalkulus, bilangan alami, dan rekursi primitif pada mereka), sehingga argumen berlaku untuk kalkulus yang jauh lebih lemah.λ

Diberi nomor , biarkan menjadi sesuai angka yang mewakili itu, yaitu, n aplikasi dari s u c c ke 0 . Diberikan Turing mahcine M , misalkan M adalah angka yang mengkode M dengan cara yang masuk akal.¯ nnn¯nsucc0MMM

Katakan bahwa dua istilah tertutup adalah sama , ditulis t u , ketika untuk semua n N , tt,u:natnattunN danstn¯ baik menormalkan ke angka yang sama (mereka menormalkan ke angka karena kita berada dalam claculus sangat normalisasi).sn¯

Misalkan kita memiliki suatu algoritma, yang memberikan istilah tertutup tipe menghitung istilah ekuivalen minimal. Kemudian kita bisa menyelesaikan oracle Hentikan sebagai berikut.natnat

Ada istilah seperti itu, untuk semua n N dan semua mesin Turing M , S ( M , ¯ n ) menormalkan ke ¯ 1 jika T perhentian dalam n langkah , dan menormalkan untuk ¯ 0 sebaliknya. Ini sudah dikenal, karena simulasi mesin Turing untuk sejumlah langkah n adalah primitif rekursif.S:nat×natnatnNMS(M,n¯)1¯Tn0¯n

Ada finitely banyak istilah tertutup yang istilah minimal setara dengan λ x : n a t .Z1,,Zk . Algoritma minimisasi kami mengembalikan salah satunya ketika kami memberikannya λ x : n a t .λx:nat.0 , dan bahkan mungkin demikian halnya bahwa λ x : n a t .λx:nat.0 sebenarnya satu-satunya istilah minimal tersebut. Semua ini tidak masalah, satu-satunya hal yang penting adalah bahwa ada banyak istilah minimal yang setara dengan λ x : n a t .λx:nat.0 .λx:nat.0

Sekarang, mengingat mesin apa pun , pertimbangkan istilah u : = λ x : n a t .M Jika M berjalan selamanya maka u ¯ n menormalkan ke ¯ 0 untuk setiap n dan setara dengan λ x : n a t .

u:=λx:nat.S(M,x)
Mun¯0¯n . Untuk memutuskan apakah M berjalan selamanya, kami makan u ke dalam algoritma minimzation kami dan cek apakah algoritma kembali salah satu dari Z 1 , ... , Z k . Jika ya, maka M berjalan selamanya. Jika tidak, maka berhenti. (Catatan: algoritma tidak perlu menghitung Z 1 , ... , Z k dengan sendirinya, ini bisa sulit-kode ke algoritma.)λx:nat.0MuZ1,,ZkMZ1,,Zk

Akan menyenangkan untuk mengetahui argumen yang bekerja dengan gagasan kesetaraan yang lebih lemah, misalnya hanya -reducibility.β


Bagaimana Anda menghitung Z1, .. Zk?
user47376

Anda tidak harus melakukannya. Yaitu, algoritma yang saya gambarkan ada di luar sana, dan kami tidak tahu persis apa itu, tetapi itu tidak relevan. Saya sebenarnya tidak mencoba menjalankan algoritma, saya hanya perlu keberadaannya untuk menunjukkan bahwa algoritma Anda tidak ada.
Andrej Bauer

Ya, tetapi argumen Anda mengatakan bahwa jika algoritme saya ada, kami dapat menyelesaikan masalah penghentian. Untuk menentukan apakah mesin turing M menghentikan algoritme Anda, Anda akan menormalkan dan memeriksa apakah itu salah satu dari Z1, .. Zk. Jadi itu harus bisa menyebutkan itu, kalau tidak, mungkin tidak berhenti.
user47376

The terprogram dalam algoritma, algoritma tidak perlu menghitung mereka dalam arti komputasi. Jika Anda lebih suka, kode sumber algoritma akan mulai dengan deklarasi integer k (misalnya direktif #define dalam C) dan array Z dengan panjang k , dan kemudian kode dapat dengan bebas menggunakan Z [ i ] , apa pun yang mereka adalah. Kita tidak perlu secara eksplisit mengenal mereka, kita hanya perlu tahu bahwa mereka ada. Z1,,ZkkZkZ[i]
Damiano Mazza

7

Seperti yang dikatakan Andrej, masalahnya tidak dapat diputuskan jika Anda mengizinkan penggantian satu istilah dengan yang lain, yang secara ekstensi sama. Namun, Anda mungkin akan tertarik dalam berbagi optimal ekspresi, dalam arti berikut: diberikan pengurangan jelas bahwa kejadian dari istilah u dapat dibagi dalam memori , dan setiap pengurangan yang diterapkan ke yang satu dapat diterapkan ke yang lain.

(λx:T.C x x) uβC u u
u

Dalam pengertian ini, diketahui cara mengurangi istilah yang tidak diketik secara optimal, mengurangi berbagi sebanyak mungkin. Ini dijelaskan di sini: /programming//a/41737550/2059388 dan kutipan yang relevan adalah J. Lamping's Algoritma untuk pengurangan kalkulus lambda yang optimal . Ada sedikit keraguan bahwa teorema untuk kalkulus yang tidak diketik dapat diperluas ke CIC.

Pertanyaan lain yang relevan adalah jumlah informasi jenis yang dapat dihapus ketika melakukan konversi jenis, atau memang bagaimana melakukan konversi yang efisien, yang merupakan bidang penelitian aktif, lihat misalnya tesis Mishra-Linger .


6

Biarkan saya bersikeras pada sudut pandang yang tersentuh oleh jawaban cody.

Sejauh yang melihatnya, pertanyaan tentang menemukan terkecil yang setara dengan term lain tidak benar-benar menarik, bahkan jika ada algoritma yang menghitungnya. Faktanya, sebagian besar program yang Anda tulis dalam λ -calculus (atau kalkulus apa pun dari λ -cube) sudah dalam bentuk normal, atau paling tidak menuju bentuk normal, sehingga mereka sudah pada "terkecil" dalam arti yang Anda gambarkan. Selain itu, menjadi "kecil" tidak berarti lebih efisien seperti yang dibahas dalam pertanyaan ini .λλλλ

Jadi masalah yang Anda tunjukkan (yang dinormalisasi meledak ukurannya) adalah masalah nyata hanya ketika Anda ingin menerapkan fungsi ke argumen, dan mengurangi ke bentuk normal untuk mendapatkan hasilnya. Misalnya, Anda memiliki istilah menghitung fungsi f pada string biner. Maka Anda memiliki MMf manal(|x|)adalah jumlah langkah reduksi menggunakan reduksi paling kiri, yang dijamin untuk menemukan bentuk normal jika ada (dalam CoC, selalu ada, tetapi apa yang saya katakan berlaku untuk kasus yang tidak diketik juga). Sekarang anggaplah, lebih jauh lagi, bahwal(n)=O(nk)untuk beberapa konstantak. Dapatkah Anda menyimpulkan bahwafadalah waktu polinomial yang dapat dihitung?

Mx¯l(|x|)f(x)¯
l(|x|)l(n)=O(nk)kf

Sangat mudah untuk membangun contoh-contoh -terms yang ukurannya meningkat secara eksponensial dengan pengurangan (paling kiri), yaitu, dalam langkah Θ ( n ) Anda mendapatkan istilah ukuran you ( 2 n ) . Hal ini dapat membuat kita sangat ragu-ragu dalam hal jawaban positif untuk pertanyaan di atas: tampaknya λ -kalkulus mampu melakukan sejumlah pekerjaan eksponensial dalam waktu linier. Dengan kata lain, tampaknya λ -calculus bukanlah model perhitungan yang masuk akal dalam hal kompleksitas.λΘ(n)Θ(2n)λλ

Meskipun sah, keraguan di atas berasal dari asumsi yang salah arah, yaitu bahwa -terms adalah representasi efisien dari diri mereka sendiri. Mereka tidak! Dengan sedikit bercanda, λ -terms adalah representasi yang sangat tidak efisien dari keadaan yang harus dijalankan oleh mesin yang mengeksekusinya.λλ

Ternyata ada sintaksis, yang disebut kalkulus dengan substitusi eksplisit linierλ dan diperkenalkan oleh Beniamino Accattoli, yang sangat baik dalam mewakili fenomena berbagi yang disinggung dalam jawaban cody. Secara khusus, sintaks ini dapat digunakan untuk memberikan representasi istilah yang sangat setia dari mesin abstrak dari segala jenis (lihat makalah Beniamino ICFP 2014 "Distilling Abstract Machines", yang saya penulis bersama. Saya meminta maaf untuk promosi diri tetapi sepertinya relevan sini).

Sintaks yang sama ini dapat digunakan untuk membuktikan bahwa, berlawanan dengan intuisi naif, jawaban untuk pertanyaan di atas adalah ya, memang: jumlah langkah paling kiri ke bentuk normal adalah ukuran biaya yang wajar, bahkan jika ukurannya meledak, karena sebenarnya ada cara lain untuk mewakili perhitungan yang sama (menggunakan substitusi eksplisit linier) di mana:

  1. ukurannya tidak meledak;
  2. λ

Ini semua dijelaskan dalam makalah Accattoli dan Dal Lago "Pengurangan Beta adalah Invariant, Memang" (LICS 2014 dan kemudian saya pikir ada versi jurnal yang lebih baru).

λ


Apa yang ada dalam pikiran saya adalah misalnya istilah yang melakukan sejuta langkah terungkap untuk menghasilkan daftar sejuta elemen. Ini menormalkan ke daftar aktual, yang merupakan representasi paling efisien dari nilai itu (ini adalah hasil akhir yang sebenarnya, tidak ada langkah lebih lanjut yang diperlukan). Tetapi istilah yang terungkap itu sendiri mungkin sangat kecil.
user47376

β

Ya, itu tidak mungkin seperti yang dikatakan Andrej. Itu menjawab pertanyaanku.
user47376
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.