計算機プログラムの構造と解釈 第二版 P52 問題2.4

おれ、がんばる。

  • (car (cons x y))がxを生じることを証明。
  • これに対するcdrの定義


証明ってどうスリゃいいかな。
具体的におっていけばいいのかな?


こんな感じかな?

;;0
(define (cons x y)
  (lambda (m) (m x y)))

;;1
(define g (cons 1 2))


;;2
(define (g f)
  (f 1 2)))


上の、1と2のgは等価です。
pの共通した性質は、ある手続きfを引数としてとって作用させる手続きだということ。
んだもんで、

;;3
(define (car z)
  (z (lambda (p q) p)))

;;4
(car g)

;;5
(define (f2 p q)
  p)

;;6
(g f2)

;;7
(f2 1 2)


んで、4のなかでは、5踏まえて考えると、6を行っている。
んで、6を置き換えると7だから、そうすると、値「1」出るよね。


そんで、cdrの実装は別に迷う必要もないと思うので。。んで、cdrの実装は以下へ。

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(define (cons x y)
  (lambda (m) (m x y)))


(define (car z)
  (z (lambda (p q) p)))


(define (cdr z)
  (z (lambda (p q) q)))


(define p (cons 2 3)) 



;; main
(define (main args)

  (display "あらかじめ、(define p (cons 2 3))を実行しておく")(newline)

  (display "(car p): ")
  (display (car p)) 
  (newline)

  (display "(cdr p): ")
  (display (cdr p)) 

  (newline)
0)


実行

あらかじめ、(define p (cons 2 3))を実行しておく
(car p): 2
(cdr p): 3


なんか置き換えの証明って難しいな。