Runtime Analysis and Program Transformations for Dynamic Programs
description
Transcript of Runtime Analysis and Program Transformations for Dynamic Programs
![Page 1: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/1.jpg)
Runtime Analysis and Program Transformations for Dynamic ProgramsJohn Blatz
CS 325/425
April 26, 2006
![Page 2: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/2.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Matrix multiplication & computational complexity
for I in 1:n for J in 1:n
c(I,J) = 0 for K in 1:n
c(I,J) += a(I,K) * b(K,J)
row I
column J
a b c
x =
c(I, J)
O(n3)
![Page 3: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/3.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Matrix multiplication & computational complexity
c(I,J) += a(I,K) * b(K,J)
row I
column J
a b c
x =
c(I, J)
O(n3)(declaratively) equivalent Dyna program:
![Page 4: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/4.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Example: context-free parsing
k grammar symbols (X, Y, Z) n words in sentence (I, J, K) O(k3n3) Actually just an upper bound! (why?)
goal += constit(s,0,N) * end(N).
constit(X,I,J) += rewrite(X,W) * word(W,I,J).
constit(X,I,K) += rewrite(X,Y,Z) * constit(Y,I,J) * constit(Z,J,K).
![Page 5: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/5.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Sparsity
Runtime of a dynamic rule = total number of ways to instantiate it
Sparse computations much faster Example: multiplication of diagonal matrices
Only a and b items that exist are of the form a(I, I) or b(I, I)
Asymptotic runtime = O(n) instead of O(n3)
c(I,I) += a(I,I) * b(I,I)c(I,J) += a(I,K) * b(K,J) unification
![Page 6: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/6.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Building a declarative house
Declarative specification Procedural
instructions
Programmer
Solver
Output
![Page 7: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/7.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Building a declarative house
Declarative specification Procedural
instructions
Programmer
Solver
Output
EndTime #= max(EndTimes),
minimize(labeling(AllVars), EndTime).
???
![Page 8: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/8.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Semi-declarative programming How can we get the solver to be more
efficient? Tell it how to solve the problem:
minimize(search(AllVars, 0, smallest, indomain_min, complete, []), EndTime).
Explain the problem differently
![Page 9: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/9.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Building a declarative house
Declarative specification
Proceduralinstructions
Programmer
Solver
Output
Better declarative specification
Transformation
![Page 10: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/10.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Program transformation examplesabove(X, Y) :- above(Underling, Y), boss(X, Underling).
Prolog will recurse forever on this program“Transform” into equivalent program:
above(X, Y) :- boss(X, Underling), above(Underling, Y).
![Page 11: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/11.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Program transformation examples
Fusing constraints makes arc consistency stronger
X #\= Y,Y #\= Z,Z #\= X,
fuse constraints alldifferent([X,Y,Z])
white
green
black
…
X
alldifferent(X,Y,Z) and [X,Y]::[blue,red]
red
blue
Y=blue
Z=blue
Z=black
Z=red
red black
Y
no longer possible!
![Page 12: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/12.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Program transformation examples
Above example computes all possible trees, and so it will run forever
Transform it to only consider trees that we are interested in
rooted(t(R,[])) max= iq(R).
unrooted(t(R,[])) max= zero whenever iq(R).
zero := 0.
any(T) max= rooted(T). any(T) max= unrooted(T).
rooted(t(R,[X|Xs])) max= rooted(t(R,Xs)) + unrooted(X).
unrooted(t(R,[X|Xs])) max= unrooted(t(R,Xs)) + any(X)
![Page 13: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/13.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Program transformation examplesrooted(t(R,[])) max= iq(R).
unrooted(t(R,[])) max= zero whenever iq(R).
zero := 0.
any(T) max= rooted(T). any(T) max= unrooted(T).
rooted(t(R,[X|Xs])) max= rooted(t(R,Xs)) + unrooted(X).
whenever(interesting(t(R,[X|Xs])).
unrooted(t(R,[X|Xs])) max= unrooted(t(R,Xs)) + any(X)
whenever(interesting(t(R,[X|Xs])).
interesting(X) max= input(X).
interesting(X) max= interesting(t(R,[X|_])).
interesting(t(R,Xs)) max= interesting(t(R,[_|Xs])).
goal max= any(X) whenever input(X).
![Page 14: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/14.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
The folding/unfolding paradigm Small, basic steps which can be composed Has been applied to several declarative
languages
![Page 15: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/15.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
goal += constit(s,0,N) * end(N).
constit(X,I,J) += word(W,I,J) * rewrite(X,W) .
constit(X,I,K) += constit(Y,I,J) * constit(Z,J,K) * rewrite(X,Y,Z).
constit(X,I,K)
word(W,I,K)constit(Z,J,K)rewrite(X,W)
constit(Y,I,J)
rewrite(X,Y,Z)
![Page 16: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/16.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
goal += constit(s,0,N) * end(N).
constit(X,I,J) += word(W,I,J) * rewrite(X,W) .
constit(X,I,K) += constit(Y,I,J) * constit(Z,J,K) * rewrite(X,Y,Z).
constit(X,I,K)
word(W,I,K)constit(Z,J,K)rewrite(X,W)
constit(Y,I,J)
rewrite(X,Y,Z)
![Page 17: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/17.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
goal += constit(s,0,N) * end(N).
constit(X,I,J) += word(W,I,J) * rewrite(X,W) .
constit(X,I,K) += constit(Y,I,J) * constit(Z,J,K) * rewrite(X,Y,Z).
temp(X,Y,Z,J,K) = constit(Z,J,K) * rewrite(X,Y,Z).
constit(X,I,K)
word(W,I,K)constit(Z,J,K)rewrite(X,W)
constit(Y,I,J)
rewrite(X,Y,Z)
temp(X,Y,Z,J,K)
![Page 18: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/18.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
goal += constit(s,0,N) * end(N).
constit(X,I,J) += word(W,I,J) * rewrite(X,W) .
constit(X,I,K) += constit(Y,I,J) * temp(X,Y,Z,J,K)
temp(X,Y,Z,J,K) = constit(Z,J,K) * rewrite(X,Y,Z).
constit(X,I,K)
word(W,I,K)constit(Z,J,K)rewrite(X,W)
constit(Y,I,J)
rewrite(X,Y,Z)
temp(X,Y,Z,I,J)temp(X,Y,Z,J,K)
![Page 19: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/19.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Fully transformed version
goal += constit(s,0,N) * end(N).
constit(X,I,J) += word(W,I,J) * rewrite(X,W) .
constit(X,I,K) += constit(Y,I,J) * temp(X,Y,Z,J,K)
temp(X,Y,Z,J,K) = constit(Z,J,K) * rewrite(X,Y,Z).
Still O(k3n3) in the worst-case But could actually be much faster—why?
Many constit(Z,J,K) items, few rewrite(X,Y,Z) Avoids repeating work if temp is already built Fails faster if agenda is poorly ordered Could be followed by another transformation
k grammar symbols (X,Y,Z)n positions in string (I,J,K)
![Page 20: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/20.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
Folding can improve asymptotic runtime!
constit(X,I,K) =
constit(y1,I,j1) * constit(z1,j1,K) * rewrite(X,y1,z1) + constit(y1,I,j1) * constit(z2,j1,K) * rewrite(X,y1,z2)+ constit(y2,I,j1) * constit(z1,j1,K) * rewrite(X,y2,z1)+ constit(y2,I,j1) * constit(z2,j1,K) * rewrite(X,y2,z2)+ constit(y1,I,j2) * constit(z1,j2,K) * rewrite(X,y1,z1)+ constit(y1,I,j2) * constit(z2,j2,K) * rewrite(X,y1,z2)+ constit(y2,I,j2) * constit(z1,j2,K) * rewrite(X,y2,z1)+ constit(y2,I,j2) * constit(z2,j2,K) * rewrite(X,y2,z2)+ …
temp(X,y1,z1,j1,K)
temp(X,y1,z2,j1,K)
temp(X,y2,z1,j1,K)
temp(X,y2,z2,j1,K)
temp(X,y1,z1,j2,K)temp(X,y1,z2,j2,K)
temp(X,y2,z1,j2,K)temp(X,y2,z2,j2,K)
temp(X,Y,Z,J,K) = constit(Z,J,K) * rewrite(X,Y,Z).
![Page 21: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/21.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
Sum over values of Z before summing over Y and J
constit(X,I,K) =
constit(y1,I,j1) * constit(z1,j1,K) * rewrite(X,y1,z1) + constit(y1,I,j1) * constit(z2,j1,K) * rewrite(X,y1,z2)+ constit(y2,I,j1) * constit(z1,j1,K) * rewrite(X,y2,z1)+ constit(y2,I,j1) * constit(z2,j1,K) * rewrite(X,y2,z2)+ constit(y1,I,j2) * constit(z1,j2,K) * rewrite(X,y1,z1)+ constit(y1,I,j2) * constit(z2,j2,K) * rewrite(X,y1,z2)+ constit(y2,I,j2) * constit(z1,j2,K) * rewrite(X,y2,z1)+ constit(y2,I,j2) * constit(z2,j2,K) * rewrite(X,y2,z2)+ …
temp2(X,Y,J,K) = constit(Z,J,K) * rewrite(X,Y,Z).
![Page 22: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/22.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
Sum over values of Z before summing over Y and J
constit(X,I,K) =
constit(z1,j1,K) * rewrite(X,y1,z1) + constit(z2,j1,K) * rewrite(X,y1,z2)
+ constit(y2,I,j1) * constit(z1,j1,K) * rewrite(X,y2,z1)+ constit(y2,I,j1) * constit(z2,j1,K) * rewrite(X,y2,z2)+ constit(y1,I,j2) * constit(z1,j2,K) * rewrite(X,y1,z1)+ constit(y1,I,j2) * constit(z2,j2,K) * rewrite(X,y1,z2)+ constit(y2,I,j2) * constit(z1,j2,K) * rewrite(X,y2,z1)+ constit(y2,I,j2) * constit(z2,j2,K) * rewrite(X,y2,z2)+ …
temp2(X,Y,J,K) = constit(Z,J,K) * rewrite(X,Y,Z).
temp2(X,y1,j1,K)constit(y1,I,j1) *
![Page 23: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/23.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding
Sum over values of Z before summing over Y and J
constit(X,I,K) =
constit(z1,j1,K) * rewrite(X,y1,z1) + constit(z2,j1,K) * rewrite(X,y1,z2)
constit(z1,j1,K) * rewrite(X,y2,z1) + constit(z2,j1,K) * rewrite(X,y2,z2) constit(z1,j2,K) * rewrite(X,y1,z1)
+ constit(z2,j2,K) * rewrite(X,y1,z2) constit(z1,j2,K) * rewrite(X,y2,z1) + constit(z2,j2,K) * rewrite(X,y2,z2)+ …
temp2(X,Y,J,K) = constit(Z,J,K) * rewrite(X,Y,Z).
temp2(X,y1,j1,K)constit(y1,I,j1) *
+ constit(y2,I,j2) *
+ constit(y1,I,j2) *
+ constit(y2,I,j1) * temp2(X,y2,j1,K)
temp2(X,y1,j2,K)
temp2(X,y2,j2,K)
![Page 24: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/24.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Folding – best version
goal += constit(s,0,N) * end(N).
constit(X,I,J) += word(W,I,J) * rewrite(X,W) .
constit(X,I,K) += constit(Y,I,J) * temp2(X,Y,J,K)
temp2(X,Y,J,K) += constit(Z,J,K) * rewrite(X,Y,Z).
Asymptotic complexity has been reduced! O(k2n3) for constit rule (doesn’t mention Z) + O(k3n2) for temp2 rule (doesn’t mention I)
k grammar symbols (X,Y,Z)n positions in string (I,J,K)
![Page 25: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/25.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Other names for folding
Substitution Storing intermediate results Common subexpression elimination Moving an invariant out of a loop Building speculatively
![Page 26: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/26.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Unfolding
Unfolding = inverse of folding Inlines computation
pathto(X) max= pathto(Y) + edge(Y, X).
pathto(X) max= pathto(Z) + edge(Z,Y) + edge(Y, X).
pathto(Y) max= pathto(Z) + edge(Z, Y).
![Page 27: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/27.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Pop quiz
A folding transformation can possibly
increase decrease not affect
the asymptotic time complexity.
A folding transformation can possibly
increase decrease not affect
the asymptotic space complexity.
![Page 28: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/28.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Pop quiz
An unfolding transformation can possibly
increase decrease not affect
the asymptotic time complexity.
An unfolding transformation can possibly
increase decrease not affect
the asymptotic space complexity.
![Page 29: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/29.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Maximum independent set in a treeany(T) = the size of the maximum independent set in T
rooted(T) = the size of the maximum independent set in T that includes T’s root
unrooted(T) = the size of the maximum independent set in T that excludes T’s root
rooted(t(R,[])) max= iq(R). unrooted(t(_,[])) max= 0.
any(T) max= rooted(T). any(T) max= unrooted(T).
rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)).
as before
![Page 30: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/30.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Maximum independent set in a tree(shorter but harder to understand version: find it automatically?)
We could actually eliminate “rooted” from the program. Just do everything with “unrooted” and “any.”
Slightly more efficient, but harder to convince yourself it’s right. That is, it’s an optimized version of the previous slide! We can prove it’s equivalent by a sequence of folding and
unfolding steps—let’s see how!
any(t(R,[])) max= iq(R). unrooted(t(_,[])) max= 0.
any(T) max= unrooted(T).
any(t(R,[X|Xs])) max= any(t(R,Xs)) + unrooted(X). unrooted(t(R,[X|Xs])) max= unrooted(t(R,Xs)) + any(X).
![Page 31: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/31.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)).
![Page 32: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/32.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)).
unfold
![Page 33: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/33.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)).
replaced by , ⑦ ⑧
Gray rules are no longer part of the program
![Page 34: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/34.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)).
unfold
![Page 35: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/35.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)).
replaced by , ⑨ ⑩
![Page 36: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/36.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)).
unfold
Rules and are no longer part of the current program① ② They were the definition of any(T) in a previous valid
program, so we can use them for unfolding
![Page 37: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/37.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
replaced by , ⑪ ⑫
![Page 38: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/38.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
Duplicating a rule doesn’t affect the value computed by max=
Allowed to do this transformation because of this particular property of max=
duplicate
![Page 39: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/39.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
Fold two rules into two rules
fold
![Page 40: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/40.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
replaced by ⑭
![Page 41: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/41.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
fold
![Page 42: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/42.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
⑮ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)).
replaced by ⑮
![Page 43: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/43.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
⑮ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)).
fold
![Page 44: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/44.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
⑮ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑯ any(T) max= unrooted(T).
fold
![Page 45: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/45.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
⑮ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑯ any(T) max= unrooted(T).
trim
Nothing relies on rooted anymore, so we can delete it
![Page 46: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/46.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
⑮ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑯ any(T) max= unrooted(T).
![Page 47: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/47.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
① any(T) max= rooted(T). ② any(T) max= unrooted(T). ③ rooted(t(R,[])) max= iq(R). ④ rooted(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑤ unrooted(t(_,[])) max= 0. ⑥ unrooted(t(R,[X|Xs])) max= any(X) + unrooted(t(R,Xs)). ⑦ any(t(R,[])) max= iq(R). ⑧ any(t(R,[X|Xs])) max= unrooted(X) + rooted(t(R,Xs)). ⑨ any(t(_,[])) max= 0. ⑩ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑪ any(t(R,[X|Xs])) max= rooted(X) + unrooted(t(R, Xs)). ⑫ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).
⒀ any(t(R,[X|Xs])) max= unrooted(X) + unrooted(t(R, Xs)).⑭ any(t(R,[X|Xs])) max= unrooted(X) + any(t(R, Xs)).
⑮ any(t(R,[X|Xs])) max= any(X) + unrooted(t(R, Xs)). ⑯ any(T) max= unrooted(T).
Success!
![Page 48: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/48.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Bottom-up evaluationgoal
subgoal axiom
subgoal axiom
subgoalsubgoal
axiom
axiom
subgoal
subgoal
axiom
subgoal
axiomsubgoal
Combine all axioms to build all possible subgoals…many irrelevant to goal!
![Page 49: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/49.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
“Magic Templates” Transformation Simulate top-down execution Introduce new “interesting” predicates that
keep track of what top-down execution built “interesting(foo(x))” means “top-down
execution would have examined “foo(x)” If in order to build “foo” you need to build
“bar”, then interesting(bar) :- interesting(foo). Magic predicates will later be used to filter
bottom-up constructionrelate to “interesting” from max indep set example
![Page 50: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/50.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
What would Prolog do?
interesting(goal). interesting(constit(s,0)) :-
interesting(goal). interesting(rewrite(s)) :-
interesting(constit(s,0)). interesting(constit(np,0)) :-
interesting(constit(s,0)), rewrite(s,np,vp). interesting(constit(vp,1)) :-
interesting(constit(s,0)). rewrite(s,np,vp), constit(np,0,1).
goal
constit(s,0,N) end(N)
goal += constit(s,0,N) * end(N).
constit(X,I,J) += rewrite(X,W) * word(W,I,J).
constit(X,I,K) += rewrite(X,Y,Z) * constit(Y,I,J) * constit(Z,J,K).
constit(np,0,1) constit(vp,1,N)
<--- apply this rule
<--- now apply this rule
Don’t really need this--assume we’ve built all the grammar rules beforehand
![Page 51: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/51.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Generalization
foo(X, Y) += bar(X, A) * baz(A, Y).
interesting(bar(X)) |= interesting(foo(X, Y)). interesting(baz(A,Y)) |=
interesting(foo(X,Y)) & bar(X,A).
![Page 52: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/52.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
The transformed program
interesting(goal) = TRUE.
interesting(constit(s,0)) |= interesting(goal).
interesting(constit(Y,I)) |= interesting(constit(X,I)) & rewrite(X,Y,Z).
interesting(constit(Z,J)) |= interesting(constit(X,I)) & rewrite(X,Y,Z) & constit(Y,I,J).
goal += constit(s,0,N) * end(N) if interesting(goal).
constit(X,I,J) += rewrite(X,W) * word(W,I,J) if interesting(constit(X,I)).
constit(X,I,K) += rewrite(X,Y,Z) * constit(Y,I,J) * constit(Z,J,K) if interesting(constit(X,I)).
Uses forward chaining to simulate backward chaining
![Page 53: Runtime Analysis and Program Transformations for Dynamic Programs](https://reader035.fdocuments.in/reader035/viewer/2022070416/568150f7550346895dbf149b/html5/thumbnails/53.jpg)
600.325/425 Declarative Methods – J.
Eisner/J. Blatz
Magic Executiongoal
subgoal axiom
subgoal axiom
subgoal impossiblesubgoal subgoal
axiom
axiom impossible subgoal
irrelevantsubgoal
irrelevantsubgoal
axiom
irrelevantsubgoal
irrelevantaxiom
irrelevantsubgoal
Build interesting filters before other predicates