Я должен сделать аксиомы в Z3, но я наблюдал пример https://ericpony.github.io/z3py-tutorial/advanced-examples.htm (Моделирование с помощью квантификаторов), и я не понимаю большинства вещей. Я хотел бы, чтобы кто-нибудь дал мне пример маленькой аксиомы в Z3py, чтобы помочь мне понять.
Пример, который я выполняю, таков:
Type = DeclareSort('Type')
subtype = Function('subtype', Type, Type, BoolSort())
array_of = Function('array_of', Type, Type)
root = Const('root', Type)
x, y, z = Consts('x y z', Type)
axioms = [ ForAll(x, subtype(x, x)),
ForAll([x, y, z], Implies(And(subtype(x, y), subtype(y, z)),
subtype(x, z))),
ForAll([x, y], Implies(And(subtype(x, y), subtype(y, x)),
x == y)),
ForAll([x, y, z], Implies(And(subtype(x, y), subtype(x, z)),
Or(subtype(y, z), subtype(z, y)))),
ForAll([x, y], Implies(subtype(x, y),
subtype(array_of(x), array_of(y)))),
ForAll(x, subtype(root, x))
]
s = Solver()
s.add(axioms)
print s
print s.check()
print "Interpretation for Type:"
print s.model()[Type]
print "Model:"
print s.model()
Проблема в том, что я не понимаю вывод.
[root = Type!val!0,
subtype = [else ->
Or(And(If(Var(0) == Type!val!1,
Type!val!1,
Type!val!0) ==
Type!val!1,
If(Var(1) == Type!val!1,
Type!val!1,
Type!val!0) ==
Type!val!1),
And(If(Var(0) == Type!val!1,
Type!val!1,
Type!val!0) ==
Type!val!0,
If(Var(1) == Type!val!1,
Type!val!1,
Type!val!0) ==
Type!val!1),
And(If(Var(0) == Type!val!1,
Type!val!1,
Type!val!0) ==
Type!val!0,
If(Var(1) == Type!val!1,
Type!val!1,
Type!val!0) ==
Type!val!0))],
array_of = [else -> Type!val!1]]
По этой причине мне нужно проверить небольшой пример, чтобы лучше понять, как он работает