2014-06-23 20:39:21 +00:00
|
|
|
local env = environment()
|
|
|
|
env = add_decl(env, mk_var_decl("N", Type))
|
|
|
|
local N = Const("N")
|
|
|
|
env = add_decl(env, mk_var_decl("f", mk_arrow(N, N, N)))
|
|
|
|
env = add_decl(env, mk_var_decl("a", N))
|
|
|
|
env = add_decl(env, mk_var_decl("b", N))
|
|
|
|
local f = Const("f")
|
|
|
|
local a = Const("a")
|
|
|
|
local b = Const("b")
|
|
|
|
local m1 = mk_metavar("m1", N)
|
|
|
|
local m2 = mk_metavar("m2", N)
|
|
|
|
local m3 = mk_metavar("m3", N)
|
|
|
|
local m4 = mk_metavar("m4", N)
|
|
|
|
|
|
|
|
local o = options({"unifier", "use_exceptions"}, false)
|
|
|
|
|
|
|
|
function display_solutions(m, ss)
|
|
|
|
local n = 0
|
|
|
|
for s in ss do
|
|
|
|
print("solution: " .. tostring(s:instantiate(m)))
|
|
|
|
s:for_each_expr(function(n, v, j)
|
|
|
|
print(" " .. tostring(n) .. " := " .. tostring(v))
|
|
|
|
end)
|
|
|
|
s:for_each_level(function(n, v, j)
|
|
|
|
print(" " .. tostring(n) .. " := " .. tostring(v))
|
|
|
|
end)
|
|
|
|
n = n + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
cs = { mk_eq_cnstr(m1, f(m2, f(m3, m4))),
|
2014-07-04 19:47:33 +00:00
|
|
|
mk_choice_cnstr(m2, function(m, e, s, ngen) return {{mk_eq_cnstr(m, a)}, {mk_eq_cnstr(m, f(a, a))}} end),
|
|
|
|
mk_choice_cnstr(m3, function(m, e, s, ngen) return {mk_eq_cnstr(m, b), mk_eq_cnstr(m, f(b, b))} end),
|
|
|
|
mk_choice_cnstr(m4, function(m, e, s, ngen) return {a, b} end)
|
2014-06-23 20:39:21 +00:00
|
|
|
}
|
|
|
|
|
2014-07-02 20:14:50 +00:00
|
|
|
display_solutions(m1, unify(env, cs, name_generator(), o))
|