datatype ('a, 'b) prod = Pair of 'a * 'b ; datatype ('a) list = Cons of 'a * ('a) list | Nil ; datatype ('a) heap_address = H_data of 'a | H_addr of int ; datatype ('a, 'b) heap_element = H_block of ((('a) heap_address) list, (int, 'b) prod) prod | H_ref of int | H_emp ; val getBLOCK = (fn v3 => (fn v4 => (case v4 of H_emp => v3 | (H_ref (v1)) => v3 | (H_block (v2)) => v2))) ; val UPDATE = (fn v3 => (fn v4 => (fn v2 => (fn v1 => (if (v3 = v1) then v4 else (v2 v1)))))) ; val rel_move = (fn v33 => (case v33 of (Pair (v32, v31)) => (case v32 of (H_addr (v19)) => (case v31 of (Pair (v18, v17)) => (case v17 of (Pair (v16, v15)) => (case v15 of (Pair (v14, v13)) => (case v13 of (Pair (v12, v11)) => (case v11 of (Pair (v10, v9)) => (case (v16 v19) of H_emp => (Pair ((H_addr (v18)), (Pair (v18, v16)))) | (H_ref (v1)) => (Pair ((H_addr (v1)), (Pair (v18, v16)))) | (H_block (v8)) => (case v8 of (Pair (v7, v6)) => (case v6 of (Pair (v5, v4)) => let val v3 = (((UPDATE v19) (H_ref (v18))) v16) in let val v2 = (((UPDATE v18) (H_block ((Pair (v7, (Pair (v5, v4))))))) v3) in (Pair ((H_addr (v18)), (Pair (((v18 + v5) + 1), v2)))) end end )))))))) | (H_data (v30)) => (case v31 of (Pair (v29, v28)) => (case v28 of (Pair (v27, v26)) => (case v26 of (Pair (v25, v24)) => (case v24 of (Pair (v23, v22)) => (case v22 of (Pair (v21, v20)) => (Pair ((H_data (v30)), (Pair (v29, v27)))))))))))) ; fun rel_move_list v35 = (case v35 of (Pair (v34, v33)) => (case v34 of Nil => (case v33 of (Pair (v10, v9)) => (case v9 of (Pair (v8, v7)) => (case v7 of (Pair (v6, v5)) => (case v5 of (Pair (v4, v3)) => (case v3 of (Pair (v2, v1)) => (Pair (Nil, (Pair (v10, v8))))))))) | (Cons (v32, v31)) => (case v33 of (Pair (v30, v29)) => (case v29 of (Pair (v28, v27)) => (case v27 of (Pair (v26, v25)) => (case v25 of (Pair (v24, v23)) => (case v23 of (Pair (v22, v21)) => let val v20 = (rel_move (Pair (v32, (Pair (v30, (Pair (v28, (Pair (v26, (Pair (v24, (Pair (v22, v21))))))))))))) in (case v20 of (Pair (v19, v18)) => (case v18 of (Pair (v17, v16)) => let val v15 = (rel_move_list (Pair (v31, (Pair (v17, (Pair (v16, (Pair (v26, (Pair (v24, (Pair (v22, v21))))))))))))) in (case v15 of (Pair (v14, v13)) => (case v13 of (Pair (v12, v11)) => (Pair ((Cons (v19, v14)), (Pair (v12, v11)))))) end )) end ))))))) ; val rel_gc_step = (fn v25 => (fn v26 => (case v26 of (Pair (v24, v23)) => (case v23 of (Pair (v22, v21)) => (case v21 of (Pair (v20, v19)) => (case v19 of (Pair (v18, v17)) => (case v17 of (Pair (v16, v15)) => (case v15 of (Pair (v14, v13)) => let val v12 = ((getBLOCK v25) (v20 v24)) in (case v12 of (Pair (v11, v10)) => (case v10 of (Pair (v9, v8)) => let val v7 = (rel_move_list (Pair (v11, (Pair (v22, (Pair (v20, (Pair (v18, (Pair (v16, (Pair (v14, v13))))))))))))) in (case v7 of (Pair (v6, v5)) => (case v5 of (Pair (v4, v3)) => let val v2 = (((UPDATE v24) (H_block ((Pair (v6, (Pair (v9, v8))))))) v3) in let val v1 = ((v24 + v9) + 1) in (Pair (v1, (Pair (v4, v2)))) end end )) end )) end )))))))) ; fun rel_gc_loop v21 = (fn v22 => (case v22 of (Pair (v20, v19)) => (case v19 of (Pair (v18, v17)) => (case v17 of (Pair (v16, v15)) => (case v15 of (Pair (v14, v13)) => (case v13 of (Pair (v12, v11)) => (case v11 of (Pair (v10, v9)) => (if (v20 = v18) then (Pair (v18, v16)) else (if (((v20 < v18) = false) orelse ((v18 <= v12) = false)) then (Pair (v20, v16)) else let val v8 = ((rel_gc_step v21) (Pair (v20, (Pair (v18, (Pair (v16, (Pair (v14, (Pair (v12, (Pair (v10, v9))))))))))))) in (case v8 of (Pair (v7, v6)) => (case v6 of (Pair (v5, v4)) => let val v3 = ((rel_gc_loop v21) (Pair (v7, (Pair (v5, (Pair (v4, (Pair (v14, (Pair (v12, (Pair (v10, v9))))))))))))) in (case v3 of (Pair (v2, v1)) => (Pair (v2, v1))) end )) end ))))))))) ; val RANGE = (fn v3 => (fn v4 => (case v3 of (Pair (v2, v1)) => ((v2 <= v4) andalso (v4 < v1))))) ; val CUT = (fn v4 => (fn v5 => (case v4 of (Pair (v3, v2)) => (fn v1 => (if ((RANGE (Pair (v3, v2))) v1) then (v5 v1) else H_emp))))) ; val rel_gc = (fn v27 => (fn v28 => (case v28 of (Pair (v26, v25)) => (case v25 of (Pair (v24, v23)) => (case v23 of (Pair (v22, v21)) => (case v21 of (Pair (v20, v19)) => (case v19 of (Pair (v18, v17)) => let val v16 = (Pair (v26, (Pair (v24, (Pair (v22, v20)))))) in (case v16 of (Pair (v15, v14)) => (case v14 of (Pair (v13, v12)) => (case v12 of (Pair (v11, v10)) => let val v9 = (rel_move_list (Pair (v18, (Pair (v11, (Pair (v17, (Pair (v11, (Pair (v10, (Pair (v15, v13))))))))))))) in (case v9 of (Pair (v8, v7)) => (case v7 of (Pair (v6, v5)) => let val v4 = ((rel_gc_loop v27) (Pair (v11, (Pair (v6, (Pair (v5, (Pair (v11, (Pair (v10, (Pair (v15, v13))))))))))))) in (case v4 of (Pair (v3, v2)) => let val v1 = ((CUT (Pair (v11, v3))) v2) in (Pair (v11, (Pair (v3, (Pair (v10, (Pair (v15, (Pair (v13, (Pair (v8, v1)))))))))))) end ) end )) end ))) end ))))))) ;