Z3 рдХреЗ рд▓рд┐рдП рдкреЙрдХреЗрдЯ рдЧрд╛рдЗрдб

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдЫрд╡рд┐


"рдорд╛рдирд╡ рдорд╕реНрддрд┐рд╖реНрдХ рдПрдХ рдЦрд╛рд▓реА рдЕрдЯрд╛рд░реА рд╣реИред рдПрдХ рдореВрд░реНрдЦ рдмрд╕ рдпрд╣реА рдХрд░рддрд╛ рд╣реИ: рдЖрд╡рд╢реНрдпрдХ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛ рд╡рд╣рд╛рдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╡рд╣ рдХреНрд╖рдг рдЖрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╡рд╣рд╛рдВ рд╕рдмрд╕реЗ рдЬрд░реВрд░реА рдЪреАрдЬ рдХреЛ рдзрдХреНрдХрд╛ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд ..."

рд╡реА.рдмреА. рд▓рд┐рд╡рд╛рдиреЛрд╡ (рдлрд┐рд▓реНрдо "рд╢рд░реНрд▓рдХ рд╣реЛрдореНрд╕ рдФрд░ рдбреЙред рд╡реЙрдЯрд╕рди" рд╕реЗ)

SMT . , , , , .. тАФ , .



  • x = Int('x')


  • y = Real('y')


  • z = Bool('z')


  • s = String('s')


  • x, y, z = Ints('x y z')


  • x, y, z = Reals('x y z')


  • x, y, z = Bools('x y z')


  • x, y, z = Strings('x y z')


  • v = BitVec('v', N) # N тАФ -


  • X = IntVector('X', N)


  • Y = RealVector('Y', N)


  • Z = BoolVector('Z', N)


  • A = Array('A', b, c) # b тАФ , тАФ


  • Select(A, i) # A[i]


  • Store('A', i, a) # A c a i-


  • FloatingPoint = FP('fp', FPSort(ebits, sbits)) # IEEE 754


  • v = BitVecVal(10, 32) # - 0x0000000a


  • str = StringVal("aaaaa")


  • c = Const(5, IntSort())




reg = Re('re')


re = Loop( reg, L, U ) # L тАФ , U тАФ


Ex:

re = Loop( Re('a') , 2, 5)

print( simplify( InRe( "aaaa", re ) ) )

print( simplify( InRe( "a", re ) ) )

Out:

True

False



  • And(a, b)


  • Not(a)


  • Or(a, b)


  • Xor(a, b)


  • Implies(a, b) # a == b a b




  • PrefixOf(substr, str)


  • SuffixOf(substr, str)


  • Concat(str1, str2)


  • Length(str)




  • Sum(a, b, c)

Out:

0 + a + b + c

  • Product(a, b, c)

Out:

1 * a * b * c

  • Distinct(x, y)

Out:

x != y

  • simplify(Distinct(x, y, z), blast_distinct=True)

Out:

And(Not(x == y), Not(x == z), Not(y == z))

  • Extract(L, U, 'x') # L тАФ , U тАФ

Ex:

s = Solver()

x = BitVec('x', 8)

k = Extract(3, 0, x)

s.add(k == BitVecVal(10,4))

s.check()

print(s.model())

Out:

x = 10

  • LShR(x, i) # x >> i


  • RotateLeft(a, i)


  • RotateRight(a, i)



Solver


SMT Solver тАФ .


s = Solver()


s = SolverFor('proc') #


  • s.push/pop() # /


  • s.statistics() #


  • s.assertions() #


  • set_option() #



Ex:

set_option(precision=10)    #    10    (        "?" )

  • s.check() # ( 3 : sat/unsat/unknown )


  • simplify() #


  • s.sexpr() # SMT-LIB2


  • s.model() #


  • s.reset() #




t


o = Optimize()


  • o.maximize(t)


  • o.minimize(t)



Ex:

x1, x2, x3, x4, x5, m = Reals('x1 x2 x3 x4 x5 m')

o = Optimize()

o.add(-5 * x1 - 5 * x2 + 0 * x3 + 0 * x4 + 20 * x5 == 2 )

o.add( 0 * x1 +5 * x2 - 10 * x3 + 0 * x4 - 5 * x5 == 3 )

o.add( 0 * x1 -5 * x2 + 0 * x3 - 15 * x4 + 15 * x5 == 1 )

o.add( x1>=0, x2>=0, x3>= 0, x4>= 0, x5>= 0)

o.add( 0 * x1 -1 * x2 + 0 * x3 + 0 * x4 - 0.5 * x5 == m )

h = o.maximize(m)

if o.check() == sat:

    print(o.lower(h))

    print(o.model())

Out:

h =  -6/5
[x3 = 0, x5 = 2/5, m = -6/5, x4 = 0, x1 = 1/5, x2 = 1]


Goal () тАФ . . . , .


g = Goal()


g.add(...)


Goal


c = Context()

g2 = g.translate(c)


. .


  • tactics() тАФ


  • tactic_description('tactic_name') тАФ



Ex:

g = Goal()

x, y = Ints('x y')

g.add(x == y + 1)

t  = With(Tactic('add-bounds'), add_bound_lower=0, add_bound_upper=10)

g2 = t(g)

print(g2.as_expr())

Out:

And(x == y + 1, x <= 10, x >= 0, y <= 10, y >= 0)


  • Then(t, s) # t тАФ


  • OrElse(t, s) # s тАФ


  • Repeat(t)


  • TryFor(t, ms) # ms тАФ


  • With(t, params) # params тАФ



Ex:

Then('simplify', 'nlsat').solver()



Solver
LIALinear Real ArithmeticDual Simplex
LRALinear Integer ArithmeticCuts + Branch
LIRAMixed Real/IntegerCuts + Branch
IDLInteger Difference LogicFloyd-Warshall
RDLReal Difference LogicBellman-Ford
UTVPIUnit two-variable / inequalityBellman-Ford
NRAPolynomial Real ArithmeticModel based CAD
NIANon-linear Integer ArithmeticCAD + Branch



  • s.set( "smt.string.solver","seq" )


  • s.set ("smt.string.solver", "z3str3")



рдордЬрдмреВрд░рди рдХрдо рд╕реЗ рдХрдо


  • s.set ("smt.core.minimize", "true")

рд╕рдВрджрд░реНрдн


рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╕рдмрд╕реЗ рд╕реБрдЦрдж рд╡рд┐рд╡рд░рдг


рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛


SMT рддрд░реНрдХ


рдЙрджрд╛рд╣рд░рдг: рдПрдХ рдФрд░ рджреЛ


All Articles