Sebagian besar tutorial tentang Lambda Calculus memberikan contoh di mana Integer Positif dan Boolean dapat diwakili oleh Fungsi. Bagaimana dengan -1 dan saya?
Sebagian besar tutorial tentang Lambda Calculus memberikan contoh di mana Integer Positif dan Boolean dapat diwakili oleh Fungsi. Bagaimana dengan -1 dan saya?
Pertama mengkodekan bilangan dan pasangan alami, seperti yang dijelaskan oleh jmad.
Mewakili integer sebagai pasangan bilangan asli sedemikian rupa sehingga . Kemudian Anda dapat mendefinisikan operasi pada integer sebagai (menggunakan notasi Haskell untuk -calculus):( a , b ) k = a - b λ
neg = \k -> (snd k, fst k)
add = \k m -> (fst k + fst m, snd k + snd m)
sub = \k m -> add k (neg m)
mul = \k m -> (fst k * fst m + snd k * snd m, fst k * snd m + snd k * fst m)
Kasus bilangan kompleks serupa dalam arti bahwa bilangan kompleks dikodekan sebagai pasangan real. Tetapi pertanyaan yang lebih rumit adalah bagaimana menyandikan real. Di sini Anda harus melakukan lebih banyak pekerjaan:
Pengkodean real adalah banyak pekerjaan dan Anda tidak ingin benar-benar melakukannya dalam -kalkulus. Tetapi lihat misalnya subdirektori Marshall untuk implementasi sederhana real di Haskell murni. Ini pada prinsipnya dapat diterjemahkan ke dalam λ -calculus murni .etc/haskell
i:ℤ
,x:a
,f,u,s:a→a
,p:(a→a,a→a)
] Jika Anda menyandikan ℤ sebagai(Sign,ℕ)
kemudian, diberi sepasang fungsi(s,f)
sebagaip
, istilahλi.λp.λx.(fst i) (fst p) id ((snd i) (snd p) x)
akan menghasilkan baikf(…f(x)…)
ataus(f(…f(x)…))
(jika hasilnya negatif). Jika Anda menyandikan ℤ as(ℕ,ℕ)
, Anda memerlukan fungsi yang memiliki invers - diberi pasangan(f,u)
danx
, fungsiλi.λp.λx.(snd i)(snd p)((fst i)(fst p) x)
akan menghasilkanu(…u(f(…f(x)…))…)
yang akan membiarkan waktu yangf
diterapkan . Keduanya bekerja dalam konteks yang berbeda (hasilnya dapat "dibalik" | | tidak dapat dibalik).i
x
f
fold . ctor
untuk setiap konstruktor dan tipe itufold
(r
). (Itulah sebabnya, untuk jenis rekursif, data akan "recurse sendiri" Untuk jenis non-rekursif itu lebih seperti.case
/ Pola pertandingan.)Lambda-calculus dapat menyandikan sebagian besar struktur data dan tipe dasar. Misalnya, Anda dapat menyandikan sepasang istilah yang ada dalam kalkulus lambda, menggunakan pengkodean Gereja yang sama yang biasanya Anda lihat untuk menyandikan bilangan bulat non-negatif dan boolean:
fst = λ hal . p ( λ x y . x ) snd = λ p . p ( λ x y . y )
Maka pasangan adalah p = ( pasangan a b ) dan jika Anda ingin mendapatkan kembali a dan b Anda dapat melakukan ( fst p ) dan ( snd p ) .( a , b ) p = ( pair a b ) Sebuah b ( Fst p ) ( snd p )
Itu berarti bahwa Anda dapat dengan mudah mewakili bilangan bulat positif dan negatif dengan pasangan: tanda di sebelah kiri dan nilai absolut di sebelah kanan. Tanda itu adalah boolean yang menentukan apakah angka itu positif. Hak adalah nomor alami menggunakan pengkodean Gereja.
Untuk mendefinisikan tambahan, Anda harus membandingkan dua bilangan asli dan menggunakan pengurangan ketika tanda-tanda berbeda, jadi ini bukan istilah λ tetapi Anda dapat menyesuaikannya jika Anda benar-benar ingin:
tetapi pengurangan itu sangat mudah untuk didefinisikan:
sumber