From 48c13604943a5d9a17f3c82843d4fa1ea285ef31 Mon Sep 17 00:00:00 2001 From: Ramakrishnan Muthukrishnan <vu3rdd@gmail.com> Date: Sat, 12 Jun 2010 16:11:24 +0530 Subject: [PATCH] solutions to 2.6. Truely mind bending! --- src/sicp/ex2_6.clj | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/sicp/ex2_6.clj diff --git a/src/sicp/ex2_6.clj b/src/sicp/ex2_6.clj new file mode 100644 index 0000000..6101e39 --- /dev/null +++ b/src/sicp/ex2_6.clj @@ -0,0 +1,62 @@ +(ns sicp.ex2_6 + (:use [sicp utils] + [clojure.test])) + +;; from the problem +(def zero + (fn [f] (fn [x] + x))) + +(defn add-1 [n] + (fn [f] (fn [x] + (f ((n f) x))))) + +(comment +(((add-1 zero) inc) 0) +;; => 1 +(((add-1 zero) inc) 1) +;; => 2 +) +;; the above examples should be read as follows: +;; (add-1 zero) returns the function which represents 1. +;; i.e. You apply inc once to 0 and that yields 1. +;; in the second example, we apply inc once to 1, and +;; that yields 2. This is just to convert Churl numeral +;; definition to roman numeral definition. + +;; as said in the hint, using substitution to evaluate (add-1 zero) +;; tells us that (add-1 zero) == one has one composition of (f x) +;; and (add-1 (add-1 zero)) == 1 is (f (f x)), so here is their formal +;; definition. +(def one (fn [f] (fn [x] (f x)))) + +(def two (fn [f] (fn [x] (f (f x))))) + +(comment +(((add-1 one) inc) 1) +;;=> 3 +(((add-1 one) inc) 2) +;;=> 4 +(((add-1 two) inc) 2) +;;=> 5 +) +;; (add-1 one) => two. Apply inc twice on 1 => 3 +;; similarly the other examples. + +;; Definition of an add operator +(defn add [m n] + (fn [f] (fn [x] + ((m f) ((n f) x))))) + +(comment +(((add one two) inc) 1) +;;=> 4 +) +;; continueing the same logic, (add one two) => three +;; and inc applied three times to 1 is 4. This proves +;; that our definition of add is correct. + +;; I used the wikipedia article to study Church Numerals: +;; <http://en.wikipedia.org/wiki/Church_encoding#Computation_with_Church_numerals> + +;; comments? \ No newline at end of file -- 2.45.2