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