Python 带Z3的偏序的线性扩张

Python 带Z3的偏序的线性扩张,python,z3,z3py,partial-ordering,Python,Z3,Z3py,Partial Ordering,我试图编写一个脚本,给定一组(小)常量上的偏序,找到可以作为给定偏序约束(即a)的扩展构建的总序 例如,如果给定a、b、c、d作为常量和a>b&&b>d作为约束,则程序应输出这些顺序中的任何一个(或所有,如果可行-线性扩展为): 以下是我对z3py的第一次尝试: from z3 import * s = Solver() s.set("timeout", 3000) if len(sys.argv) > 1 and sys.argv[1] == "int": sort = In

我试图编写一个脚本,给定一组(小)常量上的偏序,找到可以作为给定偏序约束(即a)的扩展构建的总序

例如,如果给定
a、b、c、d
作为常量和
a>b&&b>d
作为约束,则程序应输出这些顺序中的任何一个(或所有,如果可行-线性扩展为):

以下是我对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()  
以下是我的问题:

  • 为什么在定义为
    IntSort
    的常量上使用totality约束时超时
  • 是否有一种方法可以获得模型的更有用的表示(例如
    a)
    
    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()