Exploring Constraint-Based Search and Program Synthesis Strategies

lecture 7 n.w
1 / 31
Embed
Share

Delve into the concepts of constraint-based search, program synthesis, language design strategies, and more to understand how to efficiently solve problems and generate programs using generative techniques.

  • Search strategies
  • Program synthesis
  • Language design
  • Generative programming
  • Efficient problem solving

Uploaded on | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

You are allowed to download the files provided on this website for personal or commercial use, subject to the condition that they are used lawfully. All files are the property of their respective owners.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.

E N D

Presentation Transcript


  1. Lecture 7 Constraint-based Search Xiaokang Qiu

  2. Constraint-based search Key idea1: Search as curve fitting curve is a parameterized family of functions ? = ? ? ? ?} Key idea 2: Define a language to describe parameterized programs Key idea 3: Solve instead of search

  3. Synthesis with constraints Overview of the Sketch language Turning synthesis problems into constraints Efficient constraint solving

  4. Language Design Strategy Extend base language with one construct Constant hole: ?? int bar (int x) { int t = x * ??; assert t == x + x; return t; } int bar (int x) { int t = x * 2; assert t == x + x; return t; } Synthesizer replaces ?? with a constant High-level constructs defined in terms of ??

  5. Integer Generator Sets of Expressions Expressions with ?? == sets of expressions linear expressions polynomials sets of variables ?? ? x : y x*?? + y*?? + ?? x*x*?? + x*?? + ??

  6. Example: Registerless Swap Swap two words without an extra temporary int W = 32; void swap(ref bit[W] x, ref bit[W] y){ if(??){ x = x ^ y;}else{ y = x ^ y; } if(??){ x = x ^ y;}else{ y = x ^ y; } if(??){ x = x ^ y;}else{ y = x ^ y; } } harnessvoid main(bit[W] x, bit[W] y){ bit[W] tx = x; bit[W] ty = y; swap(x, y); assert x==ty && y == tx; }

  7. From simple to complex holes We need to compose ?? to form complex holes Borrow ideas from generative programming Define generators to produce families of functions Use partial evaluation aggressively

  8. Generators Look like a function but are partially evaluated into their calling context Key feature: Different invocations Different code Can recursively define arbitrary families of programs

  9. Sample Generator /** * Generate the set of all bit-vector expressions * involving +, &, xor and bitwise negation (~). * the bnd param limits the size of the generated expression. */ generatorbit[W] gen(bit[W] x, int bnd){ assert bnd > 0; if(??) return x; if(??) return ??; if(??) return ~gen(x, bnd-1); if(??){ return {| gen(x, bnd-1) (+ | & | ^) gen(x, bnd-1) |}; } }

  10. Example: Least Significant Zero Bit generator bit[W] gen(bit[W] x, int bnd){ assert bnd > 0; if(??) return x; if(??) return ??; if(??) return ~gen(x, bnd-1); if(??){ return {| gen(x, bnd-1) (+ | & | ^) gen(x, bnd-1) |}; } } bit[W] isolate0sk (bit[W] x){ return gen(x, 3); }

  11. High order generators /* * Generate code from f n times */ generatorvoid rep(int n, fun f){ if(n>0){ f(); rep(n-1, f); } }

  12. Closures + High Order Generators generatorvoid rep(int n, fun f){ if(n>0){ f(); rep(n-1, f); } } bit[16] reverseSketch(bit[16] in) { bit[16] t = in; int s = 1; generatorvoid tmp(){ bit[16] m = ??; t = ((t << s)&m )| ((t >> s)&(~m)); s = s*??; } rep(??, tmp); return t; }

  13. Syntactic Sugar {| RegExp |} RegExp supports choice | and optional ? can be used arbitrarily within an expression to select operands {| (x | y | z) + 1 |} to select operators {| x (+ | -) y |} to select fields {| n(.prev | .next)? |} to select arguments {| foo( x | y, z) |} Set must respect the type system all expressions in the set must type-check all must be of the same type

  14. repeat Avoid copying and pasting repeat(n){ s} s;s; s; n each of the n copies may resolve to a distinct stmt n can be a hole too.

  15. Example: Reversing bits pragma options "--bnd-cbits 3 "; int W = 32; bit[W] reverseSketch(bit[W] in) { bit[W] t = in; int s = 1; int r = ??; repeat(??){ bit[W] tmp1 = (t << s); bit[W] tmp2 = (t >> s); t = tmp1 {|} tmp2; // Syntactic sugar for m=??, (tmp1&m | tmp2&~m). s = s*r; } return t; }

  16. Framing the synthesis problem Goal: Find a function from holes to values Easy in the absence of generators bit[W] isolateSk (bit[W] x) implements isolate0 { return !(x + ??1) & (x + ??2) ; } Finite set of holes so function is just a table

  17. Framing the synthesis problem Goal: Find a function from holes to values Easy in the absence of generators bit[W] isolateSk (bit[W] x) implements isolate0 { return !(x + ?(??1)) & (x + ?(??2)) ; } Finite set of holes so function is just a table

  18. Framing the synthesis problem Generators need something more generator bit[W] gen(bit[W] x, int bnd){ assert bnd > 0; if(??1) return x; if(??2) return ??5; if(??3) return ~geng1(x, bnd-1); if(??4){ ... } } bit[W] isolate0sk (bit[W] x) implements isolate0 { return geng0(x, 3); }

  19. Framing the synthesis problem Generators need something more generator bit[W] gen(bit[W] x, int bnd){ assert bnd > 0; if(?(??1)) return x; if(?(??2)) return ?(??5); if(?(??3)) return ~geng1(x, bnd-1); if(?(??4)){ ... } } bit[W] isolate0sk (bit[W] x) implements isolate0 { return geng0(x, 3); }

  20. Framing the synthesis problem Generators need something more The value of the holes depends on the context generator bit[W] gen(context ? , bit[W] x, int bnd){ assert bnd > 0; if(?(?,??1)) return x; if(?(?,??2)) return ?(?,??5); if(?(?,??3)) return ~geng1(? ??, x, bnd-1); if(?(?,??4)){ ... } } bit[W] isolate0sk (bit[W] x) implements isolate0 { return geng0(??, x, 3); }

  21. Framing the synthesis problem generator bit[W] gen(context ? , bit[W] x, int bnd){ assert bnd > 0; if(?(?,??1)) return x; if(?(?,??2)) return ?(?,??5); if(?(?,??3)) return ~geng1(? ??, x, bnd-1); if(?(?,??4)){ return {| geng2(? ??, x, bnd-1) (+ | & | ^) geng3(? ??, x, bnd-1) |}; } } bit[W] isolate0sk (bit[W] x) implements isolate0 { return geng0(??, x, 3); } ?(?0,??k) ?(?0?1,??k) ?(?0?2,??k) ?(?0?1?2,??k) ?(?0?1?3,??k) ?(?0?1?2?1,??k) ... Potentially unbounded set of unknowns We can bound the depth of recursion That means again ? is just a table

  22. The inductive synthesis problem ? ?? ? ?(??,?) where E = {x1, x2, , xk} 22

  23. Overall Strategy Sketch with harnesses Symbolic Execution Simplification Encoding Solver

  24. Building Constraints

  25. A sketch as a constraint system x > (??1) x+1 > (??1) int lin(int x){ if(x > (??1)) return (??2)*x + (??3); else return (??4)*x; } (??2)*x + (??3) (??2)*(x+1) + (??3) void main(int x){ int t1 = lin(x); int t2 = lin(x+1); if(x<4) assert t1 >= x*x; if(x>=3) assert t2-t1 == 1; } (??4)*(x+1) (??4)*x mux mux 1 x>=4 - x<3 x*x = >= or or and 25

  26. x >> & & + int popSketched (bit[W] x) implements pop { repeat(??) { x = (x & ??) + ((x >> ??) & ??); } return x; } mux x >> & & + mux x >> & & + mux x 26

  27. Ex : Population count. 0010 0110 3 x count one 0 0 0 0 0 0 0 1 + int pop (bit[W] x) { int count = 0; for (int i = 0; i < W; i++) { if (x[i]) count++; } return count; } mux count + mux count + mux count + mux count 27

  28. Simplification

  29. Structural Hashing h0 h1 h2 h0 h1 h2 h0 h1 h2 + + + + * * * * * a b a b a b

  30. Structural hashing + rewriting 0 a a a b 0 a h0 h0 h0 h0 h0 h0 h0 0 ? + ? < ? ? < 0 + + + + + ? ? ? 0 0 0 0 < < < < < < < < < < < < < < ^ ^ ^ ^ ^ ^ ^ ^ ^

  31. What about Arithmetic? 1) Bit-blast 2) Unary encoding 3) SMT

Related


More Related Content