function tst_match(p, t)
   local r1, r2   = match(p, t)
   assert(r1)
   print("--------------")
   for i = 1, #r1 do
      print("  expr:#" .. i .. " := " .. tostring(r1[i]))
   end
   for i = 1, #r2 do
      print("  lvl:#" .. i .. "  := " .. tostring(r2[i]))
   end
end

local env = environment()
local N   = Const("N")
local a   = Const("a")
local b   = Const("b")
local x   = Local("x", N)
local y   = Local("y", N)
local u1  = mk_global_univ("u1")
local u2  = mk_global_univ("u2")
local z   = level()
local f   = Const("f", {u1, z})
local f2  = Const("f", {u1, u1+1})
local fp  = Const("f", {mk_idx_metauniv(0), mk_idx_metauniv(1)})
local V0  = mk_idx_metavar(0, N)
local V1  = mk_idx_metavar(1, N)
tst_match(fp(V0, V0), f(a, a))
tst_match(fp(V0, V1), f2(a, b))
local F0  = mk_idx_metavar(0, Pi(x, y, N))
tst_match(F0(x, y), f(x, f(x, y)))
assert(not match(F0(x, x), f(x, f(x, y))))
assert(not match(F0(x), f(x, y)))