Use of SMT Solvers in Verification Thomas Wies New York University.

Slides:



Advertisements
Similar presentations
Logical Abstract Interpretation Sumit Gulwani Microsoft Research, Redmond.
Advertisements

Exploiting SAT solvers in unbounded model checking
Quantified Invariant Generation using an Interpolating Saturation Prover Ken McMillan Cadence Research Labs TexPoint fonts used in EMF: A A A A A.
Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
Quantified Invariant Generation using an Interpolating Saturation Prover Ken McMillan Cadence Research Labs TexPoint fonts used in EMF: A A A A A.
Synthesis, Analysis, and Verification Lecture 04c Lectures: Viktor Kuncak VC Generation for Programs with Data Structures “Beyond Integers”
50.530: Software Engineering
Finding bugs: Analysis Techniques & Tools Symbolic Execution & Constraint Solving CS161 Computer Security Cho, Chia Yuan.
Gennaro Parlato (LIAFA, Paris, France) Joint work with P. Madhusudan Xiaokang Qie University of Illinois at Urbana-Champaign.
Satisfiability Modulo Theories (An introduction)
SMT Solvers (an extension of SAT) Kenneth Roe. Slide thanks to C. Barrett & S. A. Seshia, ICCAD 2009 Tutorial 2 Boolean Satisfiability (SAT) ⋁ ⋀ ¬ ⋁ ⋀
50.530: Software Engineering Sun Jun SUTD. Week 10: Invariant Generation.
Verification of Functional Programs in Scala Philippe Suter (joint work w/ Ali Sinan Köksal and Viktor Kuncak) ÉCOLE POLYTECHNIQUE FÉDÉRALE DE LAUSANNE,
Linked List Implementation class List { private List next; private Object data; private static List root; private static int size; public static void addNew(Object.
1 Regression-Verification Benny Godlin Ofer Strichman Technion.
1 1 Regression Verification for Multi-Threaded Programs Sagar Chaki, SEI-Pittsburgh Arie Gurfinkel, SEI-Pittsburgh Ofer Strichman, Technion-Haifa Originally.
Rigorous Software Development CSCI-GA Instructor: Thomas Wies Spring 2012 Lecture 11.
1/20 Generalized Symbolic Execution for Model Checking and Testing Charngki PSWLAB Generalized Symbolic Execution for Model Checking and Testing.
© Anvesh Komuravelli Quantified Invariants in Rich Domains using Model Checking and Abstract Interpretation Anvesh Komuravelli, CMU Joint work with Ken.
Rigorous Software Development CSCI-GA Instructor: Thomas Wies Spring 2012 Lecture 13.
1 Cover Algorithms and Their Combination Sumit Gulwani, Madan Musuvathi Microsoft Research, Redmond.
Leonardo de Moura and Nikolaj Bjørner Microsoft Research.
SAT and Model Checking. Bounded Model Checking (BMC) A.I. Planning problems: can we reach a desired state in k steps? Verification of safety properties:
The Software Model Checker BLAST by Dirk Beyer, Thomas A. Henzinger, Ranjit Jhala and Rupak Majumdar Presented by Yunho Kim Provable Software Lab, KAIST.
Interpolants [Craig 1957] G(y,z) F(x,y)
Katz Formal Specifications Larch 1 Algebraic Specification and Larch Formal Specifications of Complex Systems Shmuel Katz The Technion.
Yeting Ge Leonardo de Moura New York University Microsoft Research.
Formal Verification Group © Copyright IBM Corporation 2008 IBM Haifa Labs SAT-based unbounded model checking using interpolation Based on a paper “Interpolation.
1 A Combination Method for Generating Interpolants by G. Yorsh and M. Masuvathi Presentation by: Emilia Katz.
1/25 Pointer Logic Changki PSWLAB Pointer Logic Daniel Kroening and Ofer Strichman Decision Procedure.
272: Software Engineering Fall 2012 Instructor: Tevfik Bultan Lecture 4: SMT-based Bounded Model Checking of Concurrent Software.
CUTE: A Concolic Unit Testing Engine for C Technical Report Koushik SenDarko MarinovGul Agha University of Illinois Urbana-Champaign.
On Bridging Simulation and Formal Verification Eugene Goldberg Cadence Research Labs (USA) VMCAI-2008, San Francisco, USA.
June 27, 2002 HornstrupCentret1 Using Compile-time Techniques to Generate and Visualize Invariants for Algorithm Explanation Thursday, 27 June :00-13:30.
1 A Combination Method for Generating Interpolants Greta Yorsh Madan Musuvathi Tel Aviv University, Israel Microsoft Research, Redmond, US CAV’05.
Minimization of Symbolic Automata Presented By: Loris D’Antoni Joint work with: Margus Veanes 01/24/14, POPL14.
SAT and SMT solvers Ayrat Khalimov (based on Georg Hofferek‘s slides) AKDV 2014.
Verification of Java Programs using Symbolic Execution and Loop Invariant Generation Corina Pasareanu (Kestrel Technology LLC) Willem Visser (RIACS/USRA)
Introduction to Satisfiability Modulo Theories
Aditya V. Nori, Sriram K. Rajamani Microsoft Research India.
Reading and Writing Mathematical Proofs Spring 2015 Lecture 4: Beyond Basic Induction.
Today’s Agenda  Reminder: HW #1 Due next class  Quick Review  Input Space Partitioning Software Testing and Maintenance 1.
Lazy Annotation for Program Testing and Verification Speaker: Chen-Hsuan Adonis Lin Advisor: Jie-Hong Roland Jiang November 26,
Reasoning about programs March CSE 403, Winter 2011, Brun.
Proving Non-Termination Gupta, Henzinger, Majumdar, Rybalchenko, Ru-Gang Xu presentation by erkan.
More on Correctness. Prime Factorization Problem: Write a program that computes all the prime factors of a given number Solution (Idea): Factors are less.
Symbolic and Concolic Execution of Programs Information Security, CS 526 Omar Chowdhury 10/7/2015Information Security, CS 5261.
Institute for Applied Information Processing and Communications (IAIK) – Secure & Correct Systems 1 Robert Könighofer and Roderick Bloem IAIK – Graz University.
Random Interpretation Sumit Gulwani UC-Berkeley. 1 Program Analysis Applications in all aspects of software development, e.g. Program correctness Compiler.
Lightweight Support for Magic Wands in an Automatic Verifier Malte Schwerhoff and Alexander J. Summers 10 th July 2015, ECOOP, Prague.
Automated Debugging with Error Invariants TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AAA A A A AA A A Chanseok Oh.
CUTE: A Concolic Unit Testing Engine for C Koushik SenDarko MarinovGul Agha University of Illinois Urbana-Champaign.
CS357 Lecture 13: Symbolic model checking without BDDs Alex Aiken David Dill 1.
CIS 540 Principles of Embedded Computation Spring Instructor: Rajeev Alur
Error Explanation with Distance Metrics Authors: Alex Groce, Sagar Chaki, Daniel Kroening, and Ofer Strichman International Journal on Software Tools for.
1/20 Arrays Changki PSWLAB Arrays Daniel Kroening and Ofer Strichman Decision Procedure.
Selected Decision Procedures and Techniques for SMT More on combination – theories sharing sets – convex theory Un-interpreted function symbols (quantifier-free.
1 A framework for eager encoding Daniel Kroening ETH, Switzerland Ofer Strichman Technion, Israel (Executive summary) (submitted to: Formal Aspects of.
Knowledge Repn. & Reasoning Lecture #9: Propositional Logic UIUC CS 498: Section EA Professor: Eyal Amir Fall Semester 2005.
Finding bugs with a constraint solver daniel jackson. mandana vaziri mit laboratory for computer science issta 2000.
© Anvesh Komuravelli Spacer Model Checking with Proofs and Counterexamples Anvesh Komuravelli Carnegie Mellon University Joint work with Arie Gurfinkel,
Formal Verification – Robust and Efficient Code Lecture 1
On the Relation Between Simulation-based and SAT-based Diagnosis CMPE 58Q Giray Kömürcü Boğaziçi University.
Satisfiability Modulo Theories and DPLL(T) Andrew Reynolds March 18, 2015.
The software model checker BLAST Dirk Beyer, Thomas A. Henzinger, Ranjit Jhala, Rupak Majumdar Presented by Yunho Kim TexPoint fonts used in EMF. Read.
SS 2017 Software Verification Software Model Checking 2 - Parallelism
Solving Linear Arithmetic with SAT-based MC
Discrete Controller Synthesis
CUTE: A Concolic Unit Testing Engine for C
Program Verification with Hoare Logic
Presentation transcript:

Use of SMT Solvers in Verification Thomas Wies New York University

Overview Part 1 Use of Craig Interpolants in Fault Localization Part 2 Computing Craig Interpolants

Part 1 Use of Craig Interpolants in Fault Localization: Error Invariants [FM’12] joint work with Evren Ermis (Freiburg University, Germany) Martin Schäf (United Nations University, IIST, Macau)

Faulty Shell Sort Program takes a sequence of integers as input returns the sorted sequence. On the input sequence 11, 14 the program returns 0, 11 instead of 11,14.

Error Trace 0 int i,j, a[]; 1 int size=3; 2 int h=1; 3 h = h*3+1; 4 assume !(h<=size); 5 h/=3; 6 i=h; 7 assume (i<size); 8 v=a[i]; 9 j=i; 10 assume !(j>=h && a[j-h]>v); 11 i++; 12 assume (i<size); 13 v=a[i]; 14 j=i; 15 assume (j>=h && a[j-h]>v); 16 a[j]=a[j-h]; 17 j-=h; 18 assume (j>=h && a[j-h]>v); 19 a[j]=a[j-h]; 20 j-=h; 21 assume !(j>=h && a[j-h]>v); 22 assume (i!=j); 23 a[j]=v; 24 i++; 25 assume !(i<size); 26 assume (h==1); 27 assert a[0] == 11 && a[1] == 14;

Error Trace Control-Flow PathInput ValuesExpected Outcome Can be obtained, e.g., from a static analysis tool; from a failing test case; during debugging.

The Fault Localization Problem Error traces – can become very long (thousands of statements); – contains many statements and program variables that are irrelevant for understanding the error; – provide no explicit information about the program state. Fault Localization: Identify the relevant statements and variables. Provide an explanation for the error that incorporates the state of the program.

Error Trace 0 int i,j, a[]; 1 int size=3; 2 int h=1; 3 h = h*3+1; 4 assume !(h<=size); 5 h/=3; 6 i=h; 7 assume (i<size); 8 v=a[i]; 9 j=i; 10 assume !(j>=h && a[j-h]>v); 11 i++; 12 assume (i<size); 13 v=a[i]; 14 j=i; 15 assume (j>=h && a[j-h]>v); 16 a[j]=a[j-h]; 17 j-=h; 18 assume (j>=h && a[j-h]>v); 19 a[j]=a[j-h]; 20 j-=h; 21 assume !(j>=h && a[j-h]>v); 22 assume (i!=j); 23 a[j]=v; 24 i++; 25 assume !(i<size); 26 assume (h==1); 27 assert a[0] == 11 && a[1] == 14;

Error Invariants An error invariant I for a position i in an error trace ¿ is a formula over program variables s.t. – all states reachable by executing the prefix of ¿ up to position i satisfy I – all executions of the suffix of ¿ that start from i in a state that satisfies I, still lead to the error. I is called an inductive error invariant for positions i < j if I is an error invariant for both i and j.

Error Invariants Example 0: x := x + 1; 1: y := y +1; 2: x := x + a; x=0 Æ y=0 Æ a=-1 x > 0 x=0, y=0, a=-1 x=1, y=0, a=-1 x=1, y=1, a=-1 x=0, y=1, a=-1 x=0  a=-1 x=1  a=-1 x=0 Execution of trace Error Invariants Statement y := y + 1 is irrelevant Variable y is irrelevant Variable a is irrelevant after position 2 Information provided by the error invariants

Abstract Error Trace Abstract error trace consists only of – relevant statements and – error invariants that hold before and after these statements.

Abstract Error Trace Example 0: x := x + 1; x=0 Æ a=-1 x > 0 x=1 Æ a=-1 2: x := x + a; 0: x := x + 1; 1: y := y +1; 2: x := x + a; x=0 Æ y=0 Æ a=-1 x > 0

Abstract Error Trace for Faulty Shell Sort a[2]=0 a[2]=0 Æ h=1 Æ i=h h=1 Æ i=2 Æ v=0 Æ h · j Æ j ¸ 1 h=1 Æ i=2 Æ v=0 Æ j=0 a[0]=0 6: i := h; 11: i := i+1; 13: v := a[i]; 20: j := j - h; 23: a[j] := v; x > 0 a[2]=0 Æ h=1 Æ i=2 0 int i,j, a[]; 1 int size=3; 2 int h=1; 3 h = h*3+1; 4 assume !(h<=size); 5 h/=3; 6 i=h; 7 assume (i<size); 8 v=a[i]; 9 j=i; 10 assume !(j>=h && a[j-h]>v); 11 i++; 12 assume (i<size); 13 v=a[i]; 14 j=i; 15 assume (j>=h && a[j-h]>v); 16 a[j]=a[j-h]; 17 j-=h; 18 assume (j>=h && a[j-h]>v); 19 a[j]=a[j-h]; 20 j-=h; 21 assume !(j>=h && a[j-h]>v); 22 assume (i!=j); 23 a[j]=v; 24 i++; 25 assume !(i<size); 26 assume (h==1); 27 assert a[0] == 11 && a[1] == 14;

How can we compute error invariants?

Error invariants are not unique 0: x := x + 1; 1: y := y +1; 2: x := x + a; x=0 Æ y=0 Æ a=-1 x > 0 x=0, y=0, a=-1 x=1, y=0, a=-1 x=1, y=1, a=-1 x=0, y=1, a=-1 x=0  y=0  a=-1 x=1  y=0  a=-1 x=1  y=1  a=-1 x=0  y=1  a=1 Execution of trace Error Invariants We are interested in inductive error invariants!

Control-Flow PathInput ValuesExpected Outcome Path Formula st 0  … Æ st i Æ...  st n PreconditionPostcondition ⊨  Checking Error Invariants error trace formula

Error Trace Formula Example x 1 = x Æ y 1 = y Æ x 2 = x 1 + a 0 x 0 =0 Æ y 0 =0 Æ a 0 =-1 x > 0 0: x := x + 1; 1: y := y +1; 2: x := x + a; x=0 Æ y=0 Æ a=-1 x > 0 Æ Æ

Control-Flow PathInput ValuesExpected Outcome Path Formula st 0  … Æ st i Æ...  st n PreconditionPostcondition ⊨  Checking Error Invariants error trace formula A ² I and I Æ B ² ? I is an error invariant for position i iff A B

Craig Interpolants Given formulas A, B whose conjunction is unsatisfiable, a Craig interpolant for ( A, B ) is a formula I such that A ² I I Æ B ² ? fv( I ) µ fv( A ) Æ fv( B )

Control-Flow PathInput ValuesExpected Outcome Path Formula st 0  … Æ st i Æ...  st n PreconditionPostcondition ⊨  Craig Interpolants are Error Invariants error trace formula A B Craig interpolant for A Æ B is an error invariant for position i ) use Craig interpolation to compute candidates for inductive error invariants.

Computing Abstract Error Traces Basic Algorithm: 1.Compute the error trace formula from the error trace. 2.Compute a Craig interpolant I i for each position i in the error trace. 3.Compute the error invariant matrix: – for each I i and j, check whether I i is an error invariant for j. 4.Choose minimal covering of error trace with inductive error invariants. 5.Output abstract error trace.

Error Invariant Matrix for Shell Sort I \st

Error Invariant Matrix for Shell Sort I \st

Abstract Error Trace for Faulty Shell Sort a[2]=0 a[2]=0 Æ h=1 Æ i=h h=1 Æ i=2 Æ v=0 Æ h · j Æ j ¸ 1 h=1 Æ i=2 Æ v=0 Æ j=0 a[0]=0 6: i := h; 11: i := i+1; 13: v := a[i]; 20: j := j - h; 23: a[j] := v; x > 0 a[2]=0 Æ h=1 Æ i=2 0 int i,j, a[]; 1 int size=3; 2 int h=1; 3 h = h*3+1; 4 assume !(h<=size); 5 h/=3; 6 i=h; 7 assume (i<size); 8 v=a[i]; 9 j=i; 10 assume !(j>=h && a[j-h]>v); 11 i++; 12 assume (i<size); 13 v=a[i]; 14 j=i; 15 assume (j>=h && a[j-h]>v); 16 a[j]=a[j-h]; 17 j-=h; 18 assume (j>=h && a[j-h]>v); 19 a[j]=a[j-h]; 20 j-=h; 21 assume !(j>=h && a[j-h]>v); 22 assume (i!=j); 23 a[j]=v; 24 i++; 25 assume !(i<size); 26 assume (h==1); 27 assert a[0] == 11 && a[1] == 14;

Some Related Approaches Bug-Assist [Jose, Majumdar, ‘11] Whodunit? [Wang, Yang, Ivancic, Gupta, ’06] Delta debugging [Cleve, Zeller, ‘05] Distance metrics [Groce, Kroening, Lerda, ’04]

Summary (Part 1) Error invariants: new approach to fault localization enables computation of concise error explanations underlying work horse: Craig interpolation

Part 2 Computing Craig Interpolants: Hierarchical Interpolation Procedures joint work with Nishant Totla (IIT Bombay, India)

Computing Craig Interpolants Craig interpolants have many applications in Formal Methods can be automatically computed from proofs of unsatisfiability typically interested in ground interpolants many standard theories of SMT solvers admit ground interpolation – linear arithmetic – free function symbols with equality –... (more tomorrow)

Challenges in Interpolation Formulas generated in program verification are often in theories that are not directly supported by SMT solvers. Instead these theories are encoded using axioms and instantiation heuristics. Sometimes these heuristics are complete: (hierarchical decision procedure, SMT modulo theories). How can we compute ground interpolants for such theory extensions (hierarchical interpolation)?

Challenges in Interpolation We are not interested in arbitrary interpolants but only in inductive ones. Different proofs of unsatisfiability produce different interpolants. Finding good interpolants requires a lot of heuristics in the interpolation procedure. This is considered a black art. How can we decouple these heuristics from the actual interpolation procedure?

Example: List Reversal assume x ! null; prev := null; curr := x; while curr  null do succ := curr.f; curr.f := prev; prev := curr; curr := succ; end x := prev; assert x ! null; f f Safe inductive invariant : prev ! null Æ curr ! null Æ disjoint (f,curr,prev) f f x x prev curr null f f f f f

Theory of Linked Lists with Reachability (Variation of [Lahiri, Qadeer, POPL’08]) x ! yconstrained reachability x.ffield access: select(f,x) f [x := y]field update: update(f, x, y) x ! y means y is reachable from x via f without going through u (but y = u is allowed) x ! y stands for x ! y f/u f f/y

Axioms of TLLR Refl: x ! x Step: x ! x.f Ç x=u Linear: x ! y ) x ! u Ç x ! y... ReadWrite1: x.(f[x := y]) = y ReadWrite2: x = y Ç y.(f[x := z]) = y.f ReachWrite: x ! y, x ! y Æ x ! y Ç x ! u Æ v ! y Æ v ! y Æ u  w f/u f f/y f/u f/w f/u f/w f/u f/w f[u := v]/w

Example Proof a ! b Æ b.f = c Æ : a ! c 1. a ! b 2. b.f = c 3. : a ! c 4. b ! b.f(Instantiation of Step) 5. a ! b Æ b ! c ) a ! c(Inst. of Trans) 6. b ! c(Rewriting of 4 with 2) 7. ? (Resolution of 5 with 1,2,6) ff f f f f f f f

Local Theory Extensions [Sofronie-Stokkermans ’05] Given a first-order signature § 0 a (universal) first-order theory T 0 over § 0 (base theory) an extended signature § 1 = § 0 [ {f 1,...,f n } a (universal) theory extension T 1 = T 0 [ K T 1 is called local if for all ground § 1 -formulas G T 1 Æ G ² ? iff K[G] Æ T 0 Æ G ² ? Local extensions of decidable base theories are decidable.

Detecting Locality [Sofronie-Stokkermans ’05] M N h M: weak partial model of the theory N: total model of the theory h: homomorphic embedding of M into N

Idea of Hierarchical Interpolation Reduce interpolation problem A Æ B in theory extension T 1 = K [ T 0 to interpolation problem in the base theory T 0 : In order to find an T 1 -interpolant I for A Æ B find a T 0 -interpolant I for A 0 Æ B 0 where A 0 = K[A] Æ A and B 0 = K[B] Æ B This is complete whenever for all A Æ B T 1 Æ A Æ B ² ? iff T 0 Æ A 0 Æ B 0 ² ?

Amalgamation Property MAMA MBMB MCMC MDMD hBhB hAhA gAgA gBgB M A,M B,M C, M D : total models of the theory

Amalgamation Property A theory T admits ground interpolation iff T has the amalgamation property [Bacsich ‘75] Amalgamation does not tell us how to compute ground interpolants. Also, this property is too weak for our purposes.

Weak Amalgamation Property MAMA MBMB MCMC MDMD hBhB hAhA gAgA gBgB M A,M B,M C : weak partial models of the theory M D : total model of the theory

Hierarchical Interpolation via Weak Amalgamation Main Result: If T 1 = T 0 [ K has the weak amalgamation property and T 0 admits effective ground interpolation, then T 1 admits effective ground interpolation. Generic technique to obtain new interpolation procedures from existing ones.

TLLR does not have weak amalgamation c1c1 c2c2 c3c3 c4c4 a1a1 a2a2 c1c1 c2c2 c3c3 c4c4 b1b1 b2b2 c1c1 c2c2 c3c3 c4c4 A CB hAhA hBhB

Making TLLR complete Add two additional functions: join(f,x,y)node where f-paths from x and y join (if they do so) diff(f,g)node on which fields f and g differ if f  g x ! z Æ y ! z ) join(f,x,y) ! z x ! z Æ y ! z ) x ! join(f,x,y) x ! z Æ y ! z ) y ! join(f,x,y) diff(f,g).f = diff(f,g).g ) f=g disjoint(f,x,y) ´ x ! join(f,x,y) Æ y ! join(f,x,y) ) join(f,x,y)=null f f f f f f ff f ff

TLLR + join/diff has weak amalgamation c1c1 c2c2 c3c3 c4c4 a 1 = join(c 4,c 2 ) join(c 4,c 3 )=a 2 c1c1 c2c2 c3c3 c4c4 join(c 4,c 3 )= b 1 b 2 = join(c 4,c 2 ) A B hAhA hBhB

Example: List Reversal assume x ! null; prev := null; curr := x; while curr  null do succ := curr.f; curr.f := prev; prev := curr; curr := succ; end x := prev; assert x ! null; f f Safe inductive invariant : prev ! null Æ curr ! null Æ disjoint (f,curr,prev) f f Computed interpolant for 2 loop unrollings: ( curr = null Æ prev. f. f = null ) Ç ( curr null Æ prev. f  curr Æ prev. f  curr. f Æ curr. f  prev Æ prev. f. f = null )

Enumerating Partial Models Given: theory extension T with weak amalgamation. Input: A, B : ground formulas with T Æ A Æ B ² ? Output: I : T 1 -interpolant for (A,B) I := ? while 9 partial model M of T Æ A Æ : I do I := I Ç interpolate(T, M, B) end return I

Given: theory extension T with weak amalgamation. Input: A, B : ground formulas with T Æ A Æ B ² ? Output: I : T 1 -interpolant for (A,B) I := ? while 9 partial model M of T 0 [ K[A] Æ A Æ : I do if T Æ ® (M) Æ B ² ? then // M ² ® (M) I := I Ç interpolate(T, ® (M), B) else I := I Ç interpolate(T, M, B) end return I Combining Interpolation and Abstraction

List Abstraction curr f f ® Abstract from the length of the list.

Example: List Reversal assume x ! null; prev := null; curr := x; while curr  null do succ := curr.f; curr.f := prev; prev := curr; curr := succ; end x := prev; assert x ! null; f f Safe inductive invariant : prev ! null Æ curr ! null Æ disjoint (f,curr,prev) f f Computed interpolant for 2 loop unrollings: prev null Æ join( f, prev, curr ) = null f/curr

Related Work Sofronie-Stokkermans ‘06: Interpolation in local theory extensions Rybalchenko, Sofronie-Stokkermans ‘07: Constraint Solving for Interpolation Bruttomesso, Ghilardi, Ranise ‘12: Strong amalgamation for interpolation in theory combinations Bruttomesso, Ghilardi, Ranise ‘11: Ground interpolation for arrays McMillan ‘08: Quantified interpolation

Summary (Part 2) A new generic technique to obtain new interpolation procedures from existing ones – depends only on a model theoretic notion (weak amalgamation) – interpolation procedure for base theory can be treated as a black box – allows easy implementation of domain-specific heuristics Many theories of practical interest have weak amalgamation – arrays with extensionality – linked lists with reachability – imperative trees with reachability [CADE’11] –...