fun_recur.golden 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. ********** source program **********
  2. fn f (0 = Int: x) -> Int {
  3. if ((x == 0))
  4. return x;
  5. else
  6. return f(0 = (x - 1));
  7. }
  8. fn main () -> Int {
  9. return f(0 = 2);
  10. }
  11. ********** type checking **********
  12. --- step exp Int --->
  13. --- step exp Int --->
  14. --- step exp Int --->
  15. --- step exp Int --->
  16. --- step exp Int --->
  17. --- step exp Int --->
  18. ********** type checking complete **********
  19. fn f (0 = Int: x) -> Int {
  20. if ((x == 0))
  21. return x;
  22. else
  23. return f(0 = (x - 1));
  24. }
  25. fn main () -> Int {
  26. return f(0 = 2);
  27. }
  28. ********** starting execution **********
  29. ********** initializing globals **********
  30. --- step exp (0 = Int: x) --->
  31. --- step exp Int: x --->
  32. --- step exp Int --->
  33. --- handle value Int with Int: x<1>(Int,) --->
  34. --- handle value Int: x with (0 = Int: x)<1>(Int: x,) --->
  35. --- step exp () --->
  36. ********** calling main function **********
  37. {
  38. stack: top{main()<-1>}
  39. heap: Int: x, fun<f>, fun<main>,
  40. env: main: fun<main>, f: fun<f>,
  41. }
  42. --- step exp main() --->
  43. {
  44. stack: top{main<-1> :: main()<0>}
  45. heap: Int: x, fun<f>, fun<main>,
  46. env: main: fun<main>, f: fun<f>,
  47. }
  48. --- step exp main --->
  49. {
  50. stack: top{fun<main><-1> :: main()<0>}
  51. heap: Int: x, fun<f>, fun<main>,
  52. env: main: fun<main>, f: fun<f>,
  53. }
  54. --- handle value fun<main> with main()<1>(fun<main>,) --->
  55. {
  56. stack: top{()<-1> :: main()<1>(fun<main>,)}
  57. heap: Int: x, fun<f>, fun<main>,
  58. env: main: fun<main>, f: fun<f>,
  59. }
  60. --- step exp () --->
  61. {
  62. stack: top{()<-1> :: main()<1>(fun<main>,)}
  63. heap: Int: x, fun<f>, fun<main>,
  64. env: main: fun<main>, f: fun<f>,
  65. }
  66. --- handle value () with main()<2>(fun<main>,(),) --->
  67. pattern_match((), ())
  68. {
  69. stack: main{return f(0 = 2);<-1>} :: top{}
  70. heap: Int: x, fun<f>, fun<main>,
  71. env: main: fun<main>, f: fun<f>,
  72. }
  73. --- step stmt return f(0 = 2); --->
  74. {
  75. stack: main{f(0 = 2)<-1> :: return f(0 = 2);<0>} :: top{}
  76. heap: Int: x, fun<f>, fun<main>,
  77. env: main: fun<main>, f: fun<f>,
  78. }
  79. --- step exp f(0 = 2) --->
  80. {
  81. stack: main{f<-1> :: f(0 = 2)<0> :: return f(0 = 2);<0>} :: top{}
  82. heap: Int: x, fun<f>, fun<main>,
  83. env: main: fun<main>, f: fun<f>,
  84. }
  85. --- step exp f --->
  86. {
  87. stack: main{fun<f><-1> :: f(0 = 2)<0> :: return f(0 = 2);<0>} :: top{}
  88. heap: Int: x, fun<f>, fun<main>,
  89. env: main: fun<main>, f: fun<f>,
  90. }
  91. --- handle value fun<f> with f(0 = 2)<1>(fun<f>,) --->
  92. {
  93. stack: main{(0 = 2)<-1> :: f(0 = 2)<1>(fun<f>,) :: return f(0 = 2);<0>} :: top{}
  94. heap: Int: x, fun<f>, fun<main>,
  95. env: main: fun<main>, f: fun<f>,
  96. }
  97. --- step exp (0 = 2) --->
  98. {
  99. stack: main{2<-1> :: (0 = 2)<0> :: f(0 = 2)<1>(fun<f>,) :: return f(0 = 2);<0>} :: top{}
  100. heap: Int: x, fun<f>, fun<main>,
  101. env: main: fun<main>, f: fun<f>,
  102. }
  103. --- step exp 2 --->
  104. {
  105. stack: main{2<-1> :: (0 = 2)<0> :: f(0 = 2)<1>(fun<f>,) :: return f(0 = 2);<0>} :: top{}
  106. heap: Int: x, fun<f>, fun<main>,
  107. env: main: fun<main>, f: fun<f>,
  108. }
  109. --- handle value 2 with (0 = 2)<1>(2,) --->
  110. {
  111. stack: main{(0 = 2@3)<-1> :: f(0 = 2)<1>(fun<f>,) :: return f(0 = 2);<0>} :: top{}
  112. heap: Int: x, fun<f>, fun<main>, 2,
  113. env: main: fun<main>, f: fun<f>,
  114. }
  115. --- handle value (0 = 2@3) with f(0 = 2)<2>(fun<f>,(0 = 2@3),) --->
  116. pattern_match((0 = Int: x@0), (0 = 2@3))
  117. pattern_match(Int: x, 2)
  118. {
  119. stack: f{if ((x == 0))
  120. ...
  121. else
  122. ... <-1>} :: main{return f(0 = 2);<0>} :: top{}
  123. heap: Int: x, fun<f>, fun<main>, 2, 2,
  124. env: x: 2, main: fun<main>, f: fun<f>,
  125. }
  126. --- step stmt if ((x == 0))
  127. ...
  128. else
  129. ... --->
  130. {
  131. stack: f{(x == 0)<-1> :: if ((x == 0))
  132. ...
  133. else
  134. ... <0>} :: main{return f(0 = 2);<0>} :: top{}
  135. heap: Int: x, fun<f>, fun<main>, 2, 2,
  136. env: x: 2, main: fun<main>, f: fun<f>,
  137. }
  138. --- step exp (x == 0) --->
  139. {
  140. stack: f{x<-1> :: (x == 0)<0> :: if ((x == 0))
  141. ...
  142. else
  143. ... <0>} :: main{return f(0 = 2);<0>} :: top{}
  144. heap: Int: x, fun<f>, fun<main>, 2, 2,
  145. env: x: 2, main: fun<main>, f: fun<f>,
  146. }
  147. --- step exp x --->
  148. {
  149. stack: f{2<-1> :: (x == 0)<0> :: if ((x == 0))
  150. ...
  151. else
  152. ... <0>} :: main{return f(0 = 2);<0>} :: top{}
  153. heap: Int: x, fun<f>, fun<main>, 2, 2,
  154. env: x: 2, main: fun<main>, f: fun<f>,
  155. }
  156. --- handle value 2 with (x == 0)<1>(2,) --->
  157. {
  158. stack: f{0<-1> :: (x == 0)<1>(2,) :: if ((x == 0))
  159. ...
  160. else
  161. ... <0>} :: main{return f(0 = 2);<0>} :: top{}
  162. heap: Int: x, fun<f>, fun<main>, 2, 2,
  163. env: x: 2, main: fun<main>, f: fun<f>,
  164. }
  165. --- step exp 0 --->
  166. {
  167. stack: f{0<-1> :: (x == 0)<1>(2,) :: if ((x == 0))
  168. ...
  169. else
  170. ... <0>} :: main{return f(0 = 2);<0>} :: top{}
  171. heap: Int: x, fun<f>, fun<main>, 2, 2,
  172. env: x: 2, main: fun<main>, f: fun<f>,
  173. }
  174. --- handle value 0 with (x == 0)<2>(2,0,) --->
  175. {
  176. stack: f{false<-1> :: if ((x == 0))
  177. ...
  178. else
  179. ... <0>} :: main{return f(0 = 2);<0>} :: top{}
  180. heap: Int: x, fun<f>, fun<main>, 2, 2,
  181. env: x: 2, main: fun<main>, f: fun<f>,
  182. }
  183. --- handle value false with if ((x == 0))
  184. ...
  185. else
  186. ... <1>(false,) --->
  187. {
  188. stack: f{return f(0 = (x - 1));<-1>} :: main{return f(0 = 2);<0>} :: top{}
  189. heap: Int: x, fun<f>, fun<main>, 2, 2,
  190. env: x: 2, main: fun<main>, f: fun<f>,
  191. }
  192. --- step stmt return f(0 = (x - 1)); --->
  193. {
  194. stack: f{f(0 = (x - 1))<-1> :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  195. heap: Int: x, fun<f>, fun<main>, 2, 2,
  196. env: x: 2, main: fun<main>, f: fun<f>,
  197. }
  198. --- step exp f(0 = (x - 1)) --->
  199. {
  200. stack: f{f<-1> :: f(0 = (x - 1))<0> :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  201. heap: Int: x, fun<f>, fun<main>, 2, 2,
  202. env: x: 2, main: fun<main>, f: fun<f>,
  203. }
  204. --- step exp f --->
  205. {
  206. stack: f{fun<f><-1> :: f(0 = (x - 1))<0> :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  207. heap: Int: x, fun<f>, fun<main>, 2, 2,
  208. env: x: 2, main: fun<main>, f: fun<f>,
  209. }
  210. --- handle value fun<f> with f(0 = (x - 1))<1>(fun<f>,) --->
  211. {
  212. stack: f{(0 = (x - 1))<-1> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  213. heap: Int: x, fun<f>, fun<main>, 2, 2,
  214. env: x: 2, main: fun<main>, f: fun<f>,
  215. }
  216. --- step exp (0 = (x - 1)) --->
  217. {
  218. stack: f{(x - 1)<-1> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  219. heap: Int: x, fun<f>, fun<main>, 2, 2,
  220. env: x: 2, main: fun<main>, f: fun<f>,
  221. }
  222. --- step exp (x - 1) --->
  223. {
  224. stack: f{x<-1> :: (x - 1)<0> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  225. heap: Int: x, fun<f>, fun<main>, 2, 2,
  226. env: x: 2, main: fun<main>, f: fun<f>,
  227. }
  228. --- step exp x --->
  229. {
  230. stack: f{2<-1> :: (x - 1)<0> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  231. heap: Int: x, fun<f>, fun<main>, 2, 2,
  232. env: x: 2, main: fun<main>, f: fun<f>,
  233. }
  234. --- handle value 2 with (x - 1)<1>(2,) --->
  235. {
  236. stack: f{1<-1> :: (x - 1)<1>(2,) :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  237. heap: Int: x, fun<f>, fun<main>, 2, 2,
  238. env: x: 2, main: fun<main>, f: fun<f>,
  239. }
  240. --- step exp 1 --->
  241. {
  242. stack: f{1<-1> :: (x - 1)<1>(2,) :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  243. heap: Int: x, fun<f>, fun<main>, 2, 2,
  244. env: x: 2, main: fun<main>, f: fun<f>,
  245. }
  246. --- handle value 1 with (x - 1)<2>(2,1,) --->
  247. {
  248. stack: f{1<-1> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  249. heap: Int: x, fun<f>, fun<main>, 2, 2,
  250. env: x: 2, main: fun<main>, f: fun<f>,
  251. }
  252. --- handle value 1 with (0 = (x - 1))<1>(1,) --->
  253. {
  254. stack: f{(0 = 1@5)<-1> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  255. heap: Int: x, fun<f>, fun<main>, 2, 2, 1,
  256. env: x: 2, main: fun<main>, f: fun<f>,
  257. }
  258. --- handle value (0 = 1@5) with f(0 = (x - 1))<2>(fun<f>,(0 = 1@5),) --->
  259. pattern_match((0 = Int: x@0), (0 = 1@5))
  260. pattern_match(Int: x, 1)
  261. {
  262. stack: f{if ((x == 0))
  263. ...
  264. else
  265. ... <-1>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  266. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  267. env: x: 1, main: fun<main>, f: fun<f>,
  268. }
  269. --- step stmt if ((x == 0))
  270. ...
  271. else
  272. ... --->
  273. {
  274. stack: f{(x == 0)<-1> :: if ((x == 0))
  275. ...
  276. else
  277. ... <0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  278. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  279. env: x: 1, main: fun<main>, f: fun<f>,
  280. }
  281. --- step exp (x == 0) --->
  282. {
  283. stack: f{x<-1> :: (x == 0)<0> :: if ((x == 0))
  284. ...
  285. else
  286. ... <0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  287. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  288. env: x: 1, main: fun<main>, f: fun<f>,
  289. }
  290. --- step exp x --->
  291. {
  292. stack: f{1<-1> :: (x == 0)<0> :: if ((x == 0))
  293. ...
  294. else
  295. ... <0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  296. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  297. env: x: 1, main: fun<main>, f: fun<f>,
  298. }
  299. --- handle value 1 with (x == 0)<1>(1,) --->
  300. {
  301. stack: f{0<-1> :: (x == 0)<1>(1,) :: if ((x == 0))
  302. ...
  303. else
  304. ... <0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  305. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  306. env: x: 1, main: fun<main>, f: fun<f>,
  307. }
  308. --- step exp 0 --->
  309. {
  310. stack: f{0<-1> :: (x == 0)<1>(1,) :: if ((x == 0))
  311. ...
  312. else
  313. ... <0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  314. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  315. env: x: 1, main: fun<main>, f: fun<f>,
  316. }
  317. --- handle value 0 with (x == 0)<2>(1,0,) --->
  318. {
  319. stack: f{false<-1> :: if ((x == 0))
  320. ...
  321. else
  322. ... <0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  323. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  324. env: x: 1, main: fun<main>, f: fun<f>,
  325. }
  326. --- handle value false with if ((x == 0))
  327. ...
  328. else
  329. ... <1>(false,) --->
  330. {
  331. stack: f{return f(0 = (x - 1));<-1>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  332. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  333. env: x: 1, main: fun<main>, f: fun<f>,
  334. }
  335. --- step stmt return f(0 = (x - 1)); --->
  336. {
  337. stack: f{f(0 = (x - 1))<-1> :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  338. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  339. env: x: 1, main: fun<main>, f: fun<f>,
  340. }
  341. --- step exp f(0 = (x - 1)) --->
  342. {
  343. stack: f{f<-1> :: f(0 = (x - 1))<0> :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  344. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  345. env: x: 1, main: fun<main>, f: fun<f>,
  346. }
  347. --- step exp f --->
  348. {
  349. stack: f{fun<f><-1> :: f(0 = (x - 1))<0> :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  350. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  351. env: x: 1, main: fun<main>, f: fun<f>,
  352. }
  353. --- handle value fun<f> with f(0 = (x - 1))<1>(fun<f>,) --->
  354. {
  355. stack: f{(0 = (x - 1))<-1> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  356. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  357. env: x: 1, main: fun<main>, f: fun<f>,
  358. }
  359. --- step exp (0 = (x - 1)) --->
  360. {
  361. stack: f{(x - 1)<-1> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  362. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  363. env: x: 1, main: fun<main>, f: fun<f>,
  364. }
  365. --- step exp (x - 1) --->
  366. {
  367. stack: f{x<-1> :: (x - 1)<0> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  368. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  369. env: x: 1, main: fun<main>, f: fun<f>,
  370. }
  371. --- step exp x --->
  372. {
  373. stack: f{1<-1> :: (x - 1)<0> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  374. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  375. env: x: 1, main: fun<main>, f: fun<f>,
  376. }
  377. --- handle value 1 with (x - 1)<1>(1,) --->
  378. {
  379. stack: f{1<-1> :: (x - 1)<1>(1,) :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  380. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  381. env: x: 1, main: fun<main>, f: fun<f>,
  382. }
  383. --- step exp 1 --->
  384. {
  385. stack: f{1<-1> :: (x - 1)<1>(1,) :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  386. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  387. env: x: 1, main: fun<main>, f: fun<f>,
  388. }
  389. --- handle value 1 with (x - 1)<2>(1,1,) --->
  390. {
  391. stack: f{0<-1> :: (0 = (x - 1))<0> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  392. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1,
  393. env: x: 1, main: fun<main>, f: fun<f>,
  394. }
  395. --- handle value 0 with (0 = (x - 1))<1>(0,) --->
  396. {
  397. stack: f{(0 = 0@7)<-1> :: f(0 = (x - 1))<1>(fun<f>,) :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  398. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0,
  399. env: x: 1, main: fun<main>, f: fun<f>,
  400. }
  401. --- handle value (0 = 0@7) with f(0 = (x - 1))<2>(fun<f>,(0 = 0@7),) --->
  402. pattern_match((0 = Int: x@0), (0 = 0@7))
  403. pattern_match(Int: x, 0)
  404. {
  405. stack: f{if ((x == 0))
  406. ...
  407. else
  408. ... <-1>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  409. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  410. env: x: 0, main: fun<main>, f: fun<f>,
  411. }
  412. --- step stmt if ((x == 0))
  413. ...
  414. else
  415. ... --->
  416. {
  417. stack: f{(x == 0)<-1> :: if ((x == 0))
  418. ...
  419. else
  420. ... <0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  421. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  422. env: x: 0, main: fun<main>, f: fun<f>,
  423. }
  424. --- step exp (x == 0) --->
  425. {
  426. stack: f{x<-1> :: (x == 0)<0> :: if ((x == 0))
  427. ...
  428. else
  429. ... <0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  430. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  431. env: x: 0, main: fun<main>, f: fun<f>,
  432. }
  433. --- step exp x --->
  434. {
  435. stack: f{0<-1> :: (x == 0)<0> :: if ((x == 0))
  436. ...
  437. else
  438. ... <0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  439. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  440. env: x: 0, main: fun<main>, f: fun<f>,
  441. }
  442. --- handle value 0 with (x == 0)<1>(0,) --->
  443. {
  444. stack: f{0<-1> :: (x == 0)<1>(0,) :: if ((x == 0))
  445. ...
  446. else
  447. ... <0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  448. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  449. env: x: 0, main: fun<main>, f: fun<f>,
  450. }
  451. --- step exp 0 --->
  452. {
  453. stack: f{0<-1> :: (x == 0)<1>(0,) :: if ((x == 0))
  454. ...
  455. else
  456. ... <0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  457. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  458. env: x: 0, main: fun<main>, f: fun<f>,
  459. }
  460. --- handle value 0 with (x == 0)<2>(0,0,) --->
  461. {
  462. stack: f{true<-1> :: if ((x == 0))
  463. ...
  464. else
  465. ... <0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  466. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  467. env: x: 0, main: fun<main>, f: fun<f>,
  468. }
  469. --- handle value true with if ((x == 0))
  470. ...
  471. else
  472. ... <1>(true,) --->
  473. {
  474. stack: f{return x;<-1>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  475. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  476. env: x: 0, main: fun<main>, f: fun<f>,
  477. }
  478. --- step stmt return x; --->
  479. {
  480. stack: f{x<-1> :: return x;<0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  481. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  482. env: x: 0, main: fun<main>, f: fun<f>,
  483. }
  484. --- step exp x --->
  485. {
  486. stack: f{0<-1> :: return x;<0>} :: f{return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  487. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, 0,
  488. env: x: 0, main: fun<main>, f: fun<f>,
  489. }
  490. --- handle value 0 with return x;<1>(0,) --->
  491. {
  492. stack: f{0<-1> :: return f(0 = (x - 1));<0>} :: f{return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  493. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, 1, 0, !!0,
  494. env: x: 1, main: fun<main>, f: fun<f>,
  495. }
  496. --- handle value 0 with return f(0 = (x - 1));<1>(0,) --->
  497. {
  498. stack: f{0<-1> :: return f(0 = (x - 1));<0>} :: main{return f(0 = 2);<0>} :: top{}
  499. heap: Int: x, fun<f>, fun<main>, 2, 2, 1, !!1, 0, !!0,
  500. env: x: 2, main: fun<main>, f: fun<f>,
  501. }
  502. --- handle value 0 with return f(0 = (x - 1));<1>(0,) --->
  503. {
  504. stack: main{0<-1> :: return f(0 = 2);<0>} :: top{}
  505. heap: Int: x, fun<f>, fun<main>, 2, !!2, 1, !!1, 0, !!0,
  506. env: main: fun<main>, f: fun<f>,
  507. }
  508. --- handle value 0 with return f(0 = 2);<1>(0,) --->
  509. {
  510. stack: top{0<-1>}
  511. heap: Int: x, fun<f>, fun<main>, 2, !!2, 1, !!1, 0, !!0,
  512. env: main: fun<main>, f: fun<f>,
  513. }
  514. result: 0