pysmt a solver agnostic library for fast prototyping of
play

PySMT : a Solver-Agnostic Library for Fast Prototyping of SMT-Based - PowerPoint PPT Presentation

PySMT : a Solver-Agnostic Library for Fast Prototyping of SMT-Based Algorithms Marco Gario and Andrea Micheli gario@fbk.eu Fondazione Bruno Kessler (FBK) University of Trento 2015-05-04 1/14 SMT-LIB Universal Simple I n t e r a c t


  1. PySMT : a Solver-Agnostic Library for Fast Prototyping of SMT-Based Algorithms Marco Gario and Andrea Micheli gario@fbk.eu Fondazione Bruno Kessler (FBK) University of Trento 2015-05-04 1/14

  2. SMT-LIB Universal Simple I n t e r a c t i o n Solver API Specific Complex 2/14

  3. SMT-LIB Universal Simple I n t PySMT e r a c t i o n Solver API Specific Complex 3/14

  4. PySMT User application PySMT : Formula API Python Formula Type PySMT Oracles Simplifier Substituter Serializer Manager Checker PySMT : Solver API Converter Converter Converter Converter Converter Converter SMT-Lib IO Python API Python API Python API Python API Python API Python API POSIX Pipe Native SMT-Lib Z3 MathSAT CVC4 Yices Cudd PicoSAT solver Simplify prototyping + Experiment with multiple solvers 4/14

  5. H+E+L+L+O = W+O+R+L+D = 25 5/14

  6. Hello World from pysmt.shortcuts import * 1 from pysmt.typing import INT 2 3 hello = [Symbol(s, INT) for s in "hello"] 4 world = [Symbol(s, INT) for s in "world"] 5 letters = set(hello+world) 6 domains = And ([ And(GE(l, Int (1)), 7 LT(l, Int (10))) for l in letters ]) 8 9 sum_hello = Plus(hello) # n-ary operators can take lists 10 sum_world = Plus(world) # as arguments 11 problem = And(Equals(sum_hello , sum_world), 12 Equals(sum_hello , Int (25))) 13 formula = And(domains , problem) 14 15 print(" Serialization of the formula:") 16 print(formula) 17 18 model = get_model(formula , solver_name ="z3") # Try msat 19 20 if model: print(model) 21 else: print("No solution found") 22 6/14

  7. Features: Solvers and Logics ◮ Supported Logics: UFLIRA and subsets + BV ◮ Solvers: ◮ Z3 , MathSAT 5, CVC4 , Yices , PicoSAT , Cudd ◮ Any SMT-LIB2 Solver ◮ Quantifier Elimination ( LIA , LRA ): ◮ Z3 ◮ MathSAT 7/14

  8. Quantifier Elimination 1. Build quantified expression f 2. Eliminate quantifier using Z3 3. Solve using CVC4 #f := (forall x . ((x < 5.0) | ((x + y + z) >= 8.0))) 1 f = ForAll ([x], Or(LT(x, Real (5)), 2 GE(Plus(x, y, z), Real (8)))) 3 4 qf_f = qelim(f, solver_name ="z3") 5 6 res = is_sat(qf_f , solver_name ="cvc4") 7 8/14

  9. Features Overview ◮ Automatic Logic detection ◮ Unified Model Representation ◮ Unsat-Core ◮ SMT-LIB Support ◮ Access to solver-specific features ◮ Typechecking, Substitution, Printing, Simplification ◮ Infix Notation 9/14

  10. Case-studies ◮ Temporal Networks (Constraints 2015): ◮ Quantifier Elimination for Temporal Uncertainty ◮ Max-SAT algorithm for Strategy Construction ◮ TFPG Validation (AAAI’15): ◮ Quantifier Elimination for Refinement Check ◮ Benchmarking: Exploit python library for random graph generation ( networkx ) 10/14

  11. Related ◮ Libraries for other languages work by pipe through SMT-LIB ⇒ Missing functionalities: Quantifier Elimination ◮ metaSMT : Using C++ templates for adapting native APIs (Only BV and Array) ◮ SMT-KIT : C++ library, supports most theories (QF) ◮ Neither provides unified handling of models or utilities to simplify expressions manipulation 11/14

  12. Future Work ◮ Interpolants ◮ Arrays ◮ Non-linear Arithmetic ◮ More Solvers: Boolector, OpenSMT, ??? 12/14

  13. Conclusion PySMT : ◮ Solver agnostic SMT ◮ Fast-prototyping ◮ Combine multiple solvers 13/14

  14. Info and Contributing Quick Install : $ pip install pysmt $ git clone https://github.com/pysmt/pysmt Documentation and Tests to get started Open-source License: APACHE v2 Feedback and contributions are welcome! ;) Marco Gario and Andrea Micheli - gario@fbk.eu PySMT : a Solver-Agnostic Library for Fast Prototyping of SMT-Based Algorithms 14/14

  15. BMC ◮ Most work goes into substitution ◮ Substitutions are a Map (Dictionary) def unroll_prop (prop , k): 1 not_prop_up_to_k = [] 2 vs = prop. get_free_variables () 3 for i in xrange(k): 4 renaming = {v : var_at_time (v, i) for v in vs} 5 p_i = prop. substitute (renaming) 6 not_prop_up_to_k .append(Not(p_i)) 7 return Or( not_prop_up_to_k ) 8 15/14

  16. EF-SMT Problems of the form ∃ � x . ∀ � y . ϕ ( � x , � y ) ◮ Solve without quantifier elimination ◮ 2 Solvers: Existential and Universal 16/14

  17. EF-SMT Problems of the form ∃ � x . ∀ � y . ϕ ( � x , � y ) ◮ Solve without quantifier elimination ◮ 2 Solvers: Existential and Universal 1. Find a model τ for ϕ over � x → Not Found: UNSAT 2. Find a model σ for ¬ ϕ [ � x /τ ] over � y → Not Found: SAT 3. Add constraint ϕ [ � y /σ ] 16/14

  18. EFSMT with Solver(logic=logic , name= esolver_name ) as esolver: 1 esolver. add_assertion (Bool(True)) 2 3 while True: 4 eres = esolver.solve () 5 if not eres: return False # UNSAT 6 7 # Extract model and perform substitution 8 tau = {v: esolver.get_value(v) for v in x} 9 sub_phi = phi.substitute (tau).simplify () 10 11 fmodel = get_model(Not(sub_phi), 12 logic=logic , 13 solver_name = fsolver_name ) 14 15 if fmodel is None: return tau # SAT (+ Model) 16 17 sigma = {v: fmodel[v] for v in y} 18 sub_phi = phi.substitute (sigma).simplify () 19 # Add constraint to existential part and restart 20 esolver. add_assertion (sub_phi) 21 17/14

  19. Solver’s Converter Converter : Solver API ⇔ PySMT How to create ( x ∧ y ) in MathSAT? Z3? CVC4? Yices? etc. How to create ( x ∧ y ) in MSatIC3? 18/14

  20. Thin Wrappers: directly access a given solver import mathsat 1 from pysmt.shortcuts import Or , Symbol , Solver , And 2 3 def callback(model , converter , result): 4 py_model = [converter.back(v) for v in model] 5 result.append(And(py_model)) 6 return 1 # go on 7 8 x, y = Symbol("x"), Symbol("y") 9 f = Or(x, y) 10 11 msat = Solver(name="msat") 12 converter = msat.converter 13 msat. add_assertion (f) 14 15 result = [] 16 # Directly invoke the mathsat API 17 mathsat. msat_all_sat (msat.msat_env , 18 [converter.convert(x)], 19 lambda model : callback(model , converter , result)) 20 21 print "exists y .", f, "is equivalent to", Or(result) 22 #exists y . (x | y) is equivalent to ((! x) | x) 23 19/14

  21. Demo ◮ Pre-requisite: Solver + Python API (e.g., Mathsat) ◮ Install the library via: $ pip install pysmt $ pysmt-install --check 20/14

  22. Demo ◮ Pre-requisite: Solver + Python API (e.g., Mathsat) ◮ Install the library via: $ pip install pysmt $ pysmt-install --check ◮ Example: H+E+L+L+O = W+O+R+L+D = 25 20/14

  23. Demo from pysmt.shortcuts import * 1 from pysmt.typing import INT 2 3 hello = [Symbol(s, INT) for s in "hello"] 4 world = [Symbol(s, INT) for s in "world"] 5 letters = set(hello+world) 6 domains = And ([ And(GE(l, Int (1)), 7 LT(l, Int (10))) for l in letters ]) 8 9 sum_hello = Plus(hello) # n-ary operators can take lists 10 sum_world = Plus(world) # as arguments 11 problem = And(Equals(sum_hello , sum_world), 12 Equals(sum_hello , Int (25))) 13 formula = And(domains , problem) 14 15 print(" Serialization of the formula:") 16 print(formula) 17 18 model = get_model(formula , solver_name ="z3") # Try msat 19 20 if model: print(model) 21 else: print("No solution found") 22 21/14

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend