NB. Definitions used in the Algorithms Chapter sum_ones =: monad def 0 if. y. = 0 do. 0 else. 1 + sum_ones y. - 1 end. ) traced_sum_ones =: monad def 0 entering y. if. y. = 0 do. leaving 0 else. leaving 1 + traced_sum_ones y. - 1 end. ) sum_ones1 =: monad def 'sum_ones_iter y. , 0 1' sum_ones_iter =: monad def 0 ('n' ; 'acc' ; 'i') =. y. if. i > n do. acc else. sum_ones_iter n , (acc + 1) , i + 1 end. ) traced_sum_ones1 =: monad def 'traced_sum_ones_iter y. , 0 1' traced_sum_ones_iter =: monad def 0 entering y. ('n' ; 'acc' ; 'i') =. y. if. i > n do. leaving acc else. traced_sum_ones_iter n , (acc + 1) , i + 1 end. ) sum =: monad def 0 if. y. = 0 do. 0 else. y. + sum y. - 1 end. ) traced_sum =: monad def 0 entering y. if. y. = 0 do. leaving 0 else. leaving y. + traced_sum y. - 1 end. ) sum1 =: monad def 'sum_iter y. , 0 1' sum_iter =: monad def 0 ('n' ; 'acc' ; 'i') =. y. if. i > n do. acc else. sum_iter n , (acc + i) , i + 1 end. ) traced_sum1 =: monad def 'traced_sum_iter y. , 0 1' traced_sum_iter =: monad def 0 entering y. ('n' ; 'acc' ; 'i') =. y. if. i > n do. leaving acc else. traced_sum_iter n , (acc + i) , i + 1 end. ) fact =: monad def 0 if. y. < 2 do. 1 else. y. * fact y. - 1 end. ) traced_fact =: monad def 0 entering y. if. y. < 2 do. leaving 1 else. leaving y. * traced_fact y. - 1 end. ) fact1 =: monad def 'fact_iter y. , 1 1' fact_iter =: monad def 0 ('n' ; 'acc' ; 'i') =. y. if. i > n do. acc else. fact_iter n , (i * acc) , i + 1 end. ) traced_fact1 =: monad def 'traced_fact_iter y. , 1 1' traced_fact_iter =: monad def 0 entering y. ('n' ; 'acc' ; 'i') =. y. if. i > n do. leaving acc else. traced_fact_iter n , (i * acc) , i + 1 end. ) fibonacci =: monad def 0 if. y. < 2 do. y. else. (fibonacci y. - 1) + fibonacci y. - 2 end. ) traced_fibonacci =: monad def 0 entering y. if. y. < 2 do. leaving y. else. leaving (traced_fibonacci y. - 1) + traced_fibonacci y. -2 end. ) fib_work =: monad def 0 if. y. < 2 do. 1 else. 1 + (fib_work y. - 1) + fib_work y. - 2 end. ) fibonacci1 =: monad def 'fib_iter 1 0 , y.' fib_iter =: monad def 0 ('a' ; 'b' ; 'count') =. y. if. count = 0 do. b else. fib_iter (a + b) , a , count - 1 end. ) traced_fibonacci1 =: monad def 'traced_fib_iter 1 0 , y.' traced_fib_iter =: monad def 0 entering y. ('a' ; 'b' ; 'count') =. y. if. count = 0 do. leaving b else. leaving traced_fib_iter (a + b) , a , count - 1 end. )