:PROPERTIES: :header-args: :noweb-ref sub-nat-nums :ID: little-schemer-chapter-four-part-2 :CREATED: [2020-12-02 Wed 20:46] :END: :LOGBOOK: - State "DONE" from "TODO" [2020-12-02 Wed 20:57] :END: How do we define subtraction in terms of =sub1=? Based on the content of this book so far, it's likely got something to do with recursion. Again, going from the solution to =o+= we can guess that we'll be asking a series of questions with =cond=, and that we'll start by checking for 0. We know that there'll be 2 arguments, =n= and =m=. We'll need to subtract =m= from =n=, and we'll need to stop when one of them hits =0=. This kinda tells us that both arguments are gonna need to be subtracted. If we were using real numbers, I'd be worried here because we only have =sub1= to work with, and negative numbers make that complex - but with natural numbers, subtracting both works just fine. We'll never have to deal with =6 - -3= or whatever. In essence, what we need to do here is =(sub1 n)= =m= times. Let's give that a go: #+NAME: o- #+BEGIN_SRC racket :lang racket (define o- (lambda (n m) (cond ((zero? m) n) (else (o- (sub1 n) (sub1 m)))))) (o- 14 3) (o- 17 9) #+END_SRC #+RESULTS: o- : 11 : 8 That seems to work pretty well. Looking at the definition in the book, there's the same pattern again - they define =o-= in the same way that I have, but the last line is : (else (sub1 (o- n (sub1 m)))) I'm a little concerned that I'm missing some point or other here, but it could be just that I think in a different way. I'm gonna leave it, and hope that it doesn't come back to bite me!