使用Z3Py,我尝试构建一个Z3决定的程序意味着排序Human
为空。
from z3 import *
from z3_helper import Z3Helper
Human = DeclareSort("Human")
is_mortal = Function("is_mortal", Human, BoolSort())
h = Const('h', Human)
s = Solver()
s.add([
ForAll([h], And(is_mortal(h), Not(is_mortal(h))))
])
print s.check()
s.model()
但不是返回Human
为空的模型,而是返回unsat
。这是为什么?
如果我删除“所有人都是凡人”的公理,它会返回一个空集作为模型。
const h
的存在是否意味着需要存在至少一个Human
的问题?
答案 0 :(得分:1)
SMT-LIB和Z3认为简单地键入一阶逻辑假定所有排序都是非空的。另请参阅http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-draft-3.pdf,第5.1节。