Incremental and Modular Context-Sensitive Analysis
Isabel Garcia-Contreras 1,2 Jose F. Morales 1,2 Manuel V. Hermenegildo 1,2
1 IMDEA Software Institute
2 T. U. Madrid (UPM)
HCVS: Horn Clauses for Verification and Synthesis — March 28th, 2021
Introduction
Context: Analyzing/Verifying software projects during development in order to:
• Detect and report of bugs as early as possible (e.g., on-the-fly, at commit, …).
• Optimize code and libraries globally for the program being developed.
Problem: Context-sensitive analysis can be quite precise but also expensive, specially for interactive uses.
Make it incremental! – successive changes during development are often comparatively small and localized.
So far, in abstract interpretation, this was achieved by:
• Fine-grain (clause-level) incremental analysis for non-modular programs.
[SAS’96, TOPLAS’00]
• Coarse-grain (module-level) analysis aimed at reducing memory consumption . [ENTCS’00, LOPSTR’01]
We propose an extension of the modular algorithm to react to module changes , and
a way to combine it with fine-grain incrementality .
Motivation - (Incremental) Static On-the-fly verification
2
General idea
1. Take “snapshots” of the program sources
(e.g., at each editor save/pause while developing, each commit, ...).
2. Detect the changes w.r.t. the previous snapshot.
3. Reanalyze :
• Annotate and remove potentially outdated information .
• (Re-)Analyze incrementally (only the parts needed) module by module until an intermodular fixpoint is reached again.
→ Recheck assertions/Reoptimize.
Analysis Basics
Abstract Interpretation
• Simulates the execution of the program using an abstract domain D α , simpler than the contrete one.
• Guarantees:
• Analysis termination, provided that D α meets some conditions.
• Results are safe approximations of the concrete semantics.
We use Prolog syntax for Horn Clauses Head k :- B k,1 , . . . , B k,n k
1 list([]). % fact
2 list([X|Xs]) :- % rule head
3 list(Xs). % rule body
4
Concrete (Top-down) Semantics – AND trees
1 par([], P, P).
2 par([C|Cs], P0, P) :-
3 xor(C, P0, P1),
4 par(Cs, P1, P).
5 xor(0,0,0).
6 xor(0,1,1).
7 xor(1,0,1).
8 xor(1,1,0).
AND tree of :- par([0, 1], 0,P).:
true par([0, 1], 0,P) }query par([C|Cs],P0,P) :- }head
C = 0, Cs = [1],
P0 = 0
xor(C,P0,P1), xor(0, 0, 0).
C = 0, Cs = [1],
P0 = 0, P1 = 0
par( Cs, P1, P).
par([C|Cs], P1, P) :-
C = 1, Cs = [],
P0 = 0
xor(C,P0,P1), xor(1, 0, 1).
C = 1, Cs = [],
P0 = 0, P1 = 1
par(Cs, P1, P).
par([], P , P).
C = 1, Cs = [],
P0 = 0, P1 = 1 P = 1 C = 0, Cs = [1],
P0 = 0, P1 = 0, P = 1 P = 1
2,1 2,2
2,1 2,2
PLAI Analysis output
A PLAI [NACLP’89] analysis graph has a set of nodes hA, λ c i 7→ λ s for every potentially reachable predicate, where:
• A is an atom, the predicate identifier.
• λ c is an abstract call to A.
• λ s is the abstract answer for A and λ c if it succeeds.
Example
1 par([], P, P).
2 par([C|Cs], P0, P) :-
3 xor(C, P0, P1),
4 par(Cs, P1, P).
5
6 xor(0,0,0).
7 xor(0,1,1).
8 xor(1,0,1).
9 xor(1,1,0).
Example nodes:
hpar(L, P0, P), >i 7→ (P0/ bit , P/ bit )
For any call to par that succeeds, P0 and P are either 1 or 0.
hpar(L, P0, P), (P0/−)i 7→ ⊥
If par is called with P0 a negative number, it always fails.
Edges : hP, λi i,j − −→ λp
λr hQ, λ ′ i, calling P with λ causes Q to be called with λ ′ .
Analysis is interprocedural, multivariant, and context sensitive. 6
Analysis graph – example
Initial query ⟨par(M, X, P), (X/z)⟩
Entry: :- par(M,0,P).
1 par([], P, P).
2 par([C|Cs], P0, P) :-
3 xor(C, P0, P1),
4 par(Cs, P1, P).
5
6 xor(0,0,0).
7 xor(0,1,1).
8 xor(1,0,1).
9 xor(1,1,0).
⊤
bit
z o
⊥
hpar(M,X,P), ( X/ z ) i 7→
(X/ z ,P/ bit )
hxor(C,P0,P1), (P0/ z ) i 7→
( C/ bit , P0/ z , P1/ bit )
hpar(M,X,P), X/ bit i 7→
( X/ bit , P/ bit )
hxor(C,P0,P1), ( P0/ bit ) i 7→
( C/ bit , P0/ bit , P1/ bit )
2, 1 2, 2
2, 1
2, 2
Modular CHC Programs
Strict module system
• Modules define an interface of exported and imported predicates.
• Non-exported predicates cannot be seen or used in other modules.
Modular program
1 :- module(main, [main/2]).
2
3 :- use_module(bitops, [xor/3]).
4
5 main(L,P) :-
6 par(L,0,P).
7
8 par([], P, P).
9 par([C|Cs], P0, P) :-
10 xor(C, P0, P1),
11 par(Cs, P1, P).
1 :- module(bitops, [xor/3]).
2
3 xor(0,0,0).
4 xor(0,1,1).
5 xor(1,0,1).
6 xor(1,1,0).
8
Graphs for Incremental and Modular Analysis
hmain(M,P),
>i 7→
(P/ bit )
hpar(M,X,P), ( X/z)i 7→
( X/z, P/ bit )
hxor(C,P0,P1), (P0/z)i 7→
(C/ bit , P0/z, P1/ bit )
hpar(M,X,P), X/ bit i 7→
(X/ bit ,P/ bit )
hxor(C,P0,P1), (P0/ bit ) i 7→
(C/ bit , P0/ bit , P1/ bit ) 1, 1
2, 1
2, 2
2, 1
2, 2
bitops main
We have:
• A global analysis graph G : call dependencies among imported/exported predicates.
• A local analysis graph L M
per module M: limited to
the predicates used in M.
test
warplan
robot_operations prolog_sys
Id162 test1/0
Id163 plans/2 C1 L1 Id160 test2/0
Id161 plans/2 C1 L1
Id158 test3/0
Id159 plans/2 C1 L1 Id80 test4/0
Id81 plans/2 C1 L1
Id77 output/1 C2 L5
Id18 time/1 C2 L3 Id95 plan/4
C2 L2 Id82 not/1
C1 L1
Id78 output1/1
C1 L1 Id19 statistics/2
C1 L1
Id96 solve/5 C2 L1 Id136 plan/4
C1 L2 C2 L5 C2 L3 C2 L2
C1 L1 C1 L1 C2 L2 C2 L5 C2 L3
Id12 imposs/1
Id126 achieve/5 C2 L3
Id45 preserves/2 C1 L5
Id50 consistent/2 C1 L3 Id127 retrace/3
C2 L2 Id117 plan/4
C1 L4
Id122 preserved/2 C2 L4
Id49 can/2 C1 L2 Id118 solve/5
C3 L2
Id22 always/1 C1 L1 Id112 and/3
C2 L2
Id119 holds/2 C2 L1
Id43 add/2 C3 L1 Id149 achieve/5
Id150 achieve/5 C2 L3
Id71 retrace/3
C2 L2C1 L5
Id142 plan/4
C1 L4
Id33 preserved/2
C2 L4
Id147 preserved/2 C2 L1 C1 L3
C1 L2 Id143 solve/5
C3 L2
C1 L1
Id144 holds/2 C2 L1
Id39 and/3 C2 L2
C3 L1
C2 L5 C2 L3
C2 L2 C1 L1
C2 L2 Id97 always/1
C1 L1 Id116 achieve/5
C3 L2
Id104 holds/2 C2 L1
Id115 add/2 C3 L1 C1 L2
Id137 solve/5 C2 L1
Id141 achieve/5 C3 L2
C2 L2
Id138 holds/2 C2 L1 C1 L1
C3 L1 Id46 preserved/2
C2 L4
Id157 achieve/5 C2 L3
C2 L2C1 L5 C1 L4
C1 L3
C1 L2
Id47 mkground/3 C1 L1
Id48 del/2 C1 L2 C2 L4
C2 L3
Id61 retrace/3 C2 L2
Id60 preserves/2 C1 L5 Id153 plan/4 C1 L4
Id152 consistent/2 C1 L3
Id151 preserves/2 C1 L1
C1 L2
Id66 conjoin/3 C1 L3
Id62 retrace1/4 C1 L2
C1 L1 C1 L2
C1 L1 Id154 solve/5 C2 L1 Id155 plan/4
C1 L2
Id14 implied/2 C1 L4 Id13 not/1
C1 L3
C1 L2 Id148 mkground/3
C1 L1 C1 L2
C1 L1 C3 L2 Id56 and/3
C2 L2 C1 L1 C2 L1
C3 L1 Id156 solve/5
C2 L1 Id68 plan/4
C1 L2
Id69 solve/5 C1 L1
C2 L2 C1 L5
C1 L4
C1 L3 C1 L1 C2 L3
C2 L4 C2 L1
C1 L2 Id76 conjoin/3
C1 L3
Id72 retrace1/4 C1 L2
C1 L1 C1 L1
C1 L2 C2 L1
Id54 plan/4 C1 L2
C1 L2
Id55 solve/5 C2 L1
Id8 mkground/3 C1 L1
Id34 del/2 C1 L2
C1 L1
C1 L2 C1 L3
C1 L2
Id51 mkground/3 C1 L1
Id52 implied/2 C1 L4
Id70 achieve/5
C3 L2 C2 L2
Id29 holds/2
C2 L1 C1 L1
C3 L1 C2 L2C1 L5
C2 L4 C1 L4 Id67 achieve/5
C2 L3
Id11 consistent/2 C1 L3
C1 L2
Id5 elem/2 C1 L1
Id57 equiv/2 C1 L2 C2 L3
C2 L2
Id31 given/2 C3 L1
Id30 add/2 C1 L1 Id26 always/1
C3 L1
Id23 connects1/3 C2 L1 C1 L2
C2 L1
C3 L2 C2 L1C2 L2 C1 L1
C3 L1
C2 L3 C2 L1
C2 L2
Id146 given/2 C3 L1
Id145 add/2 C1 L1
Id16 implied/2 C1 L2
Id15 elem/2 C2 L1 Id3 my_call/1 C1 L1
Id9 mkgroundlist/3 C3 L2 Id41 equiv/2
C1 L2
C1 L2
Id10 mkground/3 C1 L1
Id32 range/3 C3 L1
Id25 range/3 C2 L3 Id113 equiv/2
C1 L2
C2 L3 C2 L2
Id140 given/2
C3 L1
Id139 add/2 C1 L1 Id107 range/3
C3 L1
Id100 range/3 C2 L3 Id101 always/1 C3 L1
Id98 connects1/3 C2 L1
C1 L5 C1 L3
C2 L3
Id108 preserved/2 C2 L4 C2 L2
C1 L4
C1 L2 Id133 conjoin/3
C1 L3 Id129 retrace1/4 C1 L2
Id128 can/2 C1 L1 C2 L1
C1 L2
Id134 plan/4 C1 L2
C1 L2
Id135 solve/5 C2 L1 C1 L1
C1 L1
Id123 del/2 C1 L2 C2 L2
C2 L1 C1 L1
Id59 achieve/5 C3 L2
C3 L1 C2 L2 C1 L5
C1 L4
C2 L4 C2 L3
C1 L3
C1 L2 C2 L2
C2 L1 C1 L1
C3 L2
C3 L1
C1 L1 C3 L1
Id132 equiv/2 C2 L2 Id131 equiv/2
C1 L2
Id130 add/2 C1 L1 Id114 not/1
C1 L1 C1 L1
C2 L3 C2 L1
C2 L2
Id121 given/2 C3 L1
Id120 add/2 C1 L1
C3 L2 C3 L1 C1 L1
C2 L3 C2 L2
Id106 given/2 C3 L1
Id105 add/2 C1 L1 C3 L1
C2 L3 Id103 connects1/3
C2 L1 Id102 connects1/3 C1 L1
Id99 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C3 L2 Id17 not/1 C1 L1 Id53 plan/4
C1 L2 Id21 solve/5
C2 L1 Id44 achieve/5
C2 L2 C1 L5
C2 L4 C1 L3
C1 L4
C2 L3
C1 L2 Id1 plans/2
C2 L5C2 L3
Id20 plan/4 C2 L2
Id2 not/1 C1 L1
C1 L1
C1 L2 C2 L1
C2 L1 C1 L1
C2 L2 C3 L2
C3 L1
C2 L2C1 L5 C2 L4
C1 L4 C2 L3
C1 L3
C1 L2 C1 L1
C3 L1
Id75 equiv/2 C2 L2
C2 L1 Id73 equiv/2
C1 L2 Id63 add/2
C1 L1
Id74 not/1 C1 L1
C1 L1
C2 L1 C1 L1
C5 L1 C4 L1 Id7 nonequiv/2
C2 L1 Id4 intersect/2
C1 L1
C1 L4 C1 L3
C1 L2 C1 L1
C1 L1
C2 L1 C3 L1
Id65 equiv/2 C2 L2 Id64 equiv/2
C1 L2
C1 L1
Id58 not/1 C1 L1 C1 L1
C1 L1
C3 L2 C1 L1
C1 L2
C2 L1 C1 L2
C2 L1 C2 L1
C3 L2 Id42 not/1
C1 L1
C1 L1
C3 L1
C2 L3 Id28 connects1/3 C2 L1
Id27 connects1/3 C1 L1
Id24 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C1 L1
C1 L1 C1 L1
Id6 elem/2 C1 L2 C2 L1
Id35 moved/2 C8 L1 Id36 del/2 C2 L1
Id79 can/2
Id38 del/2 C2 L1
Id37 moved/2 C8 L1 C2 L1 C7 L1
C7 L1 C2 L1 C6 L1 test10
test20 test40 test30
del0 add0
moved0 can0 plans0
Id114 not/1
Id83 my_call/1
Id89 mkground/3 Id88 mkgroundlist/3
C3 L2 Id91 not/1
C1 L1Id90 consistent/2 C1 L3
Id87 mkground/3 C1 L1 Id92 implied/2
C1 L4 Id94 not/1 C1 L1
Id40 elem/2 Id114 not/1 C1 L1
C2 L1
C4 L1 C5 L1
Id86 nonequiv/2 C2 L1
Id84 intersect/2 C1 L1
C3 L2
Id93 implied/2 C1 L2
Id85 elem/2
C2 L1 C1 L2
C2 L1 C2 L1
C1 L1
C1 L1 C1 L2 C1 L1
C1 L2
lib planner
Snapshot of Analysis Graphs
Changes detected!
planner.pl
100 %%
101 - explore(P,Map,[P|Map]) :-
102 - safe(P).
103 %%
lib.pl
41 %%
42 + add(Node,Graph) :-
43 + %% implementation
44 + %% implementation
45 %%
10
test
warplan
robot_operations prolog_sys
Id162 test1/0
Id163 plans/2 C1 L1 Id160 test2/0
Id161 plans/2 C1 L1
Id158 test3/0
Id159 plans/2 C1 L1 Id80 test4/0
Id81 plans/2 C1 L1
Id77 output/1 C2 L5
Id18 time/1 C2 L3 Id95 plan/4
C2 L2 Id82 not/1
C1 L1
Id78 output1/1
C1 L1 Id19 statistics/2
C1 L1
Id96 solve/5 C2 L1 Id136 plan/4
C1 L2 C2 L5 C2 L3 C2 L2
C1 L1 C1 L1 C2 L2 C2 L5 C2 L3
Id12 imposs/1
Id126 achieve/5 C2 L3
Id45 preserves/2 C1 L5
Id50 consistent/2 C1 L3 Id127 retrace/3
C2 L2 Id117 plan/4
C1 L4
Id122 preserved/2 C2 L4
Id49 can/2 C1 L2 Id118 solve/5
C3 L2
Id22 always/1 C1 L1 Id112 and/3
C2 L2
Id119 holds/2 C2 L1
Id43 add/2 C3 L1 Id149 achieve/5
Id150 achieve/5 C2 L3
Id71 retrace/3
C2 L2C1 L5
Id142 plan/4
C1 L4
Id33 preserved/2
C2 L4
Id147 preserved/2 C2 L1 C1 L3
C1 L2 Id143 solve/5
C3 L2
C1 L1
Id144 holds/2 C2 L1
Id39 and/3 C2 L2
C3 L1
C2 L5 C2 L3
C2 L2 C1 L1
C2 L2 Id97 always/1
C1 L1 Id116 achieve/5
C3 L2
Id104 holds/2 C2 L1
Id115 add/2 C3 L1 C1 L2
Id137 solve/5 C2 L1
Id141 achieve/5 C3 L2
C2 L2
Id138 holds/2 C2 L1 C1 L1
C3 L1 Id46 preserved/2
C2 L4
Id157 achieve/5 C2 L3
C2 L2C1 L5 C1 L4
C1 L3
C1 L2
Id47 mkground/3 C1 L1
Id48 del/2 C1 L2 C2 L4
C2 L3
Id61 retrace/3 C2 L2
Id60 preserves/2 C1 L5 Id153 plan/4 C1 L4
Id152 consistent/2 C1 L3
Id151 preserves/2 C1 L1
C1 L2
Id66 conjoin/3 C1 L3
Id62 retrace1/4 C1 L2
C1 L1 C1 L2
C1 L1 Id154 solve/5 C2 L1 Id155 plan/4
C1 L2
Id14 implied/2 C1 L4 Id13 not/1
C1 L3
C1 L2 Id148 mkground/3
C1 L1 C1 L2
C1 L1 C3 L2 Id56 and/3
C2 L2 C1 L1 C2 L1
C3 L1 Id156 solve/5
C2 L1 Id68 plan/4
C1 L2
Id69 solve/5 C1 L1
C2 L2 C1 L5
C1 L4
C1 L3 C1 L1 C2 L3
C2 L4 C2 L1
C1 L2 Id76 conjoin/3
C1 L3
Id72 retrace1/4 C1 L2
C1 L1 C1 L1
C1 L2 C2 L1
Id54 plan/4 C1 L2
C1 L2
Id55 solve/5 C2 L1
Id8 mkground/3 C1 L1
Id34 del/2 C1 L2
C1 L1
C1 L2 C1 L3
C1 L2
Id51 mkground/3 C1 L1
Id52 implied/2 C1 L4
Id70 achieve/5
C3 L2 C2 L2
Id29 holds/2
C2 L1 C1 L1
C3 L1 C2 L2C1 L5
C2 L4 C1 L4 Id67 achieve/5
C2 L3
Id11 consistent/2 C1 L3
C1 L2
Id5 elem/2 C1 L1
Id57 equiv/2 C1 L2 C2 L3
C2 L2
Id31 given/2 C3 L1
Id30 add/2 C1 L1 Id26 always/1
C3 L1
Id23 connects1/3 C2 L1 C1 L2
C2 L1
C3 L2 C2 L1C2 L2 C1 L1
C3 L1
C2 L3 C2 L1
C2 L2
Id146 given/2 C3 L1
Id145 add/2 C1 L1
Id16 implied/2 C1 L2
Id15 elem/2 C2 L1 Id3 my_call/1 C1 L1
Id9 mkgroundlist/3 C3 L2 Id41 equiv/2
C1 L2
C1 L2
Id10 mkground/3 C1 L1
Id32 range/3 C3 L1
Id25 range/3 C2 L3 Id113 equiv/2
C1 L2
C2 L3 C2 L2
Id140 given/2
C3 L1
Id139 add/2 C1 L1 Id107 range/3
C3 L1
Id100 range/3 C2 L3 Id101 always/1 C3 L1
Id98 connects1/3 C2 L1
C1 L5 C1 L3
C2 L3
Id108 preserved/2 C2 L4 C2 L2
C1 L4
C1 L2 Id133 conjoin/3
C1 L3 Id129 retrace1/4 C1 L2
Id128 can/2 C1 L1 C2 L1
C1 L2
Id134 plan/4 C1 L2
C1 L2
Id135 solve/5 C2 L1 C1 L1
C1 L1
Id123 del/2 C1 L2 C2 L2
C2 L1 C1 L1
Id59 achieve/5 C3 L2
C3 L1 C2 L2 C1 L5
C1 L4
C2 L4 C2 L3
C1 L3
C1 L2 C2 L2
C2 L1 C1 L1
C3 L2
C3 L1
C1 L1 C3 L1
Id132 equiv/2 C2 L2 Id131 equiv/2
C1 L2
Id130 add/2 C1 L1 Id114 not/1
C1 L1 C1 L1
C2 L3 C2 L1
C2 L2
Id121 given/2 C3 L1
Id120 add/2 C1 L1
C3 L2 C3 L1 C1 L1
C2 L3 C2 L2
Id106 given/2 C3 L1
Id105 add/2 C1 L1 C3 L1
C2 L3 Id103 connects1/3
C2 L1 Id102 connects1/3 C1 L1
Id99 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C3 L2 Id17 not/1 C1 L1 Id53 plan/4
C1 L2 Id21 solve/5
C2 L1 Id44 achieve/5
C2 L2 C1 L5
C2 L4 C1 L3
C1 L4
C2 L3
C1 L2 Id1 plans/2
C2 L5C2 L3
Id20 plan/4 C2 L2
Id2 not/1 C1 L1
C1 L1
C1 L2 C2 L1
C2 L1 C1 L1
C2 L2 C3 L2
C3 L1
C2 L2C1 L5 C2 L4
C1 L4 C2 L3
C1 L3
C1 L2 C1 L1
C3 L1
Id75 equiv/2 C2 L2
C2 L1 Id73 equiv/2
C1 L2 Id63 add/2
C1 L1
Id74 not/1 C1 L1
C1 L1
C2 L1 C1 L1
C5 L1 C4 L1 Id7 nonequiv/2
C2 L1 Id4 intersect/2
C1 L1
C1 L4 C1 L3
C1 L2 C1 L1
C1 L1
C2 L1 C3 L1
Id65 equiv/2 C2 L2 Id64 equiv/2
C1 L2
C1 L1
Id58 not/1 C1 L1 C1 L1
C1 L1
C3 L2 C1 L1
C1 L2
C2 L1 C1 L2
C2 L1 C2 L1
C3 L2 Id42 not/1
C1 L1
C1 L1
C3 L1
C2 L3 Id28 connects1/3 C2 L1
Id27 connects1/3 C1 L1
Id24 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C1 L1
C1 L1 C1 L1
Id6 elem/2 C1 L2 C2 L1
Id35 moved/2 C8 L1 Id36 del/2 C2 L1
Id79 can/2
Id38 del/2 C2 L1
Id37 moved/2 C8 L1 C2 L1 C7 L1
C7 L1 C2 L1 C6 L1 test10
test20 test40 test30
del0 add0
moved0 can0 plans0
add
Id83 my_call/1
Id89 mkground/3 Id88 mkgroundlist/3
C3 L2 Id91 not/1
C1 L1Id90 consistent/2 C1 L3
Id87 mkground/3 C1 L1 Id92 implied/2
C1 L4 Id94 not/1 C1 L1
Id40 elem/2 Id114 not/1
C1 L1
C2 L1
C4 L1 C5 L1
Id86 nonequiv/2 C2 L1
Id84 intersect/2 C1 L1
C3 L2
Id93 implied/2 C1 L2
Id85 elem/2
C2 L1 C1 L2
C2 L1 C2 L1
C1 L1
C1 L1 C1 L2 C1 L1
C1 L2
delete
lib planner
Snapshot of Analysis Graphs
test
warplan
robot_operations prolog_sys
Id162 test1/0
Id163 plans/2 C1 L1 Id160 test2/0
Id161 plans/2 C1 L1
Id158 test3/0
Id159 plans/2 C1 L1 Id80 test4/0
Id81 plans/2 C1 L1
Id77 output/1 C2 L5
Id18 time/1 C2 L3 Id95 plan/4
C2 L2 Id82 not/1
C1 L1
Id78 output1/1
C1 L1 Id19 statistics/2
C1 L1
Id96 solve/5 C2 L1 Id136 plan/4
C1 L2 C2 L5 C2 L3 C2 L2
C1 L1 C1 L1 C2 L2 C2 L5 C2 L3
Id12 imposs/1
Id126 achieve/5 C2 L3
Id45 preserves/2 C1 L5
Id50 consistent/2 C1 L3 Id127 retrace/3
C2 L2 Id117 plan/4
C1 L4
Id122 preserved/2 C2 L4
Id49 can/2 C1 L2 Id118 solve/5
C3 L2
Id22 always/1 C1 L1 Id112 and/3
C2 L2
Id119 holds/2 C2 L1
Id43 add/2 C3 L1 Id149 achieve/5
Id150 achieve/5 C2 L3
Id71 retrace/3
C2 L2C1 L5
Id142 plan/4
C1 L4
Id33 preserved/2
C2 L4
Id147 preserved/2 C2 L1 C1 L3
C1 L2 Id143 solve/5
C3 L2
C1 L1
Id144 holds/2 C2 L1
Id39 and/3 C2 L2
C3 L1
C2 L5 C2 L3
C2 L2 C1 L1
C2 L2 Id97 always/1
C1 L1 Id116 achieve/5
C3 L2
Id104 holds/2 C2 L1
Id115 add/2 C3 L1 C1 L2
Id137 solve/5 C2 L1
Id141 achieve/5 C3 L2
C2 L2
Id138 holds/2 C2 L1 C1 L1
C3 L1 Id46 preserved/2
C2 L4
Id157 achieve/5 C2 L3
C2 L2C1 L5 C1 L4
C1 L3
C1 L2
Id47 mkground/3 C1 L1
Id48 del/2 C1 L2 C2 L4
C2 L3
Id61 retrace/3 C2 L2
Id60 preserves/2 C1 L5 Id153 plan/4 C1 L4
Id152 consistent/2 C1 L3
Id151 preserves/2 C1 L1
C1 L2
Id66 conjoin/3 C1 L3
Id62 retrace1/4 C1 L2
C1 L1 C1 L2
C1 L1 Id154 solve/5 C2 L1 Id155 plan/4
C1 L2
Id14 implied/2 C1 L4 Id13 not/1
C1 L3
C1 L2 Id148 mkground/3
C1 L1 C1 L2
C1 L1 C3 L2 Id56 and/3
C2 L2 C1 L1 C2 L1
C3 L1 Id156 solve/5
C2 L1 Id68 plan/4
C1 L2
Id69 solve/5 C1 L1
C2 L2 C1 L5
C1 L4
C1 L3 C1 L1 C2 L3
C2 L4 C2 L1
C1 L2 Id76 conjoin/3
C1 L3
Id72 retrace1/4 C1 L2
C1 L1 C1 L1
C1 L2 C2 L1
Id54 plan/4 C1 L2
C1 L2
Id55 solve/5 C2 L1
Id8 mkground/3 C1 L1
Id34 del/2 C1 L2
C1 L1
C1 L2 C1 L3
C1 L2
Id51 mkground/3 C1 L1
Id52 implied/2 C1 L4
Id70 achieve/5
C3 L2 C2 L2
Id29 holds/2
C2 L1 C1 L1
C3 L1 C2 L2C1 L5
C2 L4 C1 L4 Id67 achieve/5
C2 L3
Id11 consistent/2 C1 L3
C1 L2
Id5 elem/2 C1 L1
Id57 equiv/2 C1 L2 C2 L3
C2 L2
Id31 given/2 C3 L1
Id30 add/2 C1 L1 Id26 always/1
C3 L1
Id23 connects1/3 C2 L1 C1 L2
C2 L1
C3 L2 C2 L1C2 L2 C1 L1
C3 L1
C2 L3 C2 L1
C2 L2
Id146 given/2 C3 L1
Id145 add/2 C1 L1
Id16 implied/2 C1 L2
Id15 elem/2 C2 L1 Id3 my_call/1 C1 L1
Id9 mkgroundlist/3 C3 L2 Id41 equiv/2
C1 L2
C1 L2
Id10 mkground/3 C1 L1
Id32 range/3 C3 L1
Id25 range/3 C2 L3 Id113 equiv/2
C1 L2
C2 L3 C2 L2
Id140 given/2
C3 L1
Id139 add/2 C1 L1 Id107 range/3
C3 L1
Id100 range/3 C2 L3 Id101 always/1 C3 L1
Id98 connects1/3 C2 L1
C1 L5 C1 L3
C2 L3
Id108 preserved/2 C2 L4 C2 L2
C1 L4
C1 L2
Id109 del/2 C1 L2 Id133 conjoin/3
C1 L3 Id129 retrace1/4 C1 L2
Id128 can/2 C1 L1 C2 L1
C1 L2
Id134 plan/4 C1 L2
C1 L2
Id135 solve/5 C2 L1 C1 L1
C1 L1
Id123 del/2 C1 L2 C2 L2
C2 L1 C1 L1
Id59 achieve/5 C3 L2
C3 L1 C2 L2 C1 L5
C1 L4
C2 L4 C2 L3
C1 L3
C1 L2 C2 L2
C2 L1 C1 L1
C3 L2
C3 L1
C1 L1 C3 L1
Id132 equiv/2 C2 L2 Id131 equiv/2
C1 L2
Id130 add/2 C1 L1 Id114 not/1
C1 L1 C1 L1
C2 L3 C2 L1
C2 L2
Id121 given/2 C3 L1
Id120 add/2 C1 L1
C3 L2 C3 L1 C1 L1
C2 L3 C2 L2
Id106 given/2 C3 L1
Id105 add/2 C1 L1 C3 L1
C2 L3 Id103 connects1/3
C2 L1 Id102 connects1/3 C1 L1
Id99 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C3 L2 Id17 not/1 C1 L1 Id53 plan/4
C1 L2 Id21 solve/5
C2 L1 Id44 achieve/5
C2 L2 C1 L5
C2 L4 C1 L3
C1 L4
C2 L3
C1 L2 Id1 plans/2
C2 L5C2 L3
Id20 plan/4 C2 L2
Id2 not/1 C1 L1
C1 L1
C1 L2 C2 L1
C2 L1 C1 L1
C2 L2 C3 L2
C3 L1
C2 L2C1 L5 C2 L4
C1 L4 C2 L3
C1 L3
C1 L2 C1 L1
C3 L1
Id75 equiv/2 C2 L2
C2 L1 Id73 equiv/2
C1 L2 Id63 add/2
C1 L1
Id74 not/1 C1 L1
C1 L1
C2 L1 C1 L1
C5 L1 C4 L1 Id7 nonequiv/2
C2 L1 Id4 intersect/2
C1 L1
C1 L4 C1 L3
C1 L2 C1 L1
C1 L1
C2 L1 C3 L1
Id65 equiv/2 C2 L2 Id64 equiv/2
C1 L2
C1 L1
Id58 not/1 C1 L1 C1 L1
C1 L1
C3 L2 C1 L1
C1 L2
C2 L1 C1 L2
C2 L1 C2 L1
C3 L2 Id42 not/1
C1 L1
C1 L1
C3 L1
C2 L3 Id28 connects1/3 C2 L1
Id27 connects1/3 C1 L1
Id24 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C1 L1
C1 L1 C1 L1
Id6 elem/2 C1 L2 C2 L1
Id35 moved/2 C8 L1 Id36 del/2 C2 L1
Id125 del/2 C2 L1
Id124 moved/2 C8 L1
Id111 del/2 C2 L1 C7 L1
Id110 moved/2
C6 L1 C2 L1
C7 L1 C2 L1
C8 L1 Id79 can/2
Id38 del/2 C2 L1
Id37 moved/2 C8 L1 C2 L1 C7 L1
C7 L1 C2 L1 C6 L1 test10
test20 test40 test30
del0 add0
moved0 can0 plans0
recompute delete
lib planner
Snapshot of Analysis Graphs
12
test
warplan
robot_operations prolog_sys
Id162 test1/0
Id163 plans/2 C1 L1 Id160 test2/0
Id161 plans/2 C1 L1
Id158 test3/0
Id159 plans/2 C1 L1 Id80 test4/0
Id81 plans/2 C1 L1
Id77 output/1 C2 L5
Id18 time/1 C2 L3 Id95 plan/4
C2 L2 Id82 not/1
C1 L1
Id78 output1/1
C1 L1 Id19 statistics/2
C1 L1
Id96 solve/5 C2 L1 Id136 plan/4
C1 L2
Id83 my_call/1 C1 L1
C2 L5 C2 L3 C2 L2
C1 L1 C1 L1 C2 L2 C2 L5 C2 L3
Id89 mkground/3 Id88 mkgroundlist/3
C3 L2 Id91 not/1
C1 L1 Id90 consistent/2 C1 L3
Id12 imposs/1 C1 L2
Id87 mkground/3 C1 L1 Id92 implied/2
C1 L4 Id94 not/1 C1 L1
Id126 achieve/5 C2 L3
Id45 preserves/2 C1 L5
Id50 consistent/2 C1 L3 Id127 retrace/3
C2 L2 Id117 plan/4
C1 L4
Id122 preserved/2 C2 L4
Id49 can/2 C1 L2 Id118 solve/5
C3 L2
Id22 always/1 C1 L1 Id112 and/3
C2 L2
Id119 holds/2 C2 L1
Id43 add/2 C3 L1 Id149 achieve/5
Id150 achieve/5 C2 L3
Id71 retrace/3
C2 L2C1 L5
Id142 plan/4
C1 L4
Id33 preserved/2
C2 L4
Id147 preserved/2 C2 L1 C1 L3
C1 L2 Id143 solve/5
C3 L2
C1 L1
Id144 holds/2 C2 L1
Id39 and/3 C2 L2
C3 L1
C2 L5 C2 L3
C2 L2 C1 L1
C2 L2 Id97 always/1
C1 L1 Id116 achieve/5
C3 L2
Id104 holds/2 C2 L1
Id115 add/2 C3 L1 C1 L2
Id137 solve/5 C2 L1
Id141 achieve/5 C3 L2
C2 L2
Id138 holds/2 C2 L1 C1 L1
C3 L1 Id46 preserved/2
C2 L4
Id157 achieve/5 C2 L3
C2 L2C1 L5 C1 L4
C1 L3
C1 L2
Id47 mkground/3 C1 L1
Id48 del/2 C1 L2 C2 L4
C2 L3
Id61 retrace/3 C2 L2
Id60 preserves/2 C1 L5 Id153 plan/4 C1 L4
Id152 consistent/2 C1 L3
Id151 preserves/2 C1 L1
C1 L2
Id66 conjoin/3 C1 L3
Id62 retrace1/4 C1 L2
C1 L1 C1 L2
C1 L1 Id154 solve/5 C2 L1 Id155 plan/4
C1 L2
Id14 implied/2 C1 L4 Id13 not/1
C1 L3
C1 L2 Id148 mkground/3
C1 L1 C1 L2
C1 L1 C3 L2 Id56 and/3
C2 L2 C1 L1 C2 L1
C3 L1 Id156 solve/5
C2 L1 Id68 plan/4
C1 L2
Id69 solve/5 C1 L1
C2 L2 C1 L5
C1 L4
C1 L3 C1 L1 C2 L3
C2 L4 C2 L1
C1 L2 Id76 conjoin/3
C1 L3
Id72 retrace1/4 C1 L2
C1 L1 C1 L1
C1 L2 C2 L1
Id54 plan/4 C1 L2
C1 L2
Id55 solve/5 C2 L1
Id8 mkground/3 C1 L1
Id34 del/2 C1 L2
C1 L1
C1 L2 C1 L3
C1 L2
Id51 mkground/3 C1 L1
Id52 implied/2 C1 L4
Id70 achieve/5
C3 L2 C2 L2
Id29 holds/2
C2 L1 C1 L1
C3 L1 C2 L2C1 L5
C2 L4 C1 L4 Id67 achieve/5
C2 L3
Id11 consistent/2 C1 L3
C1 L2
Id5 elem/2 C1 L1
Id57 equiv/2 C1 L2 C2 L3
C2 L2
Id31 given/2 C3 L1
Id30 add/2 C1 L1 Id26 always/1
C3 L1
Id23 connects1/3 C2 L1 C1 L2
C2 L1
C3 L2 C2 L1C2 L2 C1 L1
C3 L1
C2 L3 C2 L1
C2 L2
Id146 given/2 C3 L1
Id145 add/2 C1 L1
Id16 implied/2 C1 L2
Id15 elem/2 C2 L1 Id3 my_call/1 C1 L1
Id9 mkgroundlist/3 C3 L2 Id40 elem/2
C1 L1 Id41 equiv/2 C1 L2
C1 L2
Id10 mkground/3 C1 L1
Id32 range/3 C3 L1
Id25 range/3 C2 L3 C1 L1
Id113 equiv/2 C1 L2
C2 L3 C2 L2
Id140 given/2
C3 L1
Id139 add/2 C1 L1 Id107 range/3
C3 L1
Id100 range/3 C2 L3 Id101 always/1 C3 L1
Id98 connects1/3 C2 L1
C1 L5 C1 L3
C2 L3
Id108 preserved/2 C2 L4 C2 L2
C1 L4
C1 L2
C1 L1
Id109 del/2 C1 L2 Id133 conjoin/3
C1 L3 Id129 retrace1/4 C1 L2
Id128 can/2 C1 L1 C2 L1
C1 L2
Id134 plan/4 C1 L2
C1 L2
Id135 solve/5 C2 L1 C1 L1
C1 L1
Id123 del/2 C1 L2 C2 L2
C2 L1 C1 L1
Id59 achieve/5 C3 L2
C3 L1 C2 L2 C1 L5
C1 L4
C2 L4 C2 L3
C1 L3
C1 L2 C2 L2
C2 L1 C1 L1
C3 L2
C3 L1
C1 L1 C3 L1
Id132 equiv/2 C2 L2
C2 L1 Id131 equiv/2 C1 L2
Id130 add/2 C1 L1 Id114 not/1
C1 L1
C1 L1
C2 L1 C1 L1
C2 L3 C2 L1
C2 L2
Id121 given/2 C3 L1
Id120 add/2 C1 L1
C3 L2 C3 L1 C1 L1
C4 L1 C5 L1
Id86 nonequiv/2 C2 L1
Id84 intersect/2 C1 L1
C2 L3 C2 L2
Id106 given/2 C3 L1
Id105 add/2 C1 L1
C3 L2
C3 L1
C2 L3 Id103 connects1/3
C2 L1 Id102 connects1/3 C1 L1
Id99 range/3 C1 L1
C2 L3 C1 L1 C1 L1
Id93 implied/2 C1 L2
Id85 elem/2
C2 L1 C1 L2
C2 L1 C2 L1
C1 L1
C1 L1 C1 L2 C1 L1
C1 L2
C3 L2 Id17 not/1 C1 L1 Id53 plan/4
C1 L2 Id21 solve/5
C2 L1 Id44 achieve/5
C2 L2 C1 L5
C2 L4 C1 L3
C1 L4
C2 L3
C1 L2 Id1 plans/2
C2 L5C2 L3
Id20 plan/4 C2 L2
Id2 not/1 C1 L1
C1 L1
C1 L2 C2 L1
C2 L1 C1 L1
C2 L2 C3 L2
C2 L2C1 L5 C2 L4
C1 L4 C2 L3
C1 L3
C1 L2 C1 L1
C3 L1
Id75 equiv/2 C2 L2
C2 L1 Id73 equiv/2
C1 L2 Id63 add/2
C1 L1
Id74 not/1 C1 L1
C1 L1
C2 L1 C1 L1
C5 L1 C4 L1 Id7 nonequiv/2
C2 L1 Id4 intersect/2
C1 L1
C1 L4 C1 L3
C1 L2 C1 L1
C1 L1
C2 L1 C3 L1
Id65 equiv/2 C2 L2 Id64 equiv/2
C1 L2
C1 L1
Id58 not/1 C1 L1 C1 L1
C1 L1
C3 L2 C1 L1
C1 L2
C2 L1 C1 L2
C2 L1 C2 L1
C3 L2 Id42 not/1
C1 L1
C1 L1
C3 L1
C2 L3 Id28 connects1/3 C2 L1
Id27 connects1/3 C1 L1
Id24 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C1 L1
C1 L1 C1 L1
Id6 elem/2 C1 L2 C2 L1
Id35 moved/2 C8 L1 Id36 del/2 C2 L1
Id125 del/2 C2 L1
Id124 moved/2 C8 L1
Id111 del/2 C2 L1 C7 L1
Id110 moved/2
C6 L1 C2 L1
C7 L1 C2 L1
C8 L1 Id79 can/2
Id38 del/2 C2 L1
Id37 moved/2 C8 L1 C2 L1 C7 L1
C7 L1 C2 L1 C6 L1 test10
test20 test40 test30
del0 add0
moved0 can0 plans0
lib planner
Snapshot of Analysis Graphs
test
warplan
robot_operations prolog_sys
Id162 test1/0
Id163 plans/2 C1 L1 Id160 test2/0
Id161 plans/2 C1 L1
Id158 test3/0
Id159 plans/2 C1 L1 Id80 test4/0
Id81 plans/2 C1 L1
Id77 output/1 C2 L5
Id18 time/1 C2 L3 Id95 plan/4
C2 L2 Id82 not/1
C1 L1
Id78 output1/1
C1 L1 Id19 statistics/2
C1 L1
Id96 solve/5 C2 L1 Id136 plan/4
C1 L2
Id83 my_call/1 C1 L1
C2 L5 C2 L3 C2 L2
C1 L1 C1 L1 C2 L2 C2 L5 C2 L3
Id89 mkground/3 Id88 mkgroundlist/3
C3 L2 Id91 not/1
C1 L1 Id90 consistent/2 C1 L3
Id12 imposs/1 C1 L2
Id87 mkground/3 C1 L1 Id92 implied/2
C1 L4 Id94 not/1 C1 L1
Id126 achieve/5 C2 L3
Id45 preserves/2 C1 L5
Id50 consistent/2 C1 L3 Id127 retrace/3
C2 L2 Id117 plan/4
C1 L4
Id122 preserved/2 C2 L4
Id49 can/2 C1 L2 Id118 solve/5
C3 L2
Id22 always/1 C1 L1 Id112 and/3
C2 L2
Id119 holds/2 C2 L1
Id43 add/2 C3 L1 Id149 achieve/5
Id150 achieve/5 C2 L3
Id71 retrace/3
C2 L2C1 L5
Id142 plan/4
C1 L4
Id33 preserved/2
C2 L4
Id147 preserved/2 C2 L1 C1 L3
C1 L2 Id143 solve/5
C3 L2
C1 L1
Id144 holds/2 C2 L1
Id39 and/3 C2 L2
C3 L1
C2 L5 C2 L3
C2 L2 C1 L1
C2 L2 Id97 always/1
C1 L1 Id116 achieve/5
C3 L2
Id104 holds/2 C2 L1
Id115 add/2 C3 L1 C1 L2
Id137 solve/5 C2 L1
Id141 achieve/5 C3 L2
C2 L2
Id138 holds/2 C2 L1 C1 L1
C3 L1 Id46 preserved/2
C2 L4
Id157 achieve/5 C2 L3
C2 L2C1 L5 C1 L4
C1 L3
C1 L2
Id47 mkground/3 C1 L1
Id48 del/2 C1 L2 C2 L4
C2 L3
Id61 retrace/3 C2 L2
Id60 preserves/2 C1 L5 Id153 plan/4 C1 L4
Id152 consistent/2 C1 L3
Id151 preserves/2 C1 L1
C1 L2
Id66 conjoin/3 C1 L3
Id62 retrace1/4 C1 L2
C1 L1 C1 L2
C1 L1 Id154 solve/5 C2 L1 Id155 plan/4
C1 L2
Id14 implied/2 C1 L4 Id13 not/1
C1 L3
C1 L2 Id148 mkground/3
C1 L1 C1 L2
C1 L1 C3 L2 Id56 and/3
C2 L2 C1 L1 C2 L1
C3 L1 Id156 solve/5
C2 L1 Id68 plan/4
C1 L2
Id69 solve/5 C1 L1
C2 L2 C1 L5
C1 L4
C1 L3 C1 L1 C2 L3
C2 L4 C2 L1
C1 L2 Id76 conjoin/3
C1 L3
Id72 retrace1/4 C1 L2
C1 L1 C1 L1
C1 L2 C2 L1
Id54 plan/4 C1 L2
C1 L2
Id55 solve/5 C2 L1
Id8 mkground/3 C1 L1
Id34 del/2 C1 L2
C1 L1
C1 L2 C1 L3
C1 L2
Id51 mkground/3 C1 L1
Id52 implied/2 C1 L4
Id70 achieve/5
C3 L2 C2 L2
Id29 holds/2
C2 L1 C1 L1
C3 L1 C2 L2C1 L5
C2 L4 C1 L4 Id67 achieve/5
C2 L3
Id11 consistent/2 C1 L3
C1 L2
Id5 elem/2 C1 L1
Id57 equiv/2 C1 L2 C2 L3
C2 L2
Id31 given/2 C3 L1
Id30 add/2 C1 L1 Id26 always/1
C3 L1
Id23 connects1/3 C2 L1 C1 L2
C2 L1
C3 L2 C2 L1C2 L2 C1 L1
C3 L1
C2 L3 C2 L1
C2 L2
Id146 given/2 C3 L1
Id145 add/2 C1 L1
Id16 implied/2 C1 L2
Id15 elem/2 C2 L1 Id3 my_call/1 C1 L1
Id9 mkgroundlist/3 C3 L2 Id40 elem/2
C1 L1 Id41 equiv/2 C1 L2
C1 L2
Id10 mkground/3 C1 L1
Id32 range/3 C3 L1
Id25 range/3 C2 L3 C1 L1
Id113 equiv/2 C1 L2
C2 L3 C2 L2
Id140 given/2
C3 L1
Id139 add/2 C1 L1 Id107 range/3
C3 L1
Id100 range/3 C2 L3 Id101 always/1 C3 L1
Id98 connects1/3 C2 L1
C1 L5 C1 L3
C2 L3
Id108 preserved/2 C2 L4 C2 L2
C1 L4
C1 L2
C1 L1
Id109 del/2 C1 L2 Id133 conjoin/3
C1 L3 Id129 retrace1/4 C1 L2
Id128 can/2 C1 L1 C2 L1
C1 L2
Id134 plan/4 C1 L2
C1 L2
Id135 solve/5 C2 L1 C1 L1
C1 L1
Id123 del/2 C1 L2 C2 L2
C2 L1 C1 L1
Id59 achieve/5 C3 L2
C3 L1 C2 L2 C1 L5
C1 L4
C2 L4 C2 L3
C1 L3
C1 L2 C2 L2
C2 L1 C1 L1
C3 L2
C3 L1
C1 L1 C3 L1
Id132 equiv/2 C2 L2
C2 L1 Id131 equiv/2 C1 L2
Id130 add/2 C1 L1 Id114 not/1
C1 L1
C1 L1
C2 L1 C1 L1
C2 L3 C2 L1
C2 L2
Id121 given/2 C3 L1
Id120 add/2 C1 L1
C3 L2 C3 L1 C1 L1
C4 L1 C5 L1
Id86 nonequiv/2 C2 L1
Id84 intersect/2 C1 L1
C2 L3 C2 L2
Id106 given/2 C3 L1
Id105 add/2 C1 L1
C3 L2
C3 L1
C2 L3 Id103 connects1/3
C2 L1 Id102 connects1/3 C1 L1
Id99 range/3 C1 L1
C2 L3 C1 L1 C1 L1
Id93 implied/2 C1 L2
Id85 elem/2
C2 L1 C1 L2
C2 L1 C2 L1
C1 L1
C1 L1 C1 L2 C1 L1
C1 L2
C3 L2 Id17 not/1 C1 L1 Id53 plan/4
C1 L2 Id21 solve/5
C2 L1 Id44 achieve/5
C2 L2 C1 L5
C2 L4 C1 L3
C1 L4
C2 L3
C1 L2 Id1 plans/2
C2 L5C2 L3
Id20 plan/4 C2 L2
Id2 not/1 C1 L1
C1 L1
C1 L2 C2 L1
C2 L1 C1 L1
C2 L2 C3 L2
C2 L2C1 L5 C2 L4
C1 L4 C2 L3
C1 L3
C1 L2 C1 L1
C3 L1
Id75 equiv/2 C2 L2
C2 L1 Id73 equiv/2
C1 L2 Id63 add/2
C1 L1
Id74 not/1 C1 L1
C1 L1
C2 L1 C1 L1
C5 L1 C4 L1 Id7 nonequiv/2
C2 L1 Id4 intersect/2
C1 L1
C1 L4 C1 L3
C1 L2 C1 L1
C1 L1
C2 L1 C3 L1
Id65 equiv/2 C2 L2 Id64 equiv/2
C1 L2
C1 L1
Id58 not/1 C1 L1 C1 L1
C1 L1
C3 L2 C1 L1
C1 L2
C2 L1 C1 L2
C2 L1 C2 L1
C3 L2 Id42 not/1
C1 L1
C1 L1
C3 L1
C2 L3 Id28 connects1/3 C2 L1
Id27 connects1/3 C1 L1
Id24 range/3 C1 L1
C2 L3 C1 L1 C1 L1
C1 L1
C1 L1 C1 L1
Id6 elem/2 C1 L2 C2 L1
Id35 moved/2 C8 L1 Id36 del/2 C2 L1
Id125 del/2 C2 L1
Id124 moved/2 C8 L1
Id111 del/2 C2 L1 C7 L1
Id110 moved/2
C6 L1 C2 L1
C7 L1 C2 L1
C8 L1 Id79 can/2
Id38 del/2 C2 L1
Id37 moved/2 C8 L1 C2 L1 C7 L1
C7 L1 C2 L1 C6 L1 test10
test20 test40 test30
del0 add0
moved0 can0 plans0
lib planner
Snapshot of Analysis Graphs
The algorithm:
• Maintains local and global graphs with call/success pairs for the predicates and their dependencies .
• Deals incrementally with additions, deletions .
• Localizes as much as possible fixpoint (re)computation inside modules to minimize context swaps.
14
Theorem 4 (Correctness of IncAnalyze starting from a partial analysis). Let P be a program, Q α a set of ab- stract queries, and A 0 any analysis graph. Let A = IncAnalyze(P, Q α , ∅, A 0 ). A is correct for P and γ(Q α ) if for all concrete queries q ∈ γ(Q α ) all nodes n from which there is a path in the concrete execution q n in JP KQ, that are abstracted in the analysis A 0 are included in Q α , i.e.:
∀Q, n.Q ∈ γ(Q α ) ∧ q n ∈ JP KQ,
∀n α ∈ A 0 .n ∈ γ(n α )⇒n α ∈ Q α .
Theorem 6 (Precision of IncAnalyze). Let P, P 0 be pro- grams, such that P differs from P 0 by ∆, let Q α a set of ab- stract queries, and A 0 = IncAnalyze(P 0 , Q α , ∅, ∅) an analysis graph. The following hold:
• If A = IncAnalyze(P, Q α , ∅, ∅), then A is the least program analysis graph for P and γ(Q α ), and
• IncAnalyze(P, Q α , ∆, A 0 ) =
IncAnalyze(P, Q α , ∅, ∅).
Lemma 1 (Correctness of IncAnalyze modulo imported predicates). Let M be a module of program P , E a set of ab- stract queries. Let L 0 be an analysis graph such that ∀hA, λ c i ∈ L 0 .mod(A) ∈ imports(M ). The analysis result
L = IncAnalyze(M, E, ∅, L 0 ) is correct for M and γ(E) assuming L 0 .
Lemma 2 (Precision of IncAnalyze modulo imported pred- icates). Let M be a module of program P , E a set of abstract queries. Let L 0 be an analysis graph such that ∀hA, λ c i ∈ L 0 .mod(A) ∈ imports(M ) if L 0 contains the least fixed point as defined in Theorem 6. The analysis result
L = IncAnalyze(M, E, ∅, L 0 )
is the least program analysis graph for M and γ(E) assuming
Lemma 3 (Correctness updating L modulo G). Let M be a module of program P and E a set of entries. Let G be a previous state of the global analysis graph, if L M is correct for M and γ(E) assuming G. If G changes to G 0 the analysis result
L M 0 = LocIncAnalyze(M, E, G 0 , L M , ∅) is correct for M and γ(E) assuming G.
Theorem 10 (Correctness of ModIncAnalyze from scratch).
Let P be a modular program, and Q α a set of abstract queries.
Then, if:
{G, { L M i }} = ModIncAnalyze(P, Q α , ∅, ∅) G is correct for P and γ(Q α ).
Lemma 4 (Precision updating L modulo G). Let M be a module contained in program P , E a set of entries. Let G be a previous state of the global analysis graph, if L M = LocIncAnalyze(M, E, G, ∅, ∅). If G changes to G 0 the analy- sis result:
LocIncAnalyze(M, E, G 0 , L M , ∅) = LocIncAnalyze(M, E, G 0 , ∅, ∅) is the same as analyzing from scratch, i.e., the lfp of M , E.
Theorem 11 (Precision of ModIncAnalyze from scratch).
Let P be a modular program and Q α a set of abstract queries.
The analysis result
A = ModIncAnalyze(P, Q α , ∅, ∅) = ModAnalyze(P, Q α ) such that A = {G, {L M i }}, then G = G 0 .
Theorem 12 (Precision of ModIncAnalyze). Let P, P 0 be modular programs that differ by ∆, Q α a set of queries, and A = ModIncAnalyze(P, Q α , ∅, (∅, ∅)), then
ModIncAnalyze(P 0 , Q , ∅, (∅, ∅)) = ModIncAnalyze(P 0 , Q , A , ∆).
Fundamental results
15
Theorem 4 (Correctness of IncAnalyze starting from a partial analysis). Let P be a program, Q α a set of ab- stract queries, and A 0 any analysis graph. Let A = IncAnalyze(P, Q α , ∅, A 0 ). A is correct for P and γ(Q α ) if for all concrete queries q ∈ γ(Q α ) all nodes n from which there is a path in the concrete execution q n in JP KQ, that are abstracted in the analysis A 0 are included in Q α , i.e.:
∀Q, n.Q ∈ γ(Q α ) ∧ q n ∈ JP KQ,
∀n α ∈ A 0 .n ∈ γ(n α )⇒n α ∈ Q α .
Theorem 6 (Precision of IncAnalyze). Let P, P 0 be pro- grams, such that P differs from P 0 by ∆, let Q α a set of ab- stract queries, and A 0 = IncAnalyze(P 0 , Q α , ∅, ∅) an analysis graph. The following hold:
• If A = IncAnalyze(P, Q α , ∅, ∅), then A is the least program analysis graph for P and γ(Q α ), and
• IncAnalyze(P, Q α , ∆, A 0 ) =
IncAnalyze(P, Q α , ∅, ∅).
Lemma 1 (Correctness of IncAnalyze modulo imported predicates). Let M be a module of program P , E a set of ab- stract queries. Let L 0 be an analysis graph such that ∀hA, λ c i ∈ L 0 .mod(A) ∈ imports(M ). The analysis result
L = IncAnalyze(M, E, ∅, L 0 ) is correct for M and γ(E) assuming L 0 .
Lemma 2 (Precision of IncAnalyze modulo imported pred- icates). Let M be a module of program P , E a set of abstract queries. Let L 0 be an analysis graph such that ∀hA, λ c i ∈ L 0 .mod(A) ∈ imports(M ) if L 0 contains the least fixed point as defined in Theorem 6. The analysis result
L = IncAnalyze(M, E, ∅, L 0 )
is the least program analysis graph for M and γ(E) assuming L 0 .
Lemma 3 (Correctness updating L modulo G). Let M be a module of program P and E a set of entries. Let G be a previous state of the global analysis graph, if L M is correct for M and γ(E) assuming G. If G changes to G 0 the analysis result
L M 0 = LocIncAnalyze(M, E, G 0 , L M , ∅) is correct for M and γ(E) assuming G.
Theorem 10 (Correctness of ModIncAnalyze from scratch).
Let P be a modular program, and Q α a set of abstract queries.
Then, if:
{G, { L M i }} = ModIncAnalyze(P, Q α , ∅, ∅) G is correct for P and γ(Q α ).
Lemma 4 (Precision updating L modulo G). Let M be a module contained in program P , E a set of entries. Let G be a previous state of the global analysis graph, if L M = LocIncAnalyze(M, E, G, ∅, ∅). If G changes to G 0 the analy- sis result:
LocIncAnalyze(M, E, G 0 , L M , ∅) = LocIncAnalyze(M, E, G 0 , ∅, ∅) is the same as analyzing from scratch, i.e., the lfp of M , E.
Theorem 11 (Precision of ModIncAnalyze from scratch).
Let P be a modular program and Q α a set of abstract queries.
The analysis result
A = ModIncAnalyze(P, Q α , ∅, ∅) = ModAnalyze(P, Q α ) such that A = {G, {L M i }}, then G = G 0 .
Theorem 12 (Precision of ModIncAnalyze). Let P, P 0 be modular programs that differ by ∆, Q α a set of queries, and A = ModIncAnalyze(P, Q α , ∅, (∅, ∅)), then
ModIncAnalyze(P 0 , Q α , ∅, (∅, ∅)) = ModIncAnalyze(P 0 , Q α , A , ∆).
Fundamental results
Contributions
The results from our incremental, modular analysis are:
• Correct over-approximations of the AND tree semantics.
• The most accurate (lfp) if no widening is performed.
Additionally:
• Extended traditional algorithm with widening (not formalized before).
• Split correctness and precision of incremental analysis.
• New results reanalyzing starting from a partial analysis .
• Formalized results of an existing modular algorithm (non incremental).
16
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Adding - aiakl
mon mon_inc mod_incmod0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Deleting - aiakl
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140 160 180 200
0 50 100 150 200 250
Time (ms)
# of clauses
Adding - ann
mon mon_inc mod_incmod0 50 100 150 200 250 300
0 50 100 150 200 250
Time (ms)
# of clauses
Deleting - ann
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc
0 5 10 15 20 25 30 35 40 45
0 10 20 30 40 50
Time (ms)
# of clauses
Adding - bid
mon mon_inc mod_incmod10 0 20 30 40 50 60 70 80 90
0 10 20 30 40 50
Time (ms)
# of clauses
Deleting - bid
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 5 10 15 20 25 30 35 40 45 50
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Adding - boyer
mon_incmon mod_incmod0 10 20 30 40 50 60 70
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Deleting - boyer
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Adding - cleandirs
mon_incmon mod_incmod0 100 200 300 400 500 600
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Deleting - cleandirs
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Adding - peephole
mon_incmon mod_incmod0 20 40 60 80 100 120 140 160
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Deleting - peephole
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - progeom
mon mon_inc mod mod_inc50 0 100 150 200 250 300 350
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - progeom
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
0 50 100 150 200 250
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Adding - read
mon_incmon mod_incmod20 0 40 60 100 80 120 140 160 180 200
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Deleting - read
mon_inc_tdmon mon_inc_scc mod_inc_tdmod mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - qsort
mon mon_inc mod mod_inc0 5 10 15 20 25 30 35
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - qsort
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
10 20 30 40 50 60 70
Time (ms)
Adding - rdtok
mon mon_inc mod_incmod10 20 30 40 50 60 70 80
Time (ms)
Deleting - rdtok
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc5 10 15 20 25 30 35 40
Time (ms)
Adding - warplan
mon-incmonmod mod-inc
10 20 30 40 50 60 70 80
Time (ms)
Deleting - warplan
mon-incmon mon-scc mod mod-inc mod-scc100 200 300 400 500 600 700 800
Time (ms)
Adding - witt
mon mon_inc mod_incmod200 400 600 800 1000 1200
Time (ms)
Deleting - witt
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_sccExperimental evaluation
17
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Adding - aiakl
mon mon_inc mod_incmod0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Deleting - aiakl
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140 160 180 200
0 50 100 150 200 250
Time (ms)
# of clauses
Adding - ann
mon mon_inc mod_incmod0 50 100 150 200 250 300
0 50 100 150 200 250
Time (ms)
# of clauses
Deleting - ann
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc
0 5 10 15 20 25 30 35 40 45
0 10 20 30 40 50
Time (ms)
# of clauses
Adding - bid
mon mon_inc mod_incmod10 0 20 30 40 50 60 70 80 90
0 10 20 30 40 50
Time (ms)
# of clauses
Deleting - bid
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 5 10 15 20 25 30 35 40 45 50
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Adding - boyer
mon_incmon mod_incmod0 10 20 30 40 50 60 70
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Deleting - boyer
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Adding - cleandirs
mon_incmon mod_incmod0 100 200 300 400 500 600
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Deleting - cleandirs
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Adding - peephole
mon_incmon mod_incmod0 20 40 60 80 100 120 140 160
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Deleting - peephole
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - progeom
mon mon_inc mod mod_inc50 0 100 150 200 250 300 350
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - progeom
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
0 50 100 150 200 250
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Adding - read
mon_incmon mod_incmod20 0 40 60 100 80 120 140 160 180 200
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Deleting - read
mon_inc_tdmon mon_inc_scc mod_inc_tdmod mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - qsort
mon mon_inc mod mod_inc0 5 10 15 20 25 30 35
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - qsort
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
0 10 20 30 40 50 60 70
0 10 20 30 40 50 60
Time (ms)
# of clauses
Adding - rdtok
mon mon_inc mod_incmod0 10 20 30 40 50 60 70 80
0 10 20 30 40 50 60
Time (ms)
# of clauses
Deleting - rdtok
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc
0 5 10 15 20 25 30 35 40
0 20 40 60 80 100 120
Time (ms)
# of clauses
Adding - warplan
mon-incmonmod mod-inc
0 10 20 30 40 50 60 70 80
0 20 40 60 80 100 120
Time (ms)
# of clauses
Deleting - warplan
mon-incmon mon-scc mod mod-inc mod-scc
0 100 200 300 400 500 600 700 800
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Adding - witt
mon mon_inc mod_incmod0 200 400 600 800 1000 1200
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Deleting - witt
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc
Experimental evaluation
Addition experiment (time in ms) – def domain
0 5 10 15 20 25 30 35 40
0 20 40 60 80 100 120
Time (ms)
# of clauses
Adding - warplan
mon mon-inc mod mod-inc
18
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Adding - aiakl
mon mon_inc mod_incmod0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Deleting - aiakl
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140 160 180 200
0 50 100 150 200 250
Time (ms)
# of clauses
Adding - ann
mon mon_inc mod_incmod0 50 100 150 200 250 300
0 50 100 150 200 250
Time (ms)
# of clauses
Deleting - ann
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc
0 5 10 15 20 25 30 35 40 45
0 10 20 30 40 50
Time (ms)
# of clauses
Adding - bid
mon mon_inc mod_incmod10 0 20 30 40 50 60 70 80 90
0 10 20 30 40 50
Time (ms)
# of clauses
Deleting - bid
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 5 10 15 20 25 30 35 40 45 50
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Adding - boyer
mon_incmon mod_incmod0 10 20 30 40 50 60 70
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Deleting - boyer
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Adding - cleandirs
mon_incmon mod_incmod0 100 200 300 400 500 600
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Deleting - cleandirs
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Adding - peephole
mon_incmon mod_incmod0 20 40 60 80 100 120 140 160
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Deleting - peephole
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - progeom
mon mon_inc mod mod_inc50 0 100 150 200 250 300 350
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - progeom
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
0 50 100 150 200 250
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Adding - read
mon_incmon mod_incmod20 0 40 60 100 80 120 140 160 180 200
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Deleting - read
mon_inc_tdmon mon_inc_scc mod_inc_tdmod mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - qsort
mon mon_inc mod mod_inc0 5 10 15 20 25 30 35
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - qsort
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
10 20 30 40 50 60 70
Time (ms)
Adding - rdtok
mon mon_inc mod_incmod10 20 30 40 50 60 70 80
Time (ms)
Deleting - rdtok
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc5 10 15 20 25 30 35 40
Time (ms)
Adding - warplan
mon-incmonmod mod-inc
10 20 30 40 50 60 70 80
Time (ms)
Deleting - warplan
mon-incmon mon-scc mod mod-inc mod-scc100 200 300 400 500 600 700 800
Time (ms)
Adding - witt
mon mon_inc mod_incmod200 400 600 800 1000 1200
Time (ms)
Deleting - witt
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_sccExperimental evaluation
Accumulated normalized time (def) – clause addition
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
hanoi aiakl qsort progeom bid rdtok cleand read warplan boyer peephole witt ann mproj clinks
The order inside each set of bars is: |mon|mon_inc|mod|mod_inc|.
19
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3
0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Adding - aiakl
mon mon_inc mod_incmod0 5 10 15 20 25
0 2 4 6 8 10 12 14 16
Time (ms)
# of clauses
Deleting - aiakl
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140 160 180 200
0 50 100 150 200 250
Time (ms)
# of clauses
Adding - ann
mon mon_inc mod_incmod0 50 100 150 200 250 300
0 50 100 150 200 250
Time (ms)
# of clauses
Deleting - ann
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc
0 5 10 15 20 25 30 35 40 45
0 10 20 30 40 50
Time (ms)
# of clauses
Adding - bid
mon mon_inc mod_incmod10 0 20 30 40 50 60 70 80 90
0 10 20 30 40 50
Time (ms)
# of clauses
Deleting - bid
mon mon_inc_td mon_inc_sccmod mod_inc_td mod_inc_scc
0 5 10 15 20 25 30 35 40 45 50
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Adding - boyer
mon_incmon mod_incmod0 10 20 30 40 50 60 70
0 20 40 60 80 100 120 140 160
Time (ms)
# of clauses
Deleting - boyer
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120 140
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Adding - cleandirs
mon_incmon mod_incmod0 100 200 300 400 500 600
0 10 20 30 40 50 60 70 80
Time (ms)
# of clauses
Deleting - cleandirs
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 20 40 60 80 100 120
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Adding - peephole
mon_incmon mod_incmod0 20 40 60 80 100 120 140 160
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Deleting - peephole
mon_inc_tdmon mon_inc_scc mod mod_inc_td mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - progeom
mon mon_inc mod mod_inc50 0 100 150 200 250 300 350
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - progeom
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
0 50 100 150 200 250
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Adding - read
mon_incmon mod_incmod20 0 40 60 100 80 120 140 160 180 200
0 10 20 30 40 50 60 70 80 90 100
Time (ms)
# of clauses
Deleting - read
mon_inc_tdmon mon_inc_scc mod_inc_tdmod mod_inc_scc
0 2 4 6 10 8 12 14
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Adding - qsort
mon mon_inc mod mod_inc0 5 10 15 20 25 30 35
0 2 4 6 8 10 12 14 16 18
Time (ms)
# of clauses
Deleting - qsort
mon mon_inc_td mon_inc_scc mod mod_inc_td mod_inc_scc
0 10 20 30 40 50 60 70
0 10 20 30 40 50 60
Time (ms)
# of clauses
Adding - rdtok
mon mon_inc mod_incmod0 10 20 30 40 50 60 70 80
0 10 20 30 40 50 60
Time (ms)
# of clauses
Deleting - rdtok
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc
0 5 10 15 20 25 30 35 40
0 20 40 60 80 100 120
Time (ms)
# of clauses
Adding - warplan
mon-incmonmod mod-inc
0 10 20 30 40 50 60 70 80
0 20 40 60 80 100 120
Time (ms)
# of clauses
Deleting - warplan
mon-incmon mon-scc mod mod-inc mod-scc
0 100 200 300 400 500 600 700 800
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Adding - witt
mon mon_inc mod_incmod0 200 400 600 800 1000 1200
0 20 40 60 80 100 120 140 160 180
Time (ms)
# of clauses
Deleting - witt
mon mon_inc_td mon_inc_scc mod_inc_tdmod mod_inc_scc