From ae801c4f04234d70cd39cb1aa68963d626947b70 Mon Sep 17 00:00:00 2001
From: Ramakrishnan Muthukrishnan <vu3rdd@gmail.com>
Date: Sat, 10 Jul 2010 11:08:48 +0530
Subject: [PATCH] some additional notes and code on addition with church
 numerals

---
 src/sicp/ex2_6.clj | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/sicp/ex2_6.clj b/src/sicp/ex2_6.clj
index 39fae1e..ce06f90 100644
--- a/src/sicp/ex2_6.clj
+++ b/src/sicp/ex2_6.clj
@@ -44,6 +44,17 @@
 ;; similarly the other examples.
 
 ;; Definition of an add operator
+;; To do m + n, we should have a function which is applied f, n+m times.
+;;
+;; i.e.
+;;
+;; (m f) = takes a function f and composes a new function which composes
+;; f, m times and applies this new function to x.
+;; 
+;; (lambda (f) (lambda (x) ((m f) ((n f) x)))) will create this new
+;; function which compose a given function n+m times and hence is equiv
+;; to addition of m+n. Some simple repl experiments seem to verify the
+;; result.
 (defn add [m n]
   (fn [f] (fn [x]
 	    ((m f) ((n f) x)))))
@@ -52,6 +63,12 @@
 (((add one two) inc) 1)
 ;;=> 4  
 )
+
+;; another definition of add is this:
+;; m + n == (m + [1 + 1 + 1 + ... ]
+(defn new-add [m n]
+  ((m add-1) n))
+
 ;; 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.
@@ -67,4 +84,22 @@
 (deftest test-church-to-numeral
   (are [x y] [= x y]
        (church-to-numeral one) 1
-       (church-to-numeral two) 2))
\ No newline at end of file
+       (church-to-numeral two) 2))
+
+;; church to roman: func to integer
+(defn church-to-roman [f]
+  ((f (fn [x] (+ x 1))) 0))
+
+;; integer to func
+(defn roman-to-church [n]
+  (fn [f] (fn [x] (first (drop n (take (inc n) (iterate f x)))))))
+
+(defn church [n]
+  (loop [n n cf (fn [f] (fn [x] x))]
+    (if (zero? n)
+      cf
+      (recur (- n 1) (fn [f] (fn [x]
+			       (f ((cf f) x))))))))
+
+(defn unchurch [f]
+  ((f (fn [x] (+ x 1))) 0))
\ No newline at end of file
-- 
2.45.2