local env = environment() local l = param_univ("l") env = add_decl(env, mk_constant_assumption("group", {l}, mk_sort(l+1))) env = add_decl(env, mk_constant_assumption("abelian_group", {l}, mk_sort(l+1))) env = add_decl(env, mk_constant_assumption("ring", {l}, mk_sort(l+1))) env = add_decl(env, mk_constant_assumption("abelian_ring", {l}, mk_sort(l+1))) local group = Const("group", {l}) local ring = Const("ring", {l}) local ab_group = Const("abelian_group", {l}) local ab_ring = Const("abelian_ring", {l}) env = add_decl(env, mk_constant_assumption("carrier", {l}, mk_arrow(group, mk_sort(l)))) env = add_coercion(env, "carrier") env = add_decl(env, mk_constant_assumption("ag2g", {l}, mk_arrow(ab_group, group))) env = add_decl(env, mk_constant_assumption("r2g", {l}, mk_arrow(ring, group))) env = add_decl(env, mk_constant_assumption("ar2r", {l}, mk_arrow(ab_ring, ring))) env = add_decl(env, mk_constant_assumption("ar2ag", {l}, mk_arrow(ab_ring, ab_group))) env = add_coercion(env, "ag2g") env = add_coercion(env, "r2g") env = add_coercion(env, "ar2r") env = add_coercion(env, "ar2ag") for_each_coercion_sort(env, function(C, f) print(tostring(C) .. " >-> sort : " .. tostring(f)) end) for_each_coercion_user(env, function(C, D, f) print(tostring(C) .. " >-> " .. tostring(D) .. " : " .. tostring(f)) end) print(get_coercions_to_sort(env, Const("abelian_ring", {1})):head()) assert(env:type_check(get_coercions_to_sort(env, Const("abelian_ring", {1})):head())) print("Coercions (abelian ring): ") cs = get_coercions_from(env, ab_ring) for i = 1, #cs do print(tostring(cs[i][2]) .. " : " .. tostring(cs[i][4]) .. " : " .. tostring(cs[i][3])) end