local function is_border(t, n)
if n == 0 then return t[1] == nil end
return t[n] ~= nil and t[n + 1] == nil
end
local t = {}
print("empty: " .. tostring(#t == 0))
t = {}
for i = 1, 4 do t[i] = i end
print("dense_4: " .. tostring(#t == 4))
t = {}
for i = 1, 100 do t[i] = i end
print("dense_100: " .. tostring(#t == 100))
t = {}
for i = 1, 8 do t[i] = i end
print("dense_8: " .. tostring(#t == 8))
t = {}
for i = 1, 7 do t[i] = i end
print("dense_7: " .. tostring(#t == 7))
t = {}
t[1] = "x"
print("single: " .. tostring(#t == 1))
t = {}
for i = 1, 200 do t[i] = i end
t[100] = nil
print("hole_invariant: " .. tostring(is_border(t, #t)))
t = {}
for i = 1, 5 do t[i] = i end
for i = 10, 15 do t[i] = i end
print("two_runs_invariant: " .. tostring(is_border(t, #t)))
t = {}
t[2] = "a"
t[3] = "b"
print("no_first_invariant: " .. tostring(is_border(t, #t)))