【发布时间】:2020-07-04 06:08:14
【问题描述】:
作为对先前 Z3 相关问题 Using Resolution theorem proving with Z3 的扩展,并建立在 @alias 在 https://stackoverflow.com/a/62721185/13861050 的答案之上
我又添加了一些函数和关系:
FEMALE = Function('FEMALE', Thing, BoolSort())
ANIMAL = Function('ANIMAL', Thing, BoolSort())
LIVING_THING = Function('LIVING_THING', Thing, BoolSort())
ENTITY = Function('ENTITY', Thing, BoolSort())
s.add(ForAll([x], Implies(WOMAN(x), FEMALE(x))))
s.add(ForAll([x], Implies(LIVING_THING(x), ENTITY(x))))
s.add(ForAll([x], Implies(ANIMAL(x), LIVING_THING(x))))
s.add(ForAll([x], Implies(WOMAN(x), ANIMAL(x))))
所以我的问题是:是否有一种更短(但仍然高效/计算高效)的方式来指定层次关系,例如s.add(ForAll([x], Implies(ANIMAL(x), LIVING_THING(x))))。我的意思是像 s.add(LIVING_THING(ANIMAL)) 这样的东西,它目前不起作用,因为参数 ANIMAL 是一个函数。
另外,我想为某些函数指定某些属性,例如对称(作为更基本的情况)。我已经定义了:
isMarriedTo = Function('isMarriedTo', Thing, Thing, BoolSort())
loves = Function('loves', Thing, Thing, BoolSort())
s.add(ForAll([x, y], Implies(SAMEWEIGHT(x, y), SAMEWEIGHT(y, x))))
s.add(ForAll([x, y], Implies(isMarriedTo(x, y), isMarriedTo(y, x))))
s.add(ForAll([x, y], Implies(loves(x, y), loves(y, x))))
最后两个约束基本上意味着函数SAMEWEIGHT、isMarriedTo 和loves 都是对称的。那么是否有一种更优雅的方式来指定函数列表的对称属性(以及未来的许多其他此类元属性),例如类似:
- SymmetricFunctionType 由
ForAll([x, y], Implies(SymmetricFunctionType(x, y), SymmetricFunctionType(y, x)))定义 - 函数
SAMEWEIGHT、isMarriedTo和loves等属于SymmetricFunctionType类。 换句话说,在 Z3 中这样做的惯用方式是什么?
【问题讨论】: