function body(e) while (e:is_pi()) do e = e:abst_body() end return e end function show_subst(r) for i = 1, #r do if r[i] then print("#" .. tostring(i) .. " <--- " .. tostring(r[i])) end end end local env = get_environment() parse_lean_cmds([[ variable f : Nat -> Nat -> Nat variable g : Nat -> Nat variable p : Nat -> Bool variables a b c : Nat ]]) local t = parse_lean([[fun x, (f (g a)) x]]) print(t) local eta = env:find_object("eta"):get_type() local eta_lhs = body(eta):arg(2) print(eta_lhs) r = hop_match(eta_lhs, t) print("r: " .. #r) show_subst(r) assert(r[3]) print(eta) local r3_type = env:infer_type(r[3]) print(r3_type) local eta3_type = eta:abst_body():abst_body():abst_domain() print(eta3_type) r2 = hop_match(eta3_type, r3_type) show_subst(r2)