Memprogram bahasa dengan fungsi kanonik

29

Apakah ada bahasa pemrograman (fungsional?) Di mana semua fungsi memiliki bentuk kanonik? Yaitu, setiap dua fungsi yang mengembalikan nilai yang sama untuk semua rangkaian input direpresentasikan dengan cara yang sama, misalnya jika f (x) mengembalikan x + 1, dan g (x) mengembalikan x + 2, maka f (f (x) )) dan g (x) akan menghasilkan executable yang tidak bisa dibedakan ketika program dikompilasi.

Mungkin yang lebih penting, di mana / bagaimana saya dapat menemukan lebih banyak informasi tentang representasi kanonik program (Googling "program representasi kanonik" kurang bermanfaat)? Sepertinya pertanyaan alami untuk ditanyakan, dan saya khawatir saya tidak tahu istilah yang tepat untuk apa yang saya cari. Saya ingin tahu apakah mungkin untuk bahasa seperti itu menjadi Turing lengkap, dan jika tidak, seberapa ekspresif bahasa pemrograman yang Anda miliki, sambil tetap mempertahankan properti seperti itu.

Latar belakang saya agak terbatas, jadi saya lebih suka sumber dengan prasyarat lebih sedikit, tetapi referensi ke sumber yang lebih maju mungkin keren juga, karena dengan begitu saya akan tahu apa yang ingin saya kerjakan.

math4tots
sumber

Jawaban:

38

Sejauh mana hal ini dimungkinkan sebenarnya merupakan pertanyaan terbuka utama dalam teori kalkulus lambda. Berikut ringkasan singkat dari apa yang diketahui:

  • Kalkulus lambda yang diketik sederhana dengan unit, produk, dan ruang fungsi memang memiliki properti bentuk kanonik sederhana. Dua istilah sama jika dan hanya jika mereka memiliki bentuk beta-normal, eta-panjang yang sama. Menghitung bentuk-bentuk normal ini juga cukup mudah.

  • Penambahan tipe penjumlahan sangat memperumit masalah. Masalah kesetaraan masih dapat diputuskan (kata kunci untuk mencari adalah "kesetaraan coproduct"), tetapi algoritma yang dikenal bekerja untuk alasan yang sangat rumit dan setahu saya tidak ada teorema bentuk normal yang sepenuhnya memuaskan. Inilah empat pendekatan yang saya tahu:

  • Penambahan tipe yang tidak terikat, seperti bilangan asli, membuat masalah tidak dapat diputuskan. Pada dasarnya, Anda sekarang dapat menyandikan masalah kesepuluh Hilbert.

  • Penambahan rekursi membuat masalah tidak dapat diputuskan, karena memiliki bentuk normal membuat kesetaraan dapat diputuskan, dan itu akan memungkinkan Anda memecahkan masalah penghentian.

Neel Krishnaswami
sumber
Makalah ini memperluas ekuivalensi dengan coproducts ke ekuivalensi dengan jumlah tetapi tidak ada sintaks bentuk kanon "tunggal", Anda memilih "fungsi saturasi" yang cukup pintar untuk mendeteksi ketika dua istilah yang Anda bandingkan memiliki subterms yang terbukti salah. Ini paling mirip dengan Ahmed-Licata-Harper karena keduanya menggunakan fokus.
Maks Baru
Dengan hanya unit, produk, dan fungsi, kardinalitas apa pun yang dapat Anda tuliskan adalah 1, sedangkan jika Anda menambahkan jumlah, Anda tiba-tiba mendapatkan banyak kardinalitas berbeda (dan dapat melakukan "perhitungan yang berguna"). Apakah fakta-fakta ini terkait?
glaebhoerl
1
bλx:b.λy:b.xλx:b.λy:b.y