(define goal? S -> (= (sum S) 27)) (define f S -> (remove-if-no-good [[2 | S] [7 | S] [9 | S]])) (define remove-if-no-good Ss -> (remove-if* (/. X (> (sum X) 27)) Ss)) (define remove-if* _ [] -> [] F [X | Y] -> (remove-if F Y) where (F X) F [X | Y] -> [X | (remove-if F Y)]) (define return-n 10 <- (fail) 10 -> 9 N -> N) (define return-n N <- (fail-if (/. X (> X 45)) N)) (define depth State F G? -> (depth-help [State] F G?)) (define depth-help [State | _] _ G? -> State where (G? State) [State | _] F G? <- (depth-help (F State) F G?) [_ | States] F G? -> (depth-help States F G? ) _ _ _ -> (fail)) (depth [] (fn f) (fn goal?))