使用Z3对部分订单进行线性扩展

时间:2016-02-22 16:16:52

标签: python z3 z3py partial-ordering

我试图编写一个脚本,给定一个(小)常量集的部分顺序,找到一个可以构建为给定部分排序约束的扩展的总顺序(即a {{ 3}})。

例如,如果将a,b,c,d作为常量并将a>b && b>d作为约束,则程序应输出任何这些排序(或者,如果可行,则为全部 - 线性扩展为linear extension):

c > a > b > d  
a > c > b > d  
a > b > c > d  
a > b > d > c  

这是我第一次使用z3py:

from z3 import *

s = Solver()
s.set("timeout", 3000)

if len(sys.argv) > 1 and sys.argv[1] == "int":
    sort = IntSort()
else:
    sort = DeclareSort('T')
to = Function('>', sort, sort, BoolSort())

x,y,z = Consts('x y z', sort)
s.add(ForAll([x,y], Implies(And(to(x,y),to(y,x)), x==y)))       # antisymmetry
s.add(ForAll([x,y,z], Implies(And(to(x,y),to(y,z)), to(x,z))))  # transitivity
s.add(ForAll([x,y], Or(to(x,y), to(y,x))))                      # totality

a,b,c,d = Consts('a b c d', sort)
s.add(Distinct(a,b,c,d))

s.add(to(a,b))
s.add(to(b,d))
#s.add(to(d,a)) # add cycle to make it unsat

print s.check()
print s.model()  

这些是我的问题:

  1. 为什么在使用 totality 约束定义为IntSort的常量时会超时?
  2. 有没有办法获得更有用的模型表示(例如a<b<c<d)? (相关问题:#P-complete
  3. 有没有更好的方法或更合适的工具来解决这个问题?
  4. 提前感谢您的帮助!

0 个答案:

没有答案