Memahami fungsi Skema

Pertanyaan berikut diberikan dalam ujian praktik bahasa Pemrograman kami dan saya kesulitan memahami cara kerjanya. Bisakah seseorang memberi tahu saya apa aliran kodenya? Saya telah menjalankannya dengan raket dan tahu apa jawabannya. Sepertinya fungsi lambda pertama menggunakan dua fungsi lainnya sebagai argumen. Tapi ke mana input (lambda (x) 2) dan (lambda (y) 3) diteruskan?

(((lambda (x y) (x y)) (lambda (y) (lambda (y x) (x (x y)))) (lambda (x) (lambda (x y) (x (y x))))) (lambda (x) 2) (lambda (y) 3))

Jawaban dari pertanyaan tersebut adalah 3.


person danny    schedule 17.09.2016    source sumber


Jawaban (3)


Kita manusia suka memberi nama pada sesuatu. Notasi ringkas dengan nama pendek memudahkan manipulasi kode secara mental, karena begitu banyak kemampuan mental kita terikat pada sistem pengenalan visual paralel yang sangat besar:

(((lambda (x y) (x y))
  (lambda (y) (lambda (y x) (x (x y))))
  (lambda (x) (lambda (x y) (x (y x)))))
 (lambda (x) 2)
 (lambda (y) 3)) =>

((u               where u = (lambda (x y) (x y))
  f                     f = (lambda (y) (lambda (y x) (x (x y))))
  g)                    g = (lambda (x) (lambda (x y) (x (y x))))
 (lambda (x) 2)
 (lambda (y) 3)) =>

((u               where (u x y) = (x y)
  f                     (f y)   = \(y x) -> (x (x y))     ; (*)
  g)                    (g x)   = \(x y) -> (x (y x))
 (lambda (x) 2)
 (lambda (y) 3)) =>

((f               where (f g)   = \(y x) -> (x (x y))
  g)                    (g x)   = \(x y) -> (x (y x))
 (lambda (x) 2)
 (lambda (y) 3)) =>

(h                where h       = \(y x) -> (x (x y))
 p                      p       = \(x) -> 2
 q) =>                  q       = \(y) -> 3

(h                where (h y x) = (x (x y))
 p                      (p x)   = 2
 q) =>                  (q y)   = 3

(q (q p))         where (p x)   = 2
                        (q y)   = 3
    => 

(q 3)             where (q y)   = 3
    => 

3

Definisi (*) memiliki semua variabel terikat dalam ekspresi lambda (lambda (y x) (x (x y))) -- baik x maupun y. Argumen y di (f y) dengan demikian diabaikan. Ini akan direferensikan oleh variabel gratis y dalam ekspresi lambda, namun tidak ada.

person Will Ness    schedule 18.09.2016
comment
Terima kasih balasannya. Ini sangat membantu. Awalnya saya tidak memahaminya setelah googling sedikit dan membaca apa itu pengurangan alfa, beta, dan eta, saya bisa memahaminya. Terima kasih lagi :) - person danny; 19.09.2016
comment
@danny Sama-sama. Anda seharusnya mengatakan Anda tidak yakin tentang aturan dasarnya, saya akan menjelaskan sedikit tentang itu. - person Will Ness; 20.09.2016

Ini adalah pekerjaan untuk stepper aljabar!

Masukkan ini (tanpa baris #lang) di jendela interaksi DrRacket. Di pojok kiri bawah ubah bahasa menjadi "Siswa Menengah dengan Lambda". Sekarang klik tombol "Jalankan". Terakhir klik tombol "Stepper" (tombol paling kiri di sebelah kiri tombol run.

Anda sekarang dapat satu langkah melalui program ini (dan kembali lagi!).

(((lambda (x y) (x y))
  (lambda (y) (lambda (y x) (x (x y))))
  (lambda (x) (lambda (x y) (x (y x)))))
 (lambda (x) 2)
 (lambda (y) 3))

masukkan deskripsi gambar di sini

person soegaard    schedule 17.09.2016
comment
oke jadi ini sangat membantu. terima kasih! Jadi fungsi pertama mengambil argumen dari dua fungsi lainnya dan input (lambda (x) 2) dan (lambda (y) 3) diteruskan ke keduanya. Tapi yang saya tidak mengerti adalah skema itu tidak mengevaluasi fungsi (lambda (x) (lambda (x y) (x (y x)))) dan hanya mengembalikan nilai 3 dari yang pertama. Saya kira di sinilah saya membuat kesalahan ketika saya sedang menjalankan kode. Saya juga mengevaluasi fungsi ke-2. Jadi pertanyaan saya sekarang adalah mengapa tidak mengevaluasi fungsi ke-2? Terima kasih lagi. - person danny; 17.09.2016
comment
@danny (lambda (x) (lambda (x y) (x (y x)))) satu-satunya ekspresi di badan lambda adalah bentuk lambda, jadi ketika Anda menerapkannya, Anda dapat mengharapkan untuk mendapatkan kembali prosedur yang membutuhkan dua argumen. - person Sylwester; 17.09.2016

Tapi lalu ke manakah input (lambda (x) 2) dan (lambda (y) 3) diteruskan?

Untuk ini, menambahkan pernyataan println dapat membantu:

(((lambda (x y)
    (println "In Lxy fn")
    (x y))
  (lambda (y)
    (println "In Ly fn")
    (lambda (y x)
      (println "In Lyxi fn")
      (x (x y))))
  (lambda (x)
    (println "In Lx fn")
    (lambda (x y)
      (println "In Lxyi fn")
      (x (y x)))))
 (lambda (x) 2)
 (lambda (y) 3))

Keluaran:

"In Lxy fn"
"In Ly fn"
"In Lyxi fn"
3

Bagian dari fungsi ini berlebihan dan dapat dihapus tanpa mempengaruhi keluaran. Berikut ini, secara harfiah nilai apa pun dapat dimasukkan sebagai pengganti bagian yang dihapus:

(((lambda (x y)
    (println "In Lxy fn")
    (x y))
  (lambda (y)
    (println "In Ly fn")
    (lambda (y x)
      (println "In Lyxi fn")
      (x (x y))))
  ;(lambda (x)
  ;  (println "In Lx fn")
  ;  (lambda (x y)
  ;    (println "In Lxyi fn")
  ;    (x (y x))))
  "any value"
  )
 (lambda (x) 2)
 (lambda (y) 3)) 

Dalam format Anda sendiri, berikut ini menghasilkan keluaran yang sama seperti sebelumnya:

(((lambda (x y) (x y))
  (lambda (y) (lambda (y x) (x (x y))))
  ;(lambda (x) (lambda (x y) (x (y x))))
  "any value"
  )
 (lambda (x) 2)
 (lambda (y) 3))
person rnso    schedule 21.09.2016
comment
Koreksi saya jika saya salah. Menurut pemahaman saya, setelah melakukan semua pengurangan input (lambda (x) 2) dan (lambda (y) 3) diteruskan ke fn (lambda (y x) (x (x y)) - person danny; 23.09.2016