local hs = hypotheses()
assert(is_hypotheses(hs))
assert(hs:empty())
assert(hs:is_nil())
local hs = hypotheses("H1", Const("q"), hs)
local hs = hypotheses("H2", Const("p"), hs)
local n, p = hs:head()
assert(n == name("H2"))
assert(p == Const("p"))
assert(not hs:empty())
assert(hs:tail():tail():empty())
for n, p in hs:pairs() do
   print(n, p)
end
assert(not pcall(function() hypotheses("H1", Const("q"), "H2", Const("p"), hs) end))
assert(#hs == 2)
assert(hs:size() == 2)

local g = goal(hs, Const("p1"))
assert(is_goal(g))
print(g)
assert(#(g:hypotheses()) == 2)
assert(g:conclusion() == Const("p1"))
assert(g:unique_name("H") == name("H"))
assert(g:unique_name("H1") == name("H1", 1))
print(g:pp())
local opts = options()
opts = opts:update(name("pp", "unicode"), false)
print(opts)
print(g:pp(opts))