Sortir daftar angka pada kalkulus λ


8

Tuliskan istilah pada kalkulus lambda murni yang tidak diketik, yang bila diterapkan pada daftar angka yang dikodekan oleh gereja , kembalikan dengan angka-angkanya yang diurutkan dalam urutan naik atau turun. Daftar dan nomor Gereja harus dikodekan sebagai lipatan untuk ADT mereka yang biasa:

-- Usual ADTs for Lists and Nats (in Haskell, for example)
data List a = Cons a (List a) | Nil
data Nat a  = Succ (Nat a) | Zero

-- Their respective folds are the λ-calculus representation used on this challenge
church_list = (λ c n . (c ... (c ... (c ... n))))
church_num  = (λ succ zero . (succ (succ (succ ... zero))))

Input contoh:

(λ cons nil .
    (cons (λ f x . (f x))                         -- 1
    (cons (λ f x . (f (f (f (f (f (f (f x)))))))) -- 7
    (cons (λ f x . (f (f x)))                     -- 2
    (cons (λ f x . (f (f (f x))))                 -- 3
    nil)))))

Contoh output:

(λ cons nil . 
    (cons (λ f x . (f x))                         -- 1
    (cons (λ f x . (f (f x)))                     -- 2
    (cons (λ f x . (f (f (f x))))                 -- 3
    (cons (λ f x . (f (f (f (f (f (f (f x)))))))) -- 7
    nil)))))

Skor pengiriman akan dihitung sebagai berikut:

score(x)    = 1
score(λx.t) = score(t) + 1
score(t s)  = score(t) + score(s) + 1

Skor terendah menang.


7
Halaman tertaut menyediakan tiga penyandian Gereja yang berbeda untuk daftar, dan tidak ada yang bisa menghentikannya untuk berubah di masa mendatang. Agar pertanyaan menjadi tidak ambigu, Anda perlu mendefinisikan pengkodean tertentu yang ada dalam pikiran Anda secara eksplisit dalam pertanyaan. (Juga disarankan untuk mendefinisikan penyandian angka).
Peter Taylor

1
urutan naik atau turun - mengapa kita harus memilih?
Lynn

Saya hanya tidak menemukan alasan untuk membatasi itu. Kenapa tidak?
MaiaVictor

Jawaban:


3

Saya telah berhasil mengalahkan nilai saya sendiri:

sort = λabcd.a(λef.f(λghi.g(λj.h(λkl.kj(ikl)))(hi))e(λgh.h))
       (λe.d)(λe.b(λf.e(f(λghi.hg)(λgh.cfh))))

Ada peringatan, meskipun - istilah ini harus menerima argumen tambahan dengan ukuran maksimum alami yang dipertimbangkan. Misalnya, sort 4 [1,7,3,6,5]akan kembali [1,3], mengabaikan apa pun di atas atau sama dengan 4. Tentu saja, Anda bisa memberikan infinity (yaitu, Y-combinator):

sort = λbcd.(λfx.f(x x))(λfx.f(x x))(λef.f(λghi.g(λj.h(λkl.kj(ikl)))
       (hi))e(λgh.h))(λe.d)(λe.b(λf.e(f(λghi.hg)(λgh.cfh))))

Dan itu akan mengurutkan daftar bilangan asli, tetapi istilah ini jelas tidak memiliki bentuk normal lagi.


1

121 karakter / skor 91

sort = λabc.a(λdefg.f(d(λhij.j(λkl.k(λmn.mhi)l)(h(λkl.l)i))
       (λhi.i(λjk.bd(jhk))(bd(h(λjk.j(λlm.m)k)c))))e)(λde.e)
       (λde.d(λfg.g)e)c

Itu dalam bentuk normal dan bisa dibuat lebih pendek dengan mengangkat subekspresi umum.


1

Berikut ini adalah implementasi dari jenis penyisipan:

let nil =       \f x.x in
let cons = \h t.\f x.f h (t f x) in
let 0 =       \f x.x in
let succ = \n.\f x.f (n f x) in
let None =    \a b.b in
let Some = \x.\a b.a x in
let pred = \n.n (\opt.opt (\m.Some(succ m)) (Some 0)) None in
let optpred = \opt.opt pred None in
let - = \m n.n optpred (Some m) in
let < = \m n.\trueval falseval.- m n (\diff.falseval) trueval in
let pair = \x y.\f.f x y in
let snd = \p.p (\x y.y) in
let insert = \n l.snd (l (\h recpair.recpair (\rawtail insertedtail.
  let rawlist = cons h rawtail in
    pair rawlist (< h n (cons h insertedtail) (cons n rawlist))))
  (pair nil (cons n nil))) in
\l.l insert nil

Di sini, pred nmengembalikan elemen option nat: pred 0is Nonesedangkan pred (n+1)is Some n. Kemudian, - m nmengembalikan elemen option natyang Some (m-n)jika m>=natau Nonejika m<n; dan < m nmengembalikan boolean. Akhirnya, insertmenggunakan fungsi internal mengembalikan pasangan di mana f l = (l, insert n l)(metode yang cukup khas untuk mendapatkan ekor daftar untuk diteruskan ke rekursi bersama dengan nilai rekursif).

Sekarang, beberapa catatan untuk masa kerja golf: sebenarnya nil, 0, Nonekebetulan fungsi yang sama secara formal (dan juga muncul dalam snd). Kemudian, saya pasti akan mempertimbangkan untuk melakukan reduksi beta pada letpernyataan (yang tentu saja merupakan gula sintaksis biasa di mana let a = x in yberarti (\a.y)xdan dengan demikian memiliki skor score(x) + score(y) + 2) untuk melihat dalam kasus mana hal itu akan mengurangi skor - yang pasti akan mengikat untuk binding yang hanya digunakan sekali.

Kemudian akan datang hal-hal rumit: misalnya, saya hanya melihat bahwa secara formal pred = pair (pair (\m.Some(succ m)) (Some 0)) None, optpred = pair pred None, - = \m.pair optpred (Some m), fungsi definisi semacam sebesar pair insert nil, dll yang dapat mengurangi skor sedikit.


Silakan hitung skor Anda dan sebutkan dalam jawaban
Nathaniel
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.