SICP Exercise 4.15 halts?

Exercise 4.15.  Given a one-argument procedure p and an object ap is said to ``halt'' on a if evaluating the expression (p a) returns a value (as opposed to terminating with an error message or running forever). Show that it is impossible to write a procedure halts? that correctly determines whether p halts on a for any procedure p and object a. Use the following reasoning: If you had such a procedure halts?, you could implement the following program:

(define (run-forever) (run-forever))

(define (try p)
  (if (halts? p p)
      (run-forever)
      'halted))

Now consider evaluating the expression (try try) and show that any possible outcome (either halting or running forever) violates the intended behavior of halts?.23

R E A S O N I N G

The following is a simple zero-argument procedure that runs forever:

(define (run-forever) (run-forever))

The following is a hypothetical procedure that checks if procedure p halts on input a:

(define (halts? p a)

(if <p halts on a>

true

false

)

)

Assuming that the "halts?" procedure above exists and works, we should be able to write 

another procedure:

(define (try p)

(if (halts? p p)

(run-forever)

'halted

)

)

The "try" procedure takes a procedure as its argument and checks if that procedure halts

on itself. If true, then try runs forever. If false, then try returns.

If p halts on itself, then try runs forever.

If p runs forever, then try halts on p.

So "try" behaves oppositely to the procedure supplied. 

Now if we evaluate (try try), then the logic would work like this:

If try halts on itself, try runs forever.

If try runs forever, try halts on itself.

In both cases, the behaviour of "try" violates the intended behavior of "halts?"

Comments

Popular posts from this blog

SICP Exercise 2.56 differentiation rule

SICP Exercise 1.28 (Miller-Rabin Test)

SICP Exercise 4.18 a alternative strategy for interpreting internal definitions