source 
 prog 
 defn 
 TYP 
 1:1-1:3 
 typ 
 ID 
 1:5-1:5 
 i 
 EQUALS 
 1:7-1:7 
 = 
 type 
 INT 
 1:9-1:11 
 int 
 defn 
 TYP 
 2:1-2:3 
 typ 
 ID 
 2:5-2:5 
 c 
 EQUALS 
 2:7-2:7 
 = 
 type 
 CHAR 
 2:9-2:12 
 char 
 defn 
 TYP 
 3:1-3:3 
 typ 
 ID 
 3:5-3:5 
 b 
 EQUALS 
 3:7-3:7 
 = 
 type 
 BOOL 
 3:9-3:12 
 bool 
 defn 
 TYP 
 4:1-4:3 
 typ 
 ID 
 4:5-4:6 
 pi 
 EQUALS 
 4:8-4:8 
 = 
 type 
 HAT 
 4:10-4:10 
 ^ 
 type 
 ID 
 4:11-4:11 
 i 
 defn 
 TYP 
 5:1-5:3 
 typ 
 ID 
 5:5-5:6 
 pb 
 EQUALS 
 5:8-5:8 
 = 
 type 
 HAT 
 5:10-5:10 
 ^ 
 type 
 ID 
 5:11-5:11 
 b 
 defn 
 VAR 
 7:1-7:3 
 var 
 ID 
 7:5-7:11 
 counter 
 COLON 
 7:13-7:13 
 : 
 type 
 ID 
 7:15-7:15 
 i 
 defn 
 VAR 
 8:1-8:3 
 var 
 ID 
 8:5-8:8 
 flag 
 COLON 
 8:10-8:10 
 : 
 type 
 ID 
 8:12-8:12 
 b 
 defn 
 VAR 
 9:1-9:3 
 var 
 ID 
 9:5-9:10 
 result 
 COLON 
 9:12-9:12 
 : 
 type 
 ID 
 9:14-9:14 
 i 
 defn 
 FUN 
 11:1-11:3 
 fun 
 ID 
 11:5-11:13 
 ext_print 
 LBRACKET 
 11:14-11:14 
 ( 
 ID 
 11:15-11:15 
 x 
 COLON 
 11:17-11:17 
 : 
 type 
 ID 
 11:19-11:19 
 i 
 RBRACKET 
 11:20-11:20 
 ) 
 COLON 
 11:22-11:22 
 : 
 type 
 ID 
 11:24-11:24 
 i 
 defn 
 FUN 
 12:1-12:3 
 fun 
 ID 
 12:5-12:12 
 ext_read 
 LBRACKET 
 12:13-12:13 
 ( 
 RBRACKET 
 12:14-12:14 
 ) 
 COLON 
 12:16-12:16 
 : 
 type 
 ID 
 12:18-12:18 
 i 
 defn 
 FUN 
 14:1-14:3 
 fun 
 ID 
 14:5-14:11 
 is_zero 
 LBRACKET 
 14:12-14:12 
 ( 
 ID 
 14:13-14:13 
 n 
 COLON 
 14:15-14:15 
 : 
 type 
 ID 
 14:17-14:17 
 i 
 RBRACKET 
 14:18-14:18 
 ) 
 COLON 
 14:20-14:20 
 : 
 type 
 ID 
 14:22-14:22 
 b 
 EQUALS 
 14:24-14:24 
 = 
 expr 
 expr 
 ID 
 15:5-15:5 
 n 
 EEQUALS 
 15:7-15:8 
 == 
 expr 
 NUM 
 15:10-15:10 
 0 
 defn 
 FUN 
 17:1-17:3 
 fun 
 ID 
 17:5-17:11 
 is_even 
 LBRACKET 
 17:12-17:12 
 ( 
 ID 
 17:13-17:13 
 n 
 COLON 
 17:15-17:15 
 : 
 type 
 ID 
 17:17-17:17 
 i 
 RBRACKET 
 17:18-17:18 
 ) 
 COLON 
 17:20-17:20 
 : 
 type 
 ID 
 17:22-17:22 
 b 
 EQUALS 
 17:24-17:24 
 = 
 expr 
 expr 
 expr 
 ID 
 18:5-18:5 
 n 
 PERCENT 
 18:7-18:7 
 % 
 expr 
 NUM 
 18:9-18:9 
 2 
 EEQUALS 
 18:11-18:12 
 == 
 expr 
 NUM 
 18:14-18:14 
 0 
 defn 
 FUN 
 20:1-20:3 
 fun 
 ID 
 20:5-20:11 
 abs_val 
 LBRACKET 
 20:12-20:12 
 ( 
 ID 
 20:13-20:13 
 n 
 COLON 
 20:15-20:15 
 : 
 type 
 ID 
 20:17-20:17 
 i 
 RBRACKET 
 20:18-20:18 
 ) 
 COLON 
 20:20-20:20 
 : 
 type 
 ID 
 20:22-20:22 
 i 
 EQUALS 
 20:24-20:24 
 = 
 expr 
 IF 
 21:5-21:6 
 if 
 expr 
 expr 
 ID 
 21:8-21:8 
 n 
 LT 
 21:10-21:10 
 < 
 expr 
 NUM 
 21:12-21:12 
 0 
 THEN 
 21:14-21:17 
 then 
 expr 
 expr 
 NUM 
 22:9-22:9 
 0 
 MINUS 
 22:11-22:11 
 - 
 expr 
 ID 
 22:13-22:13 
 n 
 ELSE 
 23:5-23:8 
 else 
 expr 
 ID 
 24:9-24:9 
 n 
 END 
 25:5-25:7 
 end 
 defn 
 FUN 
 27:1-27:3 
 fun 
 ID 
 27:5-27:7 
 max 
 LBRACKET 
 27:8-27:8 
 ( 
 ID 
 27:9-27:9 
 a 
 COLON 
 27:11-27:11 
 : 
 type 
 ID 
 27:13-27:13 
 i 
 COMMA 
 27:14-27:14 
 , 
 ID 
 27:16-27:16 
 b 
 COLON 
 27:18-27:18 
 : 
 type 
 ID 
 27:20-27:20 
 i 
 RBRACKET 
 27:21-27:21 
 ) 
 COLON 
 27:23-27:23 
 : 
 type 
 ID 
 27:25-27:25 
 i 
 EQUALS 
 27:27-27:27 
 = 
 expr 
 IF 
 28:5-28:6 
 if 
 expr 
 expr 
 ID 
 28:8-28:8 
 a 
 GT 
 28:10-28:10 
 > 
 expr 
 ID 
 28:12-28:12 
 b 
 THEN 
 28:14-28:17 
 then 
 expr 
 ID 
 29:9-29:9 
 a 
 ELSE 
 30:5-30:8 
 else 
 expr 
 ID 
 31:9-31:9 
 b 
 END 
 32:5-32:7 
 end 
 defn 
 FUN 
 34:1-34:3 
 fun 
 ID 
 34:5-34:7 
 min 
 LBRACKET 
 34:8-34:8 
 ( 
 ID 
 34:9-34:9 
 a 
 COLON 
 34:11-34:11 
 : 
 type 
 ID 
 34:13-34:13 
 i 
 COMMA 
 34:14-34:14 
 , 
 ID 
 34:16-34:16 
 b 
 COLON 
 34:18-34:18 
 : 
 type 
 ID 
 34:20-34:20 
 i 
 RBRACKET 
 34:21-34:21 
 ) 
 COLON 
 34:23-34:23 
 : 
 type 
 ID 
 34:25-34:25 
 i 
 EQUALS 
 34:27-34:27 
 = 
 expr 
 IF 
 35:5-35:6 
 if 
 expr 
 expr 
 ID 
 35:8-35:8 
 a 
 LT 
 35:10-35:10 
 < 
 expr 
 ID 
 35:12-35:12 
 b 
 THEN 
 35:14-35:17 
 then 
 expr 
 ID 
 36:9-36:9 
 a 
 ELSE 
 37:5-37:8 
 else 
 expr 
 ID 
 38:9-38:9 
 b 
 END 
 39:5-39:7 
 end 
 defn 
 FUN 
 41:1-41:3 
 fun 
 ID 
 41:5-41:7 
 pow 
 LBRACKET 
 41:8-41:8 
 ( 
 ID 
 41:9-41:12 
 base 
 COLON 
 41:14-41:14 
 : 
 type 
 ID 
 41:16-41:16 
 i 
 COMMA 
 41:17-41:17 
 , 
 ID 
 41:19-41:21 
 exp 
 COLON 
 41:23-41:23 
 : 
 type 
 ID 
 41:25-41:25 
 i 
 RBRACKET 
 41:26-41:26 
 ) 
 COLON 
 41:28-41:28 
 : 
 type 
 ID 
 41:30-41:30 
 i 
 EQUALS 
 41:32-41:32 
 = 
 expr 
 IF 
 42:5-42:6 
 if 
 expr 
 expr 
 ID 
 42:8-42:14 
 is_zero 
 LBRACKET 
 42:15-42:15 
 ( 
 expr 
 ID 
 42:16-42:18 
 exp 
 RBRACKET 
 42:19-42:19 
 ) 
 THEN 
 42:21-42:24 
 then 
 expr 
 NUM 
 43:9-43:9 
 1 
 ELSE 
 44:5-44:8 
 else 
 expr 
 expr 
 ID 
 45:9-45:12 
 base 
 ASTERISK 
 45:14-45:14 
 * 
 expr 
 expr 
 ID 
 45:16-45:18 
 pow 
 LBRACKET 
 45:19-45:19 
 ( 
 expr 
 ID 
 45:20-45:23 
 base 
 COMMA 
 45:24-45:24 
 , 
 expr 
 expr 
 ID 
 45:26-45:28 
 exp 
 MINUS 
 45:30-45:30 
 - 
 expr 
 NUM 
 45:32-45:32 
 1 
 RBRACKET 
 45:33-45:33 
 ) 
 END 
 46:5-46:7 
 end 
 defn 
 FUN 
 48:1-48:3 
 fun 
 ID 
 48:5-48:7 
 gcd 
 LBRACKET 
 48:8-48:8 
 ( 
 ID 
 48:9-48:9 
 a 
 COLON 
 48:11-48:11 
 : 
 type 
 ID 
 48:13-48:13 
 i 
 COMMA 
 48:14-48:14 
 , 
 ID 
 48:16-48:16 
 b 
 COLON 
 48:18-48:18 
 : 
 type 
 ID 
 48:20-48:20 
 i 
 RBRACKET 
 48:21-48:21 
 ) 
 COLON 
 48:23-48:23 
 : 
 type 
 ID 
 48:25-48:25 
 i 
 EQUALS 
 48:27-48:27 
 = 
 expr 
 IF 
 49:5-49:6 
 if 
 expr 
 expr 
 ID 
 49:8-49:14 
 is_zero 
 LBRACKET 
 49:15-49:15 
 ( 
 expr 
 ID 
 49:16-49:16 
 b 
 RBRACKET 
 49:17-49:17 
 ) 
 THEN 
 49:19-49:22 
 then 
 expr 
 ID 
 50:9-50:9 
 a 
 ELSE 
 51:5-51:8 
 else 
 expr 
 expr 
 ID 
 52:9-52:11 
 gcd 
 LBRACKET 
 52:12-52:12 
 ( 
 expr 
 ID 
 52:13-52:13 
 b 
 COMMA 
 52:14-52:14 
 , 
 expr 
 expr 
 ID 
 52:16-52:16 
 a 
 PERCENT 
 52:18-52:18 
 % 
 expr 
 ID 
 52:20-52:20 
 b 
 RBRACKET 
 52:21-52:21 
 ) 
 END 
 53:5-53:7 
 end 
 defn 
 FUN 
 55:1-55:3 
 fun 
 ID 
 55:5-55:7 
 fib 
 LBRACKET 
 55:8-55:8 
 ( 
 ID 
 55:9-55:9 
 n 
 COLON 
 55:11-55:11 
 : 
 type 
 ID 
 55:13-55:13 
 i 
 RBRACKET 
 55:14-55:14 
 ) 
 COLON 
 55:16-55:16 
 : 
 type 
 ID 
 55:18-55:18 
 i 
 EQUALS 
 55:20-55:20 
 = 
 expr 
 IF 
 56:5-56:6 
 if 
 expr 
 expr 
 ID 
 56:8-56:8 
 n 
 EEQUALS 
 56:10-56:11 
 == 
 expr 
 NUM 
 56:13-56:13 
 0 
 THEN 
 56:15-56:18 
 then 
 expr 
 NUM 
 57:9-57:9 
 0 
 ELSE 
 58:5-58:8 
 else 
 expr 
 IF 
 59:9-59:10 
 if 
 expr 
 expr 
 ID 
 59:12-59:12 
 n 
 EEQUALS 
 59:14-59:15 
 == 
 expr 
 NUM 
 59:17-59:17 
 1 
 THEN 
 59:19-59:22 
 then 
 expr 
 NUM 
 60:13-60:13 
 1 
 ELSE 
 61:9-61:12 
 else 
 expr 
 expr 
 expr 
 ID 
 62:13-62:15 
 fib 
 LBRACKET 
 62:16-62:16 
 ( 
 expr 
 expr 
 ID 
 62:17-62:17 
 n 
 MINUS 
 62:19-62:19 
 - 
 expr 
 NUM 
 62:21-62:21 
 1 
 RBRACKET 
 62:22-62:22 
 ) 
 PLUS 
 62:24-62:24 
 + 
 expr 
 expr 
 ID 
 62:26-62:28 
 fib 
 LBRACKET 
 62:29-62:29 
 ( 
 expr 
 expr 
 ID 
 62:30-62:30 
 n 
 MINUS 
 62:32-62:32 
 - 
 expr 
 NUM 
 62:34-62:34 
 2 
 RBRACKET 
 62:35-62:35 
 ) 
 END 
 63:9-63:11 
 end 
 END 
 64:5-64:7 
 end 
 defn 
 FUN 
 66:1-66:3 
 fun 
 ID 
 66:5-66:10 
 sum_to 
 LBRACKET 
 66:11-66:11 
 ( 
 ID 
 66:12-66:12 
 n 
 COLON 
 66:14-66:14 
 : 
 type 
 ID 
 66:16-66:16 
 i 
 RBRACKET 
 66:17-66:17 
 ) 
 COLON 
 66:19-66:19 
 : 
 type 
 ID 
 66:21-66:21 
 i 
 EQUALS 
 66:23-66:23 
 = 
 expr 
 IF 
 67:5-67:6 
 if 
 expr 
 expr 
 ID 
 67:8-67:14 
 is_zero 
 LBRACKET 
 67:15-67:15 
 ( 
 expr 
 ID 
 67:16-67:16 
 n 
 RBRACKET 
 67:17-67:17 
 ) 
 THEN 
 67:19-67:22 
 then 
 expr 
 NUM 
 68:9-68:9 
 0 
 ELSE 
 69:5-69:8 
 else 
 expr 
 expr 
 ID 
 70:9-70:9 
 n 
 PLUS 
 70:11-70:11 
 + 
 expr 
 expr 
 ID 
 70:13-70:18 
 sum_to 
 LBRACKET 
 70:19-70:19 
 ( 
 expr 
 expr 
 ID 
 70:20-70:20 
 n 
 MINUS 
 70:22-70:22 
 - 
 expr 
 NUM 
 70:24-70:24 
 1 
 RBRACKET 
 70:25-70:25 
 ) 
 END 
 71:5-71:7 
 end 
 defn 
 FUN 
 73:1-73:3 
 fun 
 ID 
 73:5-73:11 
 collatz 
 LBRACKET 
 73:12-73:12 
 ( 
 ID 
 73:13-73:13 
 n 
 COLON 
 73:15-73:15 
 : 
 type 
 ID 
 73:17-73:17 
 i 
 RBRACKET 
 73:18-73:18 
 ) 
 COLON 
 73:20-73:20 
 : 
 type 
 ID 
 73:22-73:22 
 i 
 EQUALS 
 73:24-73:24 
 = 
 expr 
 IF 
 74:5-74:6 
 if 
 expr 
 expr 
 ID 
 74:8-74:8 
 n 
 EEQUALS 
 74:10-74:11 
 == 
 expr 
 NUM 
 74:13-74:13 
 1 
 THEN 
 74:15-74:18 
 then 
 expr 
 NUM 
 75:9-75:9 
 0 
 ELSE 
 76:5-76:8 
 else 
 expr 
 IF 
 77:9-77:10 
 if 
 expr 
 expr 
 ID 
 77:12-77:18 
 is_even 
 LBRACKET 
 77:19-77:19 
 ( 
 expr 
 ID 
 77:20-77:20 
 n 
 RBRACKET 
 77:21-77:21 
 ) 
 THEN 
 77:23-77:26 
 then 
 expr 
 expr 
 NUM 
 78:13-78:13 
 1 
 PLUS 
 78:15-78:15 
 + 
 expr 
 expr 
 ID 
 78:17-78:23 
 collatz 
 LBRACKET 
 78:24-78:24 
 ( 
 expr 
 expr 
 ID 
 78:25-78:25 
 n 
 SLASH 
 78:27-78:27 
 / 
 expr 
 NUM 
 78:29-78:29 
 2 
 RBRACKET 
 78:30-78:30 
 ) 
 ELSE 
 79:9-79:12 
 else 
 expr 
 expr 
 NUM 
 80:13-80:13 
 1 
 PLUS 
 80:15-80:15 
 + 
 expr 
 expr 
 ID 
 80:17-80:23 
 collatz 
 LBRACKET 
 80:24-80:24 
 ( 
 expr 
 expr 
 expr 
 NUM 
 80:25-80:25 
 3 
 ASTERISK 
 80:27-80:27 
 * 
 expr 
 ID 
 80:29-80:29 
 n 
 PLUS 
 80:31-80:31 
 + 
 expr 
 NUM 
 80:33-80:33 
 1 
 RBRACKET 
 80:34-80:34 
 ) 
 END 
 81:9-81:11 
 end 
 END 
 82:5-82:7 
 end 
 defn 
 FUN 
 84:1-84:3 
 fun 
 ID 
 84:5-84:13 
 ackermann 
 LBRACKET 
 84:14-84:14 
 ( 
 ID 
 84:15-84:15 
 m 
 COLON 
 84:17-84:17 
 : 
 type 
 ID 
 84:19-84:19 
 i 
 COMMA 
 84:20-84:20 
 , 
 ID 
 84:22-84:22 
 n 
 COLON 
 84:24-84:24 
 : 
 type 
 ID 
 84:26-84:26 
 i 
 RBRACKET 
 84:27-84:27 
 ) 
 COLON 
 84:29-84:29 
 : 
 type 
 ID 
 84:31-84:31 
 i 
 EQUALS 
 84:33-84:33 
 = 
 expr 
 IF 
 85:5-85:6 
 if 
 expr 
 expr 
 ID 
 85:8-85:14 
 is_zero 
 LBRACKET 
 85:15-85:15 
 ( 
 expr 
 ID 
 85:16-85:16 
 m 
 RBRACKET 
 85:17-85:17 
 ) 
 THEN 
 85:19-85:22 
 then 
 expr 
 expr 
 ID 
 86:9-86:9 
 n 
 PLUS 
 86:11-86:11 
 + 
 expr 
 NUM 
 86:13-86:13 
 1 
 ELSE 
 87:5-87:8 
 else 
 expr 
 IF 
 88:9-88:10 
 if 
 expr 
 expr 
 ID 
 88:12-88:18 
 is_zero 
 LBRACKET 
 88:19-88:19 
 ( 
 expr 
 ID 
 88:20-88:20 
 n 
 RBRACKET 
 88:21-88:21 
 ) 
 THEN 
 88:23-88:26 
 then 
 expr 
 expr 
 ID 
 89:13-89:21 
 ackermann 
 LBRACKET 
 89:22-89:22 
 ( 
 expr 
 expr 
 ID 
 89:23-89:23 
 m 
 MINUS 
 89:25-89:25 
 - 
 expr 
 NUM 
 89:27-89:27 
 1 
 COMMA 
 89:28-89:28 
 , 
 expr 
 NUM 
 89:30-89:30 
 1 
 RBRACKET 
 89:31-89:31 
 ) 
 ELSE 
 90:9-90:12 
 else 
 expr 
 expr 
 ID 
 91:13-91:21 
 ackermann 
 LBRACKET 
 91:22-91:22 
 ( 
 expr 
 expr 
 ID 
 91:23-91:23 
 m 
 MINUS 
 91:25-91:25 
 - 
 expr 
 NUM 
 91:27-91:27 
 1 
 COMMA 
 91:28-91:28 
 , 
 expr 
 expr 
 ID 
 91:30-91:38 
 ackermann 
 LBRACKET 
 91:39-91:39 
 ( 
 expr 
 ID 
 91:40-91:40 
 m 
 COMMA 
 91:41-91:41 
 , 
 expr 
 expr 
 ID 
 91:43-91:43 
 n 
 MINUS 
 91:45-91:45 
 - 
 expr 
 NUM 
 91:47-91:47 
 1 
 RBRACKET 
 91:48-91:48 
 ) 
 RBRACKET 
 91:49-91:49 
 ) 
 END 
 92:9-92:11 
 end 
 END 
 93:5-93:7 
 end 
 defn 
 FUN 
 95:1-95:3 
 fun 
 ID 
 95:5-95:13 
 digit_sum 
 LBRACKET 
 95:14-95:14 
 ( 
 ID 
 95:15-95:15 
 n 
 COLON 
 95:17-95:17 
 : 
 type 
 ID 
 95:19-95:19 
 i 
 RBRACKET 
 95:20-95:20 
 ) 
 COLON 
 95:22-95:22 
 : 
 type 
 ID 
 95:24-95:24 
 i 
 EQUALS 
 95:26-95:26 
 = 
 expr 
 IF 
 96:5-96:6 
 if 
 expr 
 expr 
 ID 
 96:8-96:8 
 n 
 LT 
 96:10-96:10 
 < 
 expr 
 NUM 
 96:12-96:13 
 10 
 THEN 
 96:15-96:18 
 then 
 expr 
 ID 
 97:9-97:9 
 n 
 ELSE 
 98:5-98:8 
 else 
 expr 
 expr 
 expr 
 ID 
 99:9-99:9 
 n 
 PERCENT 
 99:11-99:11 
 % 
 expr 
 NUM 
 99:13-99:14 
 10 
 PLUS 
 99:16-99:16 
 + 
 expr 
 expr 
 ID 
 99:18-99:26 
 digit_sum 
 LBRACKET 
 99:27-99:27 
 ( 
 expr 
 expr 
 ID 
 99:28-99:28 
 n 
 SLASH 
 99:30-99:30 
 / 
 expr 
 NUM 
 99:32-99:33 
 10 
 RBRACKET 
 99:34-99:34 
 ) 
 END 
 100:5-100:7 
 end 
 defn 
 FUN 
 102:1-102:3 
 fun 
 ID 
 102:5-102:17 
 is_palindrome 
 LBRACKET 
 102:18-102:18 
 ( 
 ID 
 102:19-102:19 
 n 
 COLON 
 102:21-102:21 
 : 
 type 
 ID 
 102:23-102:23 
 i 
 COMMA 
 102:24-102:24 
 , 
 ID 
 102:26-102:28 
 rev 
 COLON 
 102:30-102:30 
 : 
 type 
 ID 
 102:32-102:32 
 i 
 RBRACKET 
 102:33-102:33 
 ) 
 COLON 
 102:35-102:35 
 : 
 type 
 ID 
 102:37-102:37 
 b 
 EQUALS 
 102:39-102:39 
 = 
 expr 
 IF 
 103:5-103:6 
 if 
 expr 
 expr 
 ID 
 103:8-103:14 
 is_zero 
 LBRACKET 
 103:15-103:15 
 ( 
 expr 
 ID 
 103:16-103:16 
 n 
 RBRACKET 
 103:17-103:17 
 ) 
 THEN 
 103:19-103:22 
 then 
 expr 
 expr 
 ID 
 104:9-104:9 
 n 
 EEQUALS 
 104:11-104:12 
 == 
 expr 
 ID 
 104:14-104:16 
 rev 
 ELSE 
 105:5-105:8 
 else 
 expr 
 expr 
 ID 
 106:9-106:21 
 is_palindrome 
 LBRACKET 
 106:22-106:22 
 ( 
 expr 
 expr 
 ID 
 106:23-106:23 
 n 
 SLASH 
 106:25-106:25 
 / 
 expr 
 NUM 
 106:27-106:28 
 10 
 COMMA 
 106:29-106:29 
 , 
 expr 
 expr 
 expr 
 ID 
 106:31-106:33 
 rev 
 ASTERISK 
 106:35-106:35 
 * 
 expr 
 NUM 
 106:37-106:38 
 10 
 PLUS 
 106:40-106:40 
 + 
 expr 
 expr 
 ID 
 106:42-106:42 
 n 
 PERCENT 
 106:44-106:44 
 % 
 expr 
 NUM 
 106:46-106:47 
 10 
 RBRACKET 
 106:48-106:48 
 ) 
 END 
 107:5-107:7 
 end 
 defn 
 FUN 
 109:1-109:3 
 fun 
 ID 
 109:5-109:14 
 count_bits 
 LBRACKET 
 109:15-109:15 
 ( 
 ID 
 109:16-109:16 
 n 
 COLON 
 109:18-109:18 
 : 
 type 
 ID 
 109:20-109:20 
 i 
 RBRACKET 
 109:21-109:21 
 ) 
 COLON 
 109:23-109:23 
 : 
 type 
 ID 
 109:25-109:25 
 i 
 EQUALS 
 109:27-109:27 
 = 
 expr 
 IF 
 110:5-110:6 
 if 
 expr 
 expr 
 ID 
 110:8-110:14 
 is_zero 
 LBRACKET 
 110:15-110:15 
 ( 
 expr 
 ID 
 110:16-110:16 
 n 
 RBRACKET 
 110:17-110:17 
 ) 
 THEN 
 110:19-110:22 
 then 
 expr 
 NUM 
 111:9-111:9 
 0 
 ELSE 
 112:5-112:8 
 else 
 expr 
 expr 
 expr 
 ID 
 113:9-113:9 
 n 
 PERCENT 
 113:11-113:11 
 % 
 expr 
 NUM 
 113:13-113:13 
 2 
 PLUS 
 113:15-113:15 
 + 
 expr 
 expr 
 ID 
 113:17-113:26 
 count_bits 
 LBRACKET 
 113:27-113:27 
 ( 
 expr 
 expr 
 ID 
 113:28-113:28 
 n 
 SLASH 
 113:30-113:30 
 / 
 expr 
 NUM 
 113:32-113:32 
 2 
 RBRACKET 
 113:33-113:33 
 ) 
 END 
 114:5-114:7 
 end 
 defn 
 FUN 
 116:1-116:3 
 fun 
 ID 
 116:5-116:8 
 main 
 LBRACKET 
 116:9-116:9 
 ( 
 RBRACKET 
 116:10-116:10 
 ) 
 COLON 
 116:12-116:12 
 : 
 type 
 ID 
 116:14-116:14 
 i 
 EQUALS 
 116:16-116:16 
 = 
 expr 
 LET 
 117:5-117:7 
 let 
 defn 
 VAR 
 118:9-118:11 
 var 
 ID 
 118:13-118:13 
 a 
 COLON 
 118:15-118:15 
 : 
 type 
 ID 
 118:17-118:17 
 i 
 defn 
 VAR 
 119:9-119:11 
 var 
 ID 
 119:13-119:14 
 bb 
 COLON 
 119:16-119:16 
 : 
 type 
 ID 
 119:18-119:18 
 i 
 defn 
 VAR 
 120:9-120:11 
 var 
 ID 
 120:13-120:14 
 cc 
 COLON 
 120:16-120:16 
 : 
 type 
 ID 
 120:18-120:18 
 i 
 defn 
 VAR 
 121:9-121:11 
 var 
 ID 
 121:13-121:14 
 dd 
 COLON 
 121:16-121:16 
 : 
 type 
 ID 
 121:18-121:18 
 i 
 defn 
 VAR 
 122:9-122:11 
 var 
 ID 
 122:13-122:13 
 e 
 COLON 
 122:15-122:15 
 : 
 type 
 ID 
 122:17-122:17 
 i 
 defn 
 VAR 
 123:9-123:11 
 var 
 ID 
 123:13-123:13 
 f 
 COLON 
 123:15-123:15 
 : 
 type 
 ID 
 123:17-123:17 
 b 
 defn 
 VAR 
 124:9-124:11 
 var 
 ID 
 124:13-124:13 
 g 
 COLON 
 124:15-124:15 
 : 
 type 
 ID 
 124:17-124:17 
 b 
 defn 
 TYP 
 125:9-125:11 
 typ 
 ID 
 125:13-125:14 
 li 
 EQUALS 
 125:16-125:16 
 = 
 type 
 ID 
 125:18-125:18 
 i 
 defn 
 TYP 
 126:9-126:11 
 typ 
 ID 
 126:13-126:14 
 lb 
 EQUALS 
 126:16-126:16 
 = 
 type 
 ID 
 126:18-126:18 
 b 
 defn 
 FUN 
 127:9-127:11 
 fun 
 ID 
 127:13-127:21 
 local_max 
 LBRACKET 
 127:22-127:22 
 ( 
 ID 
 127:23-127:23 
 x 
 COLON 
 127:25-127:25 
 : 
 type 
 ID 
 127:27-127:28 
 li 
 COMMA 
 127:29-127:29 
 , 
 ID 
 127:31-127:31 
 y 
 COLON 
 127:33-127:33 
 : 
 type 
 ID 
 127:35-127:36 
 li 
 RBRACKET 
 127:37-127:37 
 ) 
 COLON 
 127:39-127:39 
 : 
 type 
 ID 
 127:41-127:42 
 li 
 EQUALS 
 127:44-127:44 
 = 
 expr 
 IF 
 128:13-128:14 
 if 
 expr 
 expr 
 ID 
 128:16-128:16 
 x 
 GT 
 128:18-128:18 
 > 
 expr 
 ID 
 128:20-128:20 
 y 
 THEN 
 128:22-128:25 
 then 
 expr 
 ID 
 129:17-129:17 
 x 
 ELSE 
 130:13-130:16 
 else 
 expr 
 ID 
 131:17-131:17 
 y 
 END 
 132:13-132:15 
 end 
 defn 
 FUN 
 133:9-133:11 
 fun 
 ID 
 133:13-133:21 
 local_and 
 LBRACKET 
 133:22-133:22 
 ( 
 ID 
 133:23-133:23 
 x 
 COLON 
 133:25-133:25 
 : 
 type 
 ID 
 133:27-133:28 
 lb 
 COMMA 
 133:29-133:29 
 , 
 ID 
 133:31-133:31 
 y 
 COLON 
 133:33-133:33 
 : 
 type 
 ID 
 133:35-133:36 
 lb 
 RBRACKET 
 133:37-133:37 
 ) 
 COLON 
 133:39-133:39 
 : 
 type 
 ID 
 133:41-133:42 
 lb 
 EQUALS 
 133:44-133:44 
 = 
 expr 
 expr 
 ID 
 134:13-134:13 
 x 
 AND 
 134:15-134:17 
 and 
 expr 
 ID 
 134:19-134:19 
 y 
 defn 
 FUN 
 135:9-135:11 
 fun 
 ID 
 135:13-135:18 
 triple 
 LBRACKET 
 135:19-135:19 
 ( 
 ID 
 135:20-135:20 
 x 
 COLON 
 135:22-135:22 
 : 
 type 
 ID 
 135:24-135:25 
 li 
 RBRACKET 
 135:26-135:26 
 ) 
 COLON 
 135:28-135:28 
 : 
 type 
 ID 
 135:30-135:31 
 li 
 EQUALS 
 135:33-135:33 
 = 
 expr 
 expr 
 ID 
 136:13-136:13 
 x 
 ASTERISK 
 136:15-136:15 
 * 
 expr 
 NUM 
 136:17-136:17 
 3 
 defn 
 FUN 
 137:9-137:11 
 fun 
 ID 
 137:13-137:19 
 compose 
 LBRACKET 
 137:20-137:20 
 ( 
 ID 
 137:21-137:21 
 x 
 COLON 
 137:23-137:23 
 : 
 type 
 ID 
 137:25-137:26 
 li 
 RBRACKET 
 137:27-137:27 
 ) 
 COLON 
 137:29-137:29 
 : 
 type 
 ID 
 137:31-137:32 
 li 
 EQUALS 
 137:34-137:34 
 = 
 expr 
 expr 
 ID 
 138:13-138:18 
 triple 
 LBRACKET 
 138:19-138:19 
 ( 
 expr 
 expr 
 ID 
 138:20-138:25 
 triple 
 LBRACKET 
 138:26-138:26 
 ( 
 expr 
 ID 
 138:27-138:27 
 x 
 RBRACKET 
 138:28-138:28 
 ) 
 RBRACKET 
 138:29-138:29 
 ) 
 IN 
 139:5-139:6 
 in 
 expr 
 expr 
 ID 
 140:9-140:15 
 counter 
 EQUALS 
 140:17-140:17 
 = 
 expr 
 NUM 
 140:19-140:19 
 0 
 COMMA 
 140:20-140:20 
 , 
 expr 
 expr 
 ID 
 141:9-141:14 
 result 
 EQUALS 
 141:16-141:16 
 = 
 expr 
 NUM 
 141:18-141:18 
 0 
 COMMA 
 141:19-141:19 
 , 
 expr 
 expr 
 ID 
 142:9-142:12 
 flag 
 EQUALS 
 142:14-142:14 
 = 
 expr 
 TRUE 
 142:16-142:19 
 true 
 COMMA 
 142:20-142:20 
 , 
 expr 
 expr 
 ID 
 143:9-143:9 
 a 
 EQUALS 
 143:11-143:11 
 = 
 expr 
 expr 
 ID 
 143:13-143:15 
 fib 
 LBRACKET 
 143:16-143:16 
 ( 
 expr 
 NUM 
 143:17-143:18 
 10 
 RBRACKET 
 143:19-143:19 
 ) 
 COMMA 
 143:20-143:20 
 , 
 expr 
 expr 
 ID 
 144:9-144:10 
 bb 
 EQUALS 
 144:12-144:12 
 = 
 expr 
 expr 
 ID 
 144:14-144:16 
 pow 
 LBRACKET 
 144:17-144:17 
 ( 
 expr 
 NUM 
 144:18-144:18 
 2 
 COMMA 
 144:19-144:19 
 , 
 expr 
 NUM 
 144:21-144:21 
 8 
 RBRACKET 
 144:22-144:22 
 ) 
 COMMA 
 144:23-144:23 
 , 
 expr 
 expr 
 ID 
 145:9-145:10 
 cc 
 EQUALS 
 145:12-145:12 
 = 
 expr 
 expr 
 ID 
 145:14-145:16 
 gcd 
 LBRACKET 
 145:17-145:17 
 ( 
 expr 
 ID 
 145:18-145:19 
 bb 
 COMMA 
 145:20-145:20 
 , 
 expr 
 ID 
 145:22-145:22 
 a 
 RBRACKET 
 145:23-145:23 
 ) 
 COMMA 
 145:24-145:24 
 , 
 expr 
 expr 
 ID 
 146:9-146:10 
 dd 
 EQUALS 
 146:12-146:12 
 = 
 expr 
 expr 
 ID 
 146:14-146:19 
 sum_to 
 LBRACKET 
 146:20-146:20 
 ( 
 expr 
 NUM 
 146:21-146:23 
 100 
 RBRACKET 
 146:24-146:24 
 ) 
 COMMA 
 146:25-146:25 
 , 
 expr 
 expr 
 ID 
 147:9-147:9 
 e 
 EQUALS 
 147:11-147:11 
 = 
 expr 
 expr 
 ID 
 147:13-147:19 
 collatz 
 LBRACKET 
 147:20-147:20 
 ( 
 expr 
 NUM 
 147:21-147:22 
 27 
 RBRACKET 
 147:23-147:23 
 ) 
 COMMA 
 147:24-147:24 
 , 
 expr 
 expr 
 ID 
 148:9-148:9 
 f 
 EQUALS 
 148:11-148:11 
 = 
 expr 
 expr 
 ID 
 148:13-148:19 
 is_even 
 LBRACKET 
 148:20-148:20 
 ( 
 expr 
 ID 
 148:21-148:21 
 a 
 RBRACKET 
 148:22-148:22 
 ) 
 COMMA 
 148:23-148:23 
 , 
 expr 
 expr 
 ID 
 149:9-149:9 
 g 
 EQUALS 
 149:11-149:11 
 = 
 expr 
 expr 
 ID 
 149:13-149:25 
 is_palindrome 
 LBRACKET 
 149:26-149:26 
 ( 
 expr 
 NUM 
 149:27-149:31 
 12321 
 COMMA 
 149:32-149:32 
 , 
 expr 
 NUM 
 149:34-149:34 
 0 
 RBRACKET 
 149:35-149:35 
 ) 
 COMMA 
 149:36-149:36 
 , 
 expr 
 expr 
 ID 
 150:9-150:14 
 result 
 EQUALS 
 150:16-150:16 
 = 
 expr 
 expr 
 ID 
 150:18-150:26 
 local_max 
 LBRACKET 
 150:27-150:27 
 ( 
 expr 
 ID 
 150:28-150:28 
 a 
 COMMA 
 150:29-150:29 
 , 
 expr 
 ID 
 150:31-150:32 
 bb 
 RBRACKET 
 150:33-150:33 
 ) 
 COMMA 
 150:34-150:34 
 , 
 expr 
 expr 
 ID 
 151:9-151:14 
 result 
 EQUALS 
 151:16-151:16 
 = 
 expr 
 expr 
 ID 
 151:18-151:24 
 compose 
 LBRACKET 
 151:25-151:25 
 ( 
 expr 
 ID 
 151:26-151:31 
 result 
 RBRACKET 
 151:32-151:32 
 ) 
 COMMA 
 151:33-151:33 
 , 
 expr 
 expr 
 ID 
 152:9-152:15 
 counter 
 EQUALS 
 152:17-152:17 
 = 
 expr 
 expr 
 ID 
 152:19-152:27 
 ackermann 
 LBRACKET 
 152:28-152:28 
 ( 
 expr 
 NUM 
 152:29-152:29 
 3 
 COMMA 
 152:30-152:30 
 , 
 expr 
 NUM 
 152:32-152:32 
 2 
 RBRACKET 
 152:33-152:33 
 ) 
 COMMA 
 152:34-152:34 
 , 
 expr 
 LET 
 153:9-153:11 
 let 
 defn 
 VAR 
 154:13-154:15 
 var 
 ID 
 154:17-154:24 
 shadow_a 
 COLON 
 154:26-154:26 
 : 
 type 
 ID 
 154:28-154:28 
 i 
 defn 
 VAR 
 155:13-155:15 
 var 
 ID 
 155:17-155:24 
 shadow_b 
 COLON 
 155:26-155:26 
 : 
 type 
 ID 
 155:28-155:28 
 i 
 defn 
 VAR 
 156:13-156:15 
 var 
 ID 
 156:17-156:24 
 shadow_f 
 COLON 
 156:26-156:26 
 : 
 type 
 ID 
 156:28-156:28 
 b 
 defn 
 VAR 
 157:13-157:15 
 var 
 ID 
 157:17-157:23 
 counter 
 COLON 
 157:25-157:25 
 : 
 type 
 ID 
 157:27-157:27 
 i 
 defn 
 VAR 
 158:13-158:15 
 var 
 ID 
 158:17-158:22 
 result 
 COLON 
 158:24-158:24 
 : 
 type 
 ID 
 158:26-158:26 
 i 
 defn 
 FUN 
 159:13-159:15 
 fun 
 ID 
 159:17-159:26 
 shadow_fib 
 LBRACKET 
 159:27-159:27 
 ( 
 ID 
 159:28-159:28 
 n 
 COLON 
 159:30-159:30 
 : 
 type 
 ID 
 159:32-159:32 
 i 
 RBRACKET 
 159:33-159:33 
 ) 
 COLON 
 159:35-159:35 
 : 
 type 
 ID 
 159:37-159:37 
 i 
 EQUALS 
 159:39-159:39 
 = 
 expr 
 IF 
 160:17-160:18 
 if 
 expr 
 expr 
 ID 
 160:20-160:20 
 n 
 EEQUALS 
 160:22-160:23 
 == 
 expr 
 NUM 
 160:25-160:25 
 0 
 THEN 
 160:27-160:30 
 then 
 expr 
 NUM 
 161:21-161:21 
 0 
 ELSE 
 162:17-162:20 
 else 
 expr 
 IF 
 163:21-163:22 
 if 
 expr 
 expr 
 ID 
 163:24-163:24 
 n 
 EEQUALS 
 163:26-163:27 
 == 
 expr 
 NUM 
 163:29-163:29 
 1 
 THEN 
 163:31-163:34 
 then 
 expr 
 NUM 
 164:25-164:25 
 1 
 ELSE 
 165:21-165:24 
 else 
 expr 
 expr 
 expr 
 ID 
 166:25-166:34 
 shadow_fib 
 LBRACKET 
 166:35-166:35 
 ( 
 expr 
 expr 
 ID 
 166:36-166:36 
 n 
 MINUS 
 166:38-166:38 
 - 
 expr 
 NUM 
 166:40-166:40 
 1 
 RBRACKET 
 166:41-166:41 
 ) 
 PLUS 
 166:43-166:43 
 + 
 expr 
 expr 
 ID 
 166:45-166:54 
 shadow_fib 
 LBRACKET 
 166:55-166:55 
 ( 
 expr 
 expr 
 ID 
 166:56-166:56 
 n 
 MINUS 
 166:58-166:58 
 - 
 expr 
 NUM 
 166:60-166:60 
 2 
 RBRACKET 
 166:61-166:61 
 ) 
 END 
 167:21-167:23 
 end 
 END 
 168:17-168:19 
 end 
 defn 
 FUN 
 169:13-169:15 
 fun 
 ID 
 169:17-169:26 
 accumulate 
 LBRACKET 
 169:27-169:27 
 ( 
 ID 
 169:28-169:28 
 n 
 COLON 
 169:30-169:30 
 : 
 type 
 ID 
 169:32-169:32 
 i 
 COMMA 
 169:33-169:33 
 , 
 ID 
 169:35-169:37 
 acc 
 COLON 
 169:39-169:39 
 : 
 type 
 ID 
 169:41-169:41 
 i 
 RBRACKET 
 169:42-169:42 
 ) 
 COLON 
 169:44-169:44 
 : 
 type 
 ID 
 169:46-169:46 
 i 
 EQUALS 
 169:48-169:48 
 = 
 expr 
 IF 
 170:17-170:18 
 if 
 expr 
 expr 
 ID 
 170:20-170:26 
 is_zero 
 LBRACKET 
 170:27-170:27 
 ( 
 expr 
 ID 
 170:28-170:28 
 n 
 RBRACKET 
 170:29-170:29 
 ) 
 THEN 
 170:31-170:34 
 then 
 expr 
 ID 
 171:21-171:23 
 acc 
 ELSE 
 172:17-172:20 
 else 
 expr 
 expr 
 ID 
 173:21-173:30 
 accumulate 
 LBRACKET 
 173:31-173:31 
 ( 
 expr 
 expr 
 ID 
 173:32-173:32 
 n 
 MINUS 
 173:34-173:34 
 - 
 expr 
 NUM 
 173:36-173:36 
 1 
 COMMA 
 173:37-173:37 
 , 
 expr 
 expr 
 ID 
 173:39-173:41 
 acc 
 PLUS 
 173:43-173:43 
 + 
 expr 
 ID 
 173:45-173:45 
 n 
 RBRACKET 
 173:46-173:46 
 ) 
 END 
 174:17-174:19 
 end 
 IN 
 175:9-175:10 
 in 
 expr 
 expr 
 ID 
 176:13-176:20 
 shadow_a 
 EQUALS 
 176:22-176:22 
 = 
 expr 
 expr 
 ID 
 176:24-176:33 
 shadow_fib 
 LBRACKET 
 176:34-176:34 
 ( 
 expr 
 NUM 
 176:35-176:36 
 15 
 RBRACKET 
 176:37-176:37 
 ) 
 COMMA 
 176:38-176:38 
 , 
 expr 
 expr 
 ID 
 177:13-177:20 
 shadow_b 
 EQUALS 
 177:22-177:22 
 = 
 expr 
 expr 
 ID 
 177:24-177:33 
 accumulate 
 LBRACKET 
 177:34-177:34 
 ( 
 expr 
 NUM 
 177:35-177:36 
 50 
 COMMA 
 177:37-177:37 
 , 
 expr 
 NUM 
 177:39-177:39 
 0 
 RBRACKET 
 177:40-177:40 
 ) 
 COMMA 
 177:41-177:41 
 , 
 expr 
 expr 
 ID 
 178:13-178:20 
 shadow_f 
 EQUALS 
 178:22-178:22 
 = 
 expr 
 expr 
 ID 
 178:24-178:32 
 local_and 
 LBRACKET 
 178:33-178:33 
 ( 
 expr 
 ID 
 178:34-178:34 
 f 
 COMMA 
 178:35-178:35 
 , 
 expr 
 ID 
 178:37-178:37 
 g 
 RBRACKET 
 178:38-178:38 
 ) 
 COMMA 
 178:39-178:39 
 , 
 expr 
 expr 
 ID 
 179:13-179:19 
 counter 
 EQUALS 
 179:21-179:21 
 = 
 expr 
 expr 
 ID 
 179:23-179:31 
 digit_sum 
 LBRACKET 
 179:32-179:32 
 ( 
 expr 
 expr 
 ID 
 179:33-179:40 
 shadow_a 
 ASTERISK 
 179:42-179:42 
 * 
 expr 
 ID 
 179:44-179:51 
 shadow_b 
 RBRACKET 
 179:52-179:52 
 ) 
 COMMA 
 179:53-179:53 
 , 
 expr 
 expr 
 ID 
 180:13-180:18 
 result 
 EQUALS 
 180:20-180:20 
 = 
 expr 
 expr 
 ID 
 180:22-180:24 
 min 
 LBRACKET 
 180:25-180:25 
 ( 
 expr 
 ID 
 180:26-180:33 
 shadow_a 
 COMMA 
 180:34-180:34 
 , 
 expr 
 ID 
 180:36-180:43 
 shadow_b 
 RBRACKET 
 180:44-180:44 
 ) 
 COMMA 
 180:45-180:45 
 , 
 expr 
 WHILE 
 181:13-181:17 
 while 
 expr 
 expr 
 ID 
 181:19-181:25 
 counter 
 GT 
 181:27-181:27 
 > 
 expr 
 NUM 
 181:29-181:29 
 0 
 DO 
 181:31-181:32 
 do 
 expr 
 IF 
 182:17-182:18 
 if 
 expr 
 expr 
 ID 
 182:20-182:26 
 is_even 
 LBRACKET 
 182:27-182:27 
 ( 
 expr 
 ID 
 182:28-182:34 
 counter 
 RBRACKET 
 182:35-182:35 
 ) 
 THEN 
 182:37-182:40 
 then 
 expr 
 expr 
 ID 
 183:21-183:26 
 result 
 EQUALS 
 183:28-183:28 
 = 
 expr 
 expr 
 ID 
 183:30-183:35 
 result 
 PLUS 
 183:37-183:37 
 + 
 expr 
 expr 
 ID 
 183:39-183:48 
 shadow_fib 
 LBRACKET 
 183:49-183:49 
 ( 
 expr 
 ID 
 183:50-183:56 
 counter 
 RBRACKET 
 183:57-183:57 
 ) 
 ELSE 
 184:17-184:20 
 else 
 expr 
 expr 
 ID 
 185:21-185:26 
 result 
 EQUALS 
 185:28-185:28 
 = 
 expr 
 expr 
 ID 
 185:30-185:35 
 result 
 MINUS 
 185:37-185:37 
 - 
 expr 
 expr 
 ID 
 185:39-185:47 
 digit_sum 
 LBRACKET 
 185:48-185:48 
 ( 
 expr 
 ID 
 185:49-185:55 
 counter 
 RBRACKET 
 185:56-185:56 
 ) 
 END 
 186:17-186:19 
 end 
 COMMA 
 186:20-186:20 
 , 
 expr 
 expr 
 ID 
 187:17-187:23 
 counter 
 EQUALS 
 187:25-187:25 
 = 
 expr 
 expr 
 ID 
 187:27-187:33 
 counter 
 MINUS 
 187:35-187:35 
 - 
 expr 
 NUM 
 187:37-187:37 
 1 
 END 
 188:13-188:15 
 end 
 COMMA 
 188:16-188:16 
 , 
 expr 
 LET 
 189:13-189:15 
 let 
 defn 
 VAR 
 190:17-190:19 
 var 
 ID 
 190:21-190:25 
 deep1 
 COLON 
 190:27-190:27 
 : 
 type 
 ID 
 190:29-190:29 
 i 
 defn 
 VAR 
 191:17-191:19 
 var 
 ID 
 191:21-191:25 
 deep2 
 COLON 
 191:27-191:27 
 : 
 type 
 ID 
 191:29-191:29 
 i 
 defn 
 VAR 
 192:17-192:19 
 var 
 ID 
 192:21-192:25 
 deep3 
 COLON 
 192:27-192:27 
 : 
 type 
 ID 
 192:29-192:29 
 b 
 defn 
 VAR 
 193:17-193:19 
 var 
 ID 
 193:21-193:25 
 deep4 
 COLON 
 193:27-193:27 
 : 
 type 
 ID 
 193:29-193:29 
 i 
 defn 
 TYP 
 194:17-194:19 
 typ 
 ID 
 194:21-194:22 
 di 
 EQUALS 
 194:24-194:24 
 = 
 type 
 ID 
 194:26-194:26 
 i 
 defn 
 FUN 
 195:17-195:19 
 fun 
 ID 
 195:21-195:28 
 deep_pow 
 LBRACKET 
 195:29-195:29 
 ( 
 ID 
 195:30-195:30 
 b 
 COLON 
 195:32-195:32 
 : 
 type 
 ID 
 195:34-195:35 
 di 
 COMMA 
 195:36-195:36 
 , 
 ID 
 195:38-195:38 
 e 
 COLON 
 195:40-195:40 
 : 
 type 
 ID 
 195:42-195:43 
 di 
 RBRACKET 
 195:44-195:44 
 ) 
 COLON 
 195:46-195:46 
 : 
 type 
 ID 
 195:48-195:49 
 di 
 EQUALS 
 195:51-195:51 
 = 
 expr 
 IF 
 196:21-196:22 
 if 
 expr 
 expr 
 ID 
 196:24-196:30 
 is_zero 
 LBRACKET 
 196:31-196:31 
 ( 
 expr 
 ID 
 196:32-196:32 
 e 
 RBRACKET 
 196:33-196:33 
 ) 
 THEN 
 196:35-196:38 
 then 
 expr 
 NUM 
 197:25-197:25 
 1 
 ELSE 
 198:21-198:24 
 else 
 expr 
 expr 
 ID 
 199:25-199:25 
 b 
 ASTERISK 
 199:27-199:27 
 * 
 expr 
 expr 
 ID 
 199:29-199:36 
 deep_pow 
 LBRACKET 
 199:37-199:37 
 ( 
 expr 
 ID 
 199:38-199:38 
 b 
 COMMA 
 199:39-199:39 
 , 
 expr 
 expr 
 ID 
 199:41-199:41 
 e 
 MINUS 
 199:43-199:43 
 - 
 expr 
 NUM 
 199:45-199:45 
 1 
 RBRACKET 
 199:46-199:46 
 ) 
 END 
 200:21-200:23 
 end 
 defn 
 FUN 
 201:17-201:19 
 fun 
 ID 
 201:21-201:32 
 deep_collatz 
 LBRACKET 
 201:33-201:33 
 ( 
 ID 
 201:34-201:34 
 n 
 COLON 
 201:36-201:36 
 : 
 type 
 ID 
 201:38-201:39 
 di 
 RBRACKET 
 201:40-201:40 
 ) 
 COLON 
 201:42-201:42 
 : 
 type 
 ID 
 201:44-201:45 
 di 
 EQUALS 
 201:47-201:47 
 = 
 expr 
 IF 
 202:21-202:22 
 if 
 expr 
 expr 
 ID 
 202:24-202:24 
 n 
 EEQUALS 
 202:26-202:27 
 == 
 expr 
 NUM 
 202:29-202:29 
 1 
 THEN 
 202:31-202:34 
 then 
 expr 
 NUM 
 203:25-203:25 
 0 
 ELSE 
 204:21-204:24 
 else 
 expr 
 IF 
 205:25-205:26 
 if 
 expr 
 expr 
 ID 
 205:28-205:34 
 is_even 
 LBRACKET 
 205:35-205:35 
 ( 
 expr 
 ID 
 205:36-205:36 
 n 
 RBRACKET 
 205:37-205:37 
 ) 
 THEN 
 205:39-205:42 
 then 
 expr 
 expr 
 NUM 
 206:29-206:29 
 1 
 PLUS 
 206:31-206:31 
 + 
 expr 
 expr 
 ID 
 206:33-206:44 
 deep_collatz 
 LBRACKET 
 206:45-206:45 
 ( 
 expr 
 expr 
 ID 
 206:46-206:46 
 n 
 SLASH 
 206:48-206:48 
 / 
 expr 
 NUM 
 206:50-206:50 
 2 
 RBRACKET 
 206:51-206:51 
 ) 
 ELSE 
 207:25-207:28 
 else 
 expr 
 expr 
 NUM 
 208:29-208:29 
 1 
 PLUS 
 208:31-208:31 
 + 
 expr 
 expr 
 ID 
 208:33-208:44 
 deep_collatz 
 LBRACKET 
 208:45-208:45 
 ( 
 expr 
 expr 
 expr 
 NUM 
 208:46-208:46 
 3 
 ASTERISK 
 208:48-208:48 
 * 
 expr 
 ID 
 208:50-208:50 
 n 
 PLUS 
 208:52-208:52 
 + 
 expr 
 NUM 
 208:54-208:54 
 1 
 RBRACKET 
 208:55-208:55 
 ) 
 END 
 209:25-209:27 
 end 
 END 
 210:21-210:23 
 end 
 defn 
 FUN 
 211:17-211:19 
 fun 
 ID 
 211:21-211:26 
 toggle 
 LBRACKET 
 211:27-211:27 
 ( 
 ID 
 211:28-211:28 
 x 
 COLON 
 211:30-211:30 
 : 
 type 
 ID 
 211:32-211:33 
 lb 
 RBRACKET 
 211:34-211:34 
 ) 
 COLON 
 211:36-211:36 
 : 
 type 
 ID 
 211:38-211:39 
 lb 
 EQUALS 
 211:41-211:41 
 = 
 expr 
 IF 
 212:21-212:22 
 if 
 expr 
 ID 
 212:24-212:24 
 x 
 THEN 
 212:26-212:29 
 then 
 expr 
 FALSE 
 213:25-213:29 
 false 
 ELSE 
 214:21-214:24 
 else 
 expr 
 TRUE 
 215:25-215:28 
 true 
 END 
 216:21-216:23 
 end 
 IN 
 217:13-217:14 
 in 
 expr 
 expr 
 ID 
 218:17-218:21 
 deep1 
 EQUALS 
 218:23-218:23 
 = 
 expr 
 expr 
 ID 
 218:25-218:32 
 deep_pow 
 LBRACKET 
 218:33-218:33 
 ( 
 expr 
 NUM 
 218:34-218:34 
 2 
 COMMA 
 218:35-218:35 
 , 
 expr 
 expr 
 ID 
 218:37-218:43 
 counter 
 PERCENT 
 218:45-218:45 
 % 
 expr 
 NUM 
 218:47-218:48 
 10 
 RBRACKET 
 218:49-218:49 
 ) 
 COMMA 
 218:50-218:50 
 , 
 expr 
 expr 
 ID 
 219:17-219:21 
 deep2 
 EQUALS 
 219:23-219:23 
 = 
 expr 
 expr 
 ID 
 219:25-219:36 
 deep_collatz 
 LBRACKET 
 219:37-219:37 
 ( 
 expr 
 expr 
 expr 
 ID 
 219:38-219:44 
 abs_val 
 LBRACKET 
 219:45-219:45 
 ( 
 expr 
 ID 
 219:46-219:51 
 result 
 RBRACKET 
 219:52-219:52 
 ) 
 PLUS 
 219:54-219:54 
 + 
 expr 
 NUM 
 219:56-219:56 
 1 
 RBRACKET 
 219:57-219:57 
 ) 
 COMMA 
 219:58-219:58 
 , 
 expr 
 expr 
 ID 
 220:17-220:21 
 deep3 
 EQUALS 
 220:23-220:23 
 = 
 expr 
 expr 
 ID 
 220:25-220:30 
 toggle 
 LBRACKET 
 220:31-220:31 
 ( 
 expr 
 ID 
 220:32-220:39 
 shadow_f 
 RBRACKET 
 220:40-220:40 
 ) 
 COMMA 
 220:41-220:41 
 , 
 expr 
 expr 
 ID 
 221:17-221:21 
 deep4 
 EQUALS 
 221:23-221:23 
 = 
 expr 
 expr 
 ID 
 221:25-221:27 
 max 
 LBRACKET 
 221:28-221:28 
 ( 
 expr 
 ID 
 221:29-221:33 
 deep1 
 COMMA 
 221:34-221:34 
 , 
 expr 
 ID 
 221:36-221:40 
 deep2 
 RBRACKET 
 221:41-221:41 
 ) 
 COMMA 
 221:42-221:42 
 , 
 expr 
 expr 
 ID 
 222:17-222:20 
 flag 
 EQUALS 
 222:22-222:22 
 = 
 expr 
 expr 
 ID 
 222:24-222:32 
 local_and 
 LBRACKET 
 222:33-222:33 
 ( 
 expr 
 ID 
 222:34-222:38 
 deep3 
 COMMA 
 222:39-222:39 
 , 
 expr 
 expr 
 ID 
 222:41-222:47 
 is_even 
 LBRACKET 
 222:48-222:48 
 ( 
 expr 
 ID 
 222:49-222:53 
 deep4 
 RBRACKET 
 222:54-222:54 
 ) 
 RBRACKET 
 222:55-222:55 
 ) 
 COMMA 
 222:56-222:56 
 , 
 expr 
 WHILE 
 223:17-223:21 
 while 
 expr 
 expr 
 ID 
 223:23-223:27 
 deep4 
 GT 
 223:29-223:29 
 > 
 expr 
 NUM 
 223:31-223:31 
 0 
 DO 
 223:33-223:34 
 do 
 expr 
 IF 
 224:21-224:22 
 if 
 expr 
 expr 
 ID 
 224:24-224:30 
 is_even 
 LBRACKET 
 224:31-224:31 
 ( 
 expr 
 ID 
 224:32-224:36 
 deep4 
 RBRACKET 
 224:37-224:37 
 ) 
 THEN 
 224:39-224:42 
 then 
 expr 
 IF 
 225:25-225:26 
 if 
 expr 
 expr 
 ID 
 225:28-225:32 
 deep4 
 GT 
 225:34-225:34 
 > 
 expr 
 NUM 
 225:36-225:38 
 100 
 THEN 
 225:40-225:43 
 then 
 expr 
 expr 
 ID 
 226:29-226:33 
 deep4 
 EQUALS 
 226:35-226:35 
 = 
 expr 
 expr 
 ID 
 226:37-226:41 
 deep4 
 SLASH 
 226:43-226:43 
 / 
 expr 
 NUM 
 226:45-226:45 
 2 
 ELSE 
 227:25-227:28 
 else 
 expr 
 expr 
 ID 
 228:29-228:33 
 deep4 
 EQUALS 
 228:35-228:35 
 = 
 expr 
 expr 
 ID 
 228:37-228:41 
 deep4 
 MINUS 
 228:43-228:43 
 - 
 expr 
 NUM 
 228:45-228:45 
 1 
 END 
 229:25-229:27 
 end 
 ELSE 
 230:21-230:24 
 else 
 expr 
 IF 
 231:25-231:26 
 if 
 expr 
 expr 
 ID 
 231:28-231:34 
 is_zero 
 LBRACKET 
 231:35-231:35 
 ( 
 expr 
 expr 
 ID 
 231:36-231:40 
 deep4 
 PERCENT 
 231:42-231:42 
 % 
 expr 
 NUM 
 231:44-231:44 
 3 
 RBRACKET 
 231:45-231:45 
 ) 
 THEN 
 231:47-231:50 
 then 
 expr 
 expr 
 ID 
 232:29-232:33 
 deep4 
 EQUALS 
 232:35-232:35 
 = 
 expr 
 expr 
 ID 
 232:37-232:41 
 deep4 
 MINUS 
 232:43-232:43 
 - 
 expr 
 NUM 
 232:45-232:45 
 3 
 ELSE 
 233:25-233:28 
 else 
 expr 
 expr 
 ID 
 234:29-234:33 
 deep4 
 EQUALS 
 234:35-234:35 
 = 
 expr 
 expr 
 expr 
 expr 
 ID 
 234:37-234:41 
 deep4 
 ASTERISK 
 234:43-234:43 
 * 
 expr 
 NUM 
 234:45-234:45 
 2 
 MINUS 
 234:47-234:47 
 - 
 expr 
 ID 
 234:49-234:53 
 deep4 
 MINUS 
 234:55-234:55 
 - 
 expr 
 NUM 
 234:57-234:57 
 1 
 END 
 235:25-235:27 
 end 
 END 
 236:21-236:23 
 end 
 END 
 237:17-237:19 
 end 
 COMMA 
 237:20-237:20 
 , 
 expr 
 LET 
 238:17-238:19 
 let 
 defn 
 VAR 
 239:21-239:23 
 var 
 ID 
 239:25-239:30 
 ultra1 
 COLON 
 239:32-239:32 
 : 
 type 
 ID 
 239:34-239:34 
 i 
 defn 
 VAR 
 240:21-240:23 
 var 
 ID 
 240:25-240:30 
 ultra2 
 COLON 
 240:32-240:32 
 : 
 type 
 ID 
 240:34-240:34 
 b 
 defn 
 VAR 
 241:21-241:23 
 var 
 ID 
 241:25-241:30 
 ultra3 
 COLON 
 241:32-241:32 
 : 
 type 
 ID 
 241:34-241:34 
 i 
 defn 
 FUN 
 242:21-242:23 
 fun 
 ID 
 242:25-242:33 
 ultra_gcd 
 LBRACKET 
 242:34-242:34 
 ( 
 ID 
 242:35-242:35 
 a 
 COLON 
 242:37-242:37 
 : 
 type 
 ID 
 242:39-242:39 
 i 
 COMMA 
 242:40-242:40 
 , 
 ID 
 242:42-242:42 
 b 
 COLON 
 242:44-242:44 
 : 
 type 
 ID 
 242:46-242:46 
 i 
 RBRACKET 
 242:47-242:47 
 ) 
 COLON 
 242:49-242:49 
 : 
 type 
 ID 
 242:51-242:51 
 i 
 EQUALS 
 242:53-242:53 
 = 
 expr 
 IF 
 243:25-243:26 
 if 
 expr 
 expr 
 ID 
 243:28-243:34 
 is_zero 
 LBRACKET 
 243:35-243:35 
 ( 
 expr 
 ID 
 243:36-243:36 
 b 
 RBRACKET 
 243:37-243:37 
 ) 
 THEN 
 243:39-243:42 
 then 
 expr 
 ID 
 244:29-244:29 
 a 
 ELSE 
 245:25-245:28 
 else 
 expr 
 expr 
 ID 
 246:29-246:37 
 ultra_gcd 
 LBRACKET 
 246:38-246:38 
 ( 
 expr 
 ID 
 246:39-246:39 
 b 
 COMMA 
 246:40-246:40 
 , 
 expr 
 expr 
 ID 
 246:42-246:42 
 a 
 PERCENT 
 246:44-246:44 
 % 
 expr 
 ID 
 246:46-246:46 
 b 
 RBRACKET 
 246:47-246:47 
 ) 
 END 
 247:25-247:27 
 end 
 defn 
 FUN 
 248:21-248:23 
 fun 
 ID 
 248:25-248:33 
 ultra_sum 
 LBRACKET 
 248:34-248:34 
 ( 
 ID 
 248:35-248:35 
 n 
 COLON 
 248:37-248:37 
 : 
 type 
 ID 
 248:39-248:39 
 i 
 RBRACKET 
 248:40-248:40 
 ) 
 COLON 
 248:42-248:42 
 : 
 type 
 ID 
 248:44-248:44 
 i 
 EQUALS 
 248:46-248:46 
 = 
 expr 
 IF 
 249:25-249:26 
 if 
 expr 
 expr 
 ID 
 249:28-249:34 
 is_zero 
 LBRACKET 
 249:35-249:35 
 ( 
 expr 
 ID 
 249:36-249:36 
 n 
 RBRACKET 
 249:37-249:37 
 ) 
 THEN 
 249:39-249:42 
 then 
 expr 
 NUM 
 250:29-250:29 
 0 
 ELSE 
 251:25-251:28 
 else 
 expr 
 expr 
 ID 
 252:29-252:29 
 n 
 PLUS 
 252:31-252:31 
 + 
 expr 
 expr 
 ID 
 252:33-252:41 
 ultra_sum 
 LBRACKET 
 252:42-252:42 
 ( 
 expr 
 expr 
 ID 
 252:43-252:43 
 n 
 MINUS 
 252:45-252:45 
 - 
 expr 
 NUM 
 252:47-252:47 
 1 
 RBRACKET 
 252:48-252:48 
 ) 
 END 
 253:25-253:27 
 end 
 defn 
 FUN 
 254:21-254:23 
 fun 
 ID 
 254:25-254:34 
 ultra_bits 
 LBRACKET 
 254:35-254:35 
 ( 
 ID 
 254:36-254:36 
 n 
 COLON 
 254:38-254:38 
 : 
 type 
 ID 
 254:40-254:40 
 i 
 RBRACKET 
 254:41-254:41 
 ) 
 COLON 
 254:43-254:43 
 : 
 type 
 ID 
 254:45-254:45 
 i 
 EQUALS 
 254:47-254:47 
 = 
 expr 
 IF 
 255:25-255:26 
 if 
 expr 
 expr 
 ID 
 255:28-255:34 
 is_zero 
 LBRACKET 
 255:35-255:35 
 ( 
 expr 
 ID 
 255:36-255:36 
 n 
 RBRACKET 
 255:37-255:37 
 ) 
 THEN 
 255:39-255:42 
 then 
 expr 
 NUM 
 256:29-256:29 
 0 
 ELSE 
 257:25-257:28 
 else 
 expr 
 expr 
 expr 
 ID 
 258:29-258:29 
 n 
 PERCENT 
 258:31-258:31 
 % 
 expr 
 NUM 
 258:33-258:33 
 2 
 PLUS 
 258:35-258:35 
 + 
 expr 
 expr 
 ID 
 258:37-258:46 
 ultra_bits 
 LBRACKET 
 258:47-258:47 
 ( 
 expr 
 expr 
 ID 
 258:48-258:48 
 n 
 SLASH 
 258:50-258:50 
 / 
 expr 
 NUM 
 258:52-258:52 
 2 
 RBRACKET 
 258:53-258:53 
 ) 
 END 
 259:25-259:27 
 end 
 IN 
 260:17-260:18 
 in 
 expr 
 expr 
 ID 
 261:21-261:26 
 ultra1 
 EQUALS 
 261:28-261:28 
 = 
 expr 
 expr 
 ID 
 261:30-261:38 
 ultra_gcd 
 LBRACKET 
 261:39-261:39 
 ( 
 expr 
 ID 
 261:40-261:44 
 deep1 
 COMMA 
 261:45-261:45 
 , 
 expr 
 ID 
 261:47-261:51 
 deep2 
 RBRACKET 
 261:52-261:52 
 ) 
 COMMA 
 261:53-261:53 
 , 
 expr 
 expr 
 ID 
 262:21-262:26 
 ultra2 
 EQUALS 
 262:28-262:28 
 = 
 expr 
 expr 
 ID 
 262:30-262:36 
 is_even 
 LBRACKET 
 262:37-262:37 
 ( 
 expr 
 ID 
 262:38-262:43 
 ultra1 
 RBRACKET 
 262:44-262:44 
 ) 
 COMMA 
 262:45-262:45 
 , 
 expr 
 expr 
 ID 
 263:21-263:26 
 ultra3 
 EQUALS 
 263:28-263:28 
 = 
 expr 
 expr 
 ID 
 263:30-263:38 
 ultra_sum 
 LBRACKET 
 263:39-263:39 
 ( 
 expr 
 expr 
 ID 
 263:40-263:49 
 ultra_bits 
 LBRACKET 
 263:50-263:50 
 ( 
 expr 
 expr 
 ID 
 263:51-263:55 
 deep4 
 PLUS 
 263:57-263:57 
 + 
 expr 
 ID 
 263:59-263:64 
 ultra1 
 RBRACKET 
 263:65-263:65 
 ) 
 RBRACKET 
 263:66-263:66 
 ) 
 COMMA 
 263:67-263:67 
 , 
 expr 
 expr 
 ID 
 264:21-264:27 
 counter 
 EQUALS 
 264:29-264:29 
 = 
 expr 
 expr 
 ID 
 264:31-264:36 
 ultra3 
 PLUS 
 264:38-264:38 
 + 
 expr 
 expr 
 ID 
 264:40-264:49 
 count_bits 
 LBRACKET 
 264:50-264:50 
 ( 
 expr 
 ID 
 264:51-264:56 
 ultra1 
 RBRACKET 
 264:57-264:57 
 ) 
 COMMA 
 264:58-264:58 
 , 
 expr 
 expr 
 ID 
 265:21-265:26 
 result 
 EQUALS 
 265:28-265:28 
 = 
 expr 
 expr 
 ID 
 265:30-265:38 
 ext_print 
 LBRACKET 
 265:39-265:39 
 ( 
 expr 
 ID 
 265:40-265:46 
 counter 
 RBRACKET 
 265:47-265:47 
 ) 
 COMMA 
 265:48-265:48 
 , 
 expr 
 expr 
 ID 
 266:21-266:24 
 flag 
 EQUALS 
 266:26-266:26 
 = 
 expr 
 expr 
 ID 
 266:28-266:36 
 local_and 
 LBRACKET 
 266:37-266:37 
 ( 
 expr 
 ID 
 266:38-266:43 
 ultra2 
 COMMA 
 266:44-266:44 
 , 
 expr 
 ID 
 266:46-266:50 
 deep3 
 RBRACKET 
 266:51-266:51 
 ) 
 COMMA 
 266:52-266:52 
 , 
 expr 
 WHILE 
 267:21-267:25 
 while 
 expr 
 expr 
 ID 
 267:27-267:32 
 ultra3 
 GT 
 267:34-267:34 
 > 
 expr 
 NUM 
 267:36-267:36 
 0 
 DO 
 267:38-267:39 
 do 
 expr 
 expr 
 ID 
 268:25-268:30 
 ultra1 
 EQUALS 
 268:32-268:32 
 = 
 expr 
 expr 
 ID 
 268:34-268:42 
 ultra_gcd 
 LBRACKET 
 268:43-268:43 
 ( 
 expr 
 ID 
 268:44-268:49 
 ultra3 
 COMMA 
 268:50-268:50 
 , 
 expr 
 expr 
 ID 
 268:52-268:57 
 ultra1 
 PLUS 
 268:59-268:59 
 + 
 expr 
 NUM 
 268:61-268:61 
 1 
 RBRACKET 
 268:62-268:62 
 ) 
 COMMA 
 268:63-268:63 
 , 
 expr 
 expr 
 ID 
 269:25-269:30 
 ultra3 
 EQUALS 
 269:32-269:32 
 = 
 expr 
 expr 
 ID 
 269:34-269:39 
 ultra3 
 MINUS 
 269:41-269:41 
 - 
 expr 
 NUM 
 269:43-269:43 
 1 
 END 
 270:21-270:23 
 end 
 COMMA 
 270:24-270:24 
 , 
 expr 
 expr 
 ID 
 271:21-271:29 
 ext_print 
 LBRACKET 
 271:30-271:30 
 ( 
 expr 
 ID 
 271:31-271:36 
 result 
 RBRACKET 
 271:37-271:37 
 ) 
 COMMA 
 271:38-271:38 
 , 
 expr 
 ID 
 272:21-272:26 
 ultra3 
 END 
 273:17-273:19 
 end 
 END 
 274:13-274:15 
 end 
 END 
 275:9-275:11 
 end 
 END 
 276:5-276:7 
 end 
 EOF