Programming with Invariants through Targeted Synthesis John Sarracino 1
Programming is Hard
Programming is Hard Therac 25 1982
Programming is Hard Ariane 5 1996
Programming is Hard Maersk 2017
Programming is Hard Windows 2018
Programming is Hard Windows always
Computers are a Sadness and I am the cure
Programs are a Sadness and I am the cure
Software Invariants ubi_assert(e->num!= e1->num); if (keyproto.getkeyvalue().size()!= Ed25519Verify.PUBLIC_KEY_LEN) { throw new GeneralSecurityException( invalid Ed25519 public key: incorrect key length ); ensure cat_set : has_category(cat) end
Software Invariants ubi_assert(e->num!= e1->num); C if (keyproto.getkeyvalue().size()!= Ed25519Verify.PUBLIC_KEY_LEN) { throw new GeneralSecurityException( invalid Ed25519 public key: incorrect key length ); ensure cat_set : has_category(cat) end
Software Invariants ubi_assert(e->num!= e1->num); C if (keyproto.getkeyvalue().size()!= Ed25519Verify.PUBLIC_KEY_LEN) { throw new GeneralSecurityException( invalid Ed25519 public key: incorrect key length ); Java ensure cat_set : has_category(cat) end
Software Invariants ubi_assert(e->num!= e1->num); C if (keyproto.getkeyvalue().size()!= Ed25519Verify.PUBLIC_KEY_LEN) { throw new GeneralSecurityException( invalid Ed25519 public key: incorrect key length ); Java ensure cat_set : has_category(cat) end Eiffel
Software Invariants ubi_assert(e->num!= e1->num); C if (keyproto.getkeyvalue().size()!= Ed25519Verify.PUBLIC_KEY_LEN) { throw new GeneralSecurityException( invalid Ed25519 public key: incorrect key length ); Language agnostic, Manually maintained. Java ensure cat_set : has_category(cat) end Eiffel
Manual Invariant Programming Invariants Algorithm
Manual Invariant Programming Invariants Algorithm Code
Manual Invariant Programming Invariants Algorithm Code
Why are Manual Invariants difficult? Code changes => Programmer checks, maintains invariant Invariant changes => Programmer checks, maintains code
The code change problem: Maintaining Invariants Invariant: All urls are in the urlset
The code change problem: Maintaining Invariants Invariant: All urls are in the urlset
The code change problem: Maintaining Invariants Invariant: All urls are in the urlset
The code change problem: Maintaining Invariants Tedious and error-prone, particularly with a large codebase Invariant: All urls are in the urlset
The invariant change problem: Maintaining Code Invariant: All urls are in the urlset
The invariant change problem: Maintaining Code Invariant: All urls are in the urlset The allocset contains the urlset
The invariant change problem: Maintaining Code Even more tedious and error-prone Invariant: All urls are in the urlset The allocset contains the urlset
My thesis statement Compiling and generating invariants is useful, novel, and broadly applicable.
My thesis proposal Compiling and generating invariants is useful, novel, and broadly applicable. I propose a general framework for maintaining invariants
Proposed Work Data invariant calculus Extensions Invariants for Security GUI invariants
Outline Data invariant calculus Extensions Invariants for Security GUI invariants
Outline Data invariant calculus Extensions Invariants for Security GUI invariants
Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i]
Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i]
Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i]
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
Budgeting Code for (let index = 0; index!= week.length; ++index) { week[index].oninput = () => { let w = parsefloat(week[index].textcontent); month[index].textcontent = w * 4; year[index].textcontent = w * 12 * 4; refreshcolors(index); month[index].oninput = () => { let m = parsefloat(month[index].textcontent); week[index].textcontent = m / 4; year[index].textcontent = m * 12; refreshcolors(index); year[index].oninput = () => { let y = parsefloat(year[index].textcontent); week[index].textcontent = y / (4 * 12); month[index].textcontent = y / 12; refreshcolors(index); document.getelementbyid('evenpicker').oninput = () => { evencolor = document.getelementbyid('evenpicker').value; for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].style.backgroundcolor = evencolor; month[index].style.backgroundcolor = evencolor; year[index].style.backgroundcolor = evencolor; else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor; document.getelementbyid('oddpicker').oninput = () => { oddcolor = document.getelementbyid('oddpicker').value; for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].style.backgroundcolor = evencolor; month[index].style.backgroundcolor = evencolor; year[index].style.backgroundcolor = evencolor; else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor;
Budgeting Code document.getelementbyid('evenpicker').oninput = () => { evencolor = document.getelementbyid('evenpicker').value; for (let index = 0; index!= week.length; ++index) { for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].oninput = () => { week[index].style.backgroundcolor = evencolor; let w = parsefloat(week[index].textcontent); month[index].style.backgroundcolor = evencolor; month[index].textcontent = w * 4; year[index].style.backgroundcolor = evencolor; year[index].textcontent = w * 12 * 4; else { refreshcolors(index); week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; Tedious even for this year[index].style.backgroundcolor simple example = oddcolor; month[index].oninput = () => { let m = parsefloat(month[index].textcontent); week[index].textcontent = m / 4; year[index].textcontent = m * 12; refreshcolors(index); document.getelementbyid('oddpicker').oninput = () => { oddcolor = document.getelementbyid('oddpicker').value; for (let index = 0; index!= week.length; ++index) { year[index].oninput = () => { if (index % 2 == 0) { let y = parsefloat(year[index].textcontent); week[index].style.backgroundcolor = evencolor; week[index].textcontent = y / (4 * 12); month[index].style.backgroundcolor = evencolor; month[index].textcontent = y / 12; year[index].style.backgroundcolor = evencolor; refreshcolors(index); else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor;
Budgeting Code Invariants Algorithm for (let index = 0; index!= week.length; ++index) { week[index].oninput = () => { let w = parsefloat(week[index].textcontent); month[index].textcontent = w * 4; year[index].textcontent = w * 12 * 4; refreshcolors(index); month[index].oninput = () => { let m = parsefloat(month[index].textcontent); week[index].textcontent = m / 4; year[index].textcontent = m * 12; refreshcolors(index); year[index].oninput = () => { let y = parsefloat(year[index].textcontent); week[index].textcontent = y / (4 * 12); month[index].textcontent = y / 12; refreshcolors(index); document.getelementbyid('evenpicker').oninput = () => { evencolor = document.getelementbyid('evenpicker').value; for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].style.backgroundcolor = evencolor; month[index].style.backgroundcolor = evencolor; year[index].style.backgroundcolor = evencolor; else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor; document.getelementbyid('oddpicker').oninput = () => { oddcolor = document.getelementbyid('oddpicker').value; for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].style.backgroundcolor = evencolor; month[index].style.backgroundcolor = evencolor; year[index].style.backgroundcolor = evencolor; else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor;
Budgeting Code Invariants Algorithm for (let index = 0; index!= week.length; ++index) { week[index].oninput = () => { let w = parsefloat(week[index].textcontent); month[index].textcontent = w * 4; year[index].textcontent = w * 12 * 4; refreshcolors(index); month[index].oninput = () => { let m = parsefloat(month[index].textcontent); week[index].textcontent = m / 4; year[index].textcontent = m * 12; refreshcolors(index); year[index].oninput = () => { let y = parsefloat(year[index].textcontent); week[index].textcontent = y / (4 * 12); month[index].textcontent = y / 12; refreshcolors(index); document.getelementbyid('evenpicker').oninput = () => { evencolor = document.getelementbyid('evenpicker').value; for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].style.backgroundcolor = evencolor; month[index].style.backgroundcolor = evencolor; year[index].style.backgroundcolor = evencolor; else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor; document.getelementbyid('oddpicker').oninput = () => { oddcolor = document.getelementbyid('oddpicker').value; for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].style.backgroundcolor = evencolor; month[index].style.backgroundcolor = evencolor; year[index].style.backgroundcolor = evencolor; else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor;
Budgeting Code Invariants Algorithm document.getelementbyid('evenpicker').oninput = () => { evencolor = document.getelementbyid('evenpicker').value; for (let index = 0; index!= week.length; ++index) { for (let index = 0; index!= week.length; ++index) { if (index % 2 == 0) { week[index].oninput = () => { week[index].style.backgroundcolor = evencolor; let w = parsefloat(week[index].textcontent); month[index].style.backgroundcolor = evencolor; month[index].textcontent = w * 4; year[index].style.backgroundcolor = evencolor; year[index].textcontent = w * 12 * 4; refreshcolors(index); Vast majority else of { code week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor; month[index].oninput manually = () => { maintains invariant let m = parsefloat(month[index].textcontent); week[index].textcontent = m / 4; year[index].textcontent = m * 12; refreshcolors(index); document.getelementbyid('oddpicker').oninput = () => { oddcolor = document.getelementbyid('oddpicker').value; for (let index = 0; index!= week.length; ++index) { year[index].oninput = () => { if (index % 2 == 0) { let y = parsefloat(year[index].textcontent); week[index].style.backgroundcolor = evencolor; week[index].textcontent = y / (4 * 12); month[index].style.backgroundcolor = evencolor; month[index].textcontent = y / 12; year[index].style.backgroundcolor = evencolor; refreshcolors(index); else { week[index].style.backgroundcolor = oddcolor; month[index].style.backgroundcolor = oddcolor; year[index].style.backgroundcolor = oddcolor;
Manual Invariant Programming Invariants Algorithm Code
Invariant Synthesis Invariants Algorithm Code
Language Design Goals Programmer thinks about invariants once Compiler automatically handles invariants
Compiling Invariants Program Synthesis compiles invariants* Inputs: 1) program with holes e.g. x :=??(y, x) 2) precondition e.g. y = 15 3) requirement e.g. x = y
Compiling Invariants Program Synthesis compiles invariants* Inputs: expression 1) program using with holes x and e.g. y x :=??(y, x) 2) precondition e.g. y = 15 3) requirement e.g. x = y
Language Design Goals Programmer thinks about invariants once Compiler automatically handles invariants
Naive Algorithm Synthesize at the end of every function. Use invariants as preconditions, requirements.
Naive Algorithm function updateweeks(value, i) { weeks[i] = value; Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] weeks[i] = value; months[i] =??(value, i, weeks[i]); years[i] =??(value, i, weeks[i]); 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Naive Algorithm function updateweeks(value, i) { weeks[i] = value; Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] weeks[i] = value; months[i] = 4*weeks[i]; years[i] = 4*12*weeks[i]; 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Naive Algorithm function updateweeks(value, i) { weeks[i] = value; Does not scale to realistic programs Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] weeks[i] = value; months[i] =??(value, i, weeks[i]); years[i] =??(value, i, weeks[i]); 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Problem: Loops don t scale function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Pre 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; for (let i = 0; i < weeks.length; ++i) { months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Problem: Loops don t scale function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Timeout even for this simple example Pre 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; for (let i = 0; i < weeks.length; ++i) { months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Key insight: move hole inside loop function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Pre 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; for (let i = 0; i < weeks.length; ++i) { months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Key insight: move hole inside loop function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Simplification: No quantification!! function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Simplification: No quantification!! function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Simplification: No quantification!! function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] weeks[i] = weeks[i] * scale; months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Simplification: No quantification!! function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Targeted Synthesis! Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] weeks[i] = weeks[i] * scale; months[i] =??(scale, i, weeks[i]); years[i] =??(scale, i, weeks[i]); 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Simplification: No quantification!! function adjustforinflation(scale) { for (let i = 0; i < weeks.length; ++i) { weeks[i] = weeks[i] * scale; Pre Req 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] weeks[i] = weeks[i] * scale; months[i] = months[i] * scale; years[i] = years[i] * scale; 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i]
Spyder Separate invariant, imperative programs Compiler combines with targeted synthesis
Spyder Automatic Invariant maintenance Separate invariant, imperative programs Compiler combines with targeted synthesis
Imperative Language for (w: int) with idx in (weeks) { if (idx == i) { w = val;
Imperative Language for (w: int) with idx in (weeks) { if (idx == i) { w = val; Loops and Arrays
Imperative Language for (w: int) with idx in (weeks) { if (idx == i) { w = val; In-out iterators
Imperative AST
Invariant Language foreach (week, month) in (weeks, months) { week = 4 * month
Invariant Language foreach (week, month) in (weeks, months) { week = 4 * month Elementwise Quantification
Invariant AST
Compilation Algorithm
Language Design Goals Programmer thinks about invariants once Compiler automatically handles invariants
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
Format Invariants Code Explanatory Caption Problem/Result
Simple Example x > 2 * y y = y + 1;
Simple Example x > 2 * y y = y + 1; X ~ Y
Simple Example x > 2 * y y = y + 1; X ~ Y Y edited
Simple Example x > 2 * y y = y + 1; X ~ Y Y edited x =??(x, y);
Simple Example x > 2 * y y = y + 1; X, Y in scope x =??(x, y);
Simple Example x > 2 * y y = y + 1; x =??(x, y);
Simple Example x > 2 * y y = y + 1; x = x + 2;
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
Extending Loops foreach (w, m) in (weeks, months){ w = 4 * m for (w: int) in (weeks) { w = w * 1.05;
Extending Loops foreach (w, m) in (weeks, months){ w = 4 * m for (w: int) in (weeks) { w = w * 1.05; weeks ~ months
Extending Loops foreach (w, m) in (weeks, months){ w = 4 * m for (w: int) in (weeks) { w = w * 1.05; weeks ~ months need months
Extending Loops foreach (w, m) in (weeks, months){ w = 4 * m for (w: int) in (weeks) { w = w * 1.05; weeks ~ months need months
Extending Loops foreach (w, m) in (weeks, months){ w = 4 * m for (w: int, m: int) in (weeks, months){ w = w * 1.05; weeks ~ months need months
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
Simplifying Invariants foreach (w, m) in (weeks, months){ w = 4 * m for (w: int, m: int) in (weeks, months){ w = w * 1.05;
Simplifying Invariants foreach (w, m) in (weeks, months){ w = 4 * m for (w: int, m: int) in (weeks, months){ w = w * 1.05; Key insight: foreach body <=> for invariant
Simplifying Invariants foreach (w, m) in (weeks, months){ w = 4 * m for (w: int, m: int) in (weeks, months){ w = w * 1.05; Key insight: foreach body <=> for invariant m =??(m, w);
Simplifying Invariants foreach (w, m) in (weeks, months){ w = 4 * m for (w: int, m: int) in (weeks, months){ w = w * 1.05; Key insight: foreach body <=> for invariant m = m * 1.05;
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
Compilation Algorithm 1) bring necessary variables into scope 2) specialize invariants to loops 3)??? (find template) 4) profit (synthesize)
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] Need to synthesize loops, conditionals 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] Need to synthesize loops, conditionals 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
Synthesizing Loops foreach (color) in (bkgcolors) { color = bkg bkg = blue;
Synthesizing Loops foreach (color) in (bkgcolors) { color = bkg bkg = blue; bkg ~ bkgcolors bkg edited
Synthesizing Loops foreach (color) in (bkgcolors) { color = bkg bkg = blue; bkg ~ bkgcolors bkg edited for (color: int) in (bkgcolors){ color =??(bkg, blue);
Loops foreach (color) in (bkgcolors) { color = bkg That s the skeleton bkg = blue; What about the invariant? for (color: int) in (bkgcolors){ color =??(bkg, blue);
Synthesizing Loops foreach (color) in (bkgcolors) { color = bkg bkg = blue; for (color: int) in (bkgcolors){ color =??(bkg, blue);
Synthesizing Loops foreach (color) in (bkgcolors) { color = bkg bkg = blue; Use foreach spec for body for (color: int) in (bkgcolors){ color =??(bkg, blue);
Synthesizing Loops foreach (color) in (bkgcolors) { color = bkg bkg = blue; for (color: int) in (bkgcolors){ color =??(bkg, blue);
Synthesizing Loops foreach (color) in (bkgcolors) { color = bkg bkg = blue; for (color: int) in (bkgcolors){ color = blue;
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] Need to synthesize loops, conditionals 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Example Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] =years[i] Need to synthesize loops, conditionals 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc
Synthesizing Conditionals (idx % 2 = 0) ==> color = even even = red;
Synthesizing Conditionals (idx % 2 = 0) ==> color = even even = red; Implications as conditionals
Synthesizing Conditionals (idx % 2 = 0) ==> color = even even = red; Implications as conditionals if (idx % 2 == 0) { color =??(even, red, idx);
Synthesizing Conditionals (idx % 2 = 0) ==> color = even even = red; if (idx % 2 == 0) { color =??(even, red, idx);
Synthesizing Conditionals (idx % 2 = 0) ==> color = even even = red; if (idx % 2 == 0) { color = even;
Case studies* Game of Life (1d, 2d) Budgeting calculator Split expenses spreadsheet *
<latexit sha1_base64="tr8s+q96aeq/uprhjs8lwyt4d/o=">aaacr3icfva9swnbfnylx/h8orw0wq2cvbgtqrshagmzwxxa7gx7m5dkye7dsbuxeel+ny2tnx/bxkirszfjfterbxagew94sxmmncntuq9wbmv1bx0jv2lvbe/s7jn7b1uvp5jchcy8lvwqkoasgopmmkm9kubeykew9m4n81ofpgjx9kchcqscdclwzproizwdr78ds8i5zkwmrdwc3mab9pkwx0hhpopbrljgise0h33fnjmc/2cydjmgplnwi+4uejl4gsmgdowm8+k3ypokidtlrkmg5yy6gbgpgeuwtv1uqwkska40di2iabwmpj2m8alrwtjkmy/sekroo0zekduuodkurhfv4mwi/jvrplp9fyxylkqaijo71e451jgelipbtalvfggiozkzrjh2isrum+ptu4k3+ovluj0vem7ru78olg6yovlocj2gm+shs1rcd6imkoiij/sgptcn9wy9w1/w92w1z2weq/qloesh+vkwmw==</latexit> <latexit sha1_base64="tr8s+q96aeq/uprhjs8lwyt4d/o=">aaacr3icfva9swnbfnylx/h8orw0wq2cvbgtqrshagmzwxxa7gx7m5dkye7dsbuxeel+ny2tnx/bxkirszfjfterbxagew94sxmmncntuq9wbmv1bx0jv2lvbe/s7jn7b1uvp5jchcy8lvwqkoasgopmmkm9kubeykew9m4n81ofpgjx9kchcqscdclwzproizwdr78ds8i5zkwmrdwc3mab9pkwx0hhpopbrljgise0h33fnjmc/2cydjmgplnwi+4uejl4gsmgdowm8+k3ypokidtlrkmg5yy6gbgpgeuwtv1uqwkska40di2iabwmpj2m8alrwtjkmy/sekroo0zekduuodkurhfv4mwi/jvrplp9fyxylkqaijo71e451jgelipbtalvfggiozkzrjh2isrum+ptu4k3+ovluj0vem7ru78olg6yovlocj2gm+shs1rcd6imkoiij/sgptcn9wy9w1/w92w1z2weq/qloesh+vkwmw==</latexit> <latexit sha1_base64="tr8s+q96aeq/uprhjs8lwyt4d/o=">aaacr3icfva9swnbfnylx/h8orw0wq2cvbgtqrshagmzwxxa7gx7m5dkye7dsbuxeel+ny2tnx/bxkirszfjfterbxagew94sxmmncntuq9wbmv1bx0jv2lvbe/s7jn7b1uvp5jchcy8lvwqkoasgopmmkm9kubeykew9m4n81ofpgjx9kchcqscdclwzproizwdr78ds8i5zkwmrdwc3mab9pkwx0hhpopbrljgise0h33fnjmc/2cydjmgplnwi+4uejl4gsmgdowm8+k3ypokidtlrkmg5yy6gbgpgeuwtv1uqwkska40di2iabwmpj2m8alrwtjkmy/sekroo0zekduuodkurhfv4mwi/jvrplp9fyxylkqaijo71e451jgelipbtalvfggiozkzrjh2isrum+ptu4k3+ovluj0vem7ru78olg6yovlocj2gm+shs1rcd6imkoiij/sgptcn9wy9w1/w92w1z2weq/qloesh+vkwmw==</latexit> <latexit sha1_base64="tr8s+q96aeq/uprhjs8lwyt4d/o=">aaacr3icfva9swnbfnylx/h8orw0wq2cvbgtqrshagmzwxxa7gx7m5dkye7dsbuxeel+ny2tnx/bxkirszfjfterbxagew94sxmmncntuq9wbmv1bx0jv2lvbe/s7jn7b1uvp5jchcy8lvwqkoasgopmmkm9kubeykew9m4n81ofpgjx9kchcqscdclwzproizwdr78ds8i5zkwmrdwc3mab9pkwx0hhpopbrljgise0h33fnjmc/2cydjmgplnwi+4uejl4gsmgdowm8+k3ypokidtlrkmg5yy6gbgpgeuwtv1uqwkska40di2iabwmpj2m8alrwtjkmy/sekroo0zekduuodkurhfv4mwi/jvrplp9fyxylkqaijo71e451jgelipbtalvfggiozkzrjh2isrum+ptu4k3+ovluj0vem7ru78olg6yovlocj2gm+shs1rcd6imkoiij/sgptcn9wy9w1/w92w1z2weq/qloesh+vkwmw==</latexit> Game of Life Invariants 8i.model[i] =) view[i] =black 8i.!model[i] =) view[i] =white running () start enabled <latexit sha1_base64="xvg5tdsq10kirbnjgu7jdffp6pi=">aaacbhicbvc7tsmwfhxkq5rxglglryxevcuiccykfsyi0yfurjhj3lrwhseyhaqq6sdcr7awgbarh8hg3+c2gadlsjaozrnh9j1hxpnsjvntvdbwnza3qtu1nd29/qp78kir0lxs6ncup7ifegwccehopjn0mwkkctn0wvhnzo89gfqsffd6kogfkkfgmanegymw6zixgokh9lgcy6wj1f4agph8fngnp+nmgvejw5igkteo7c8vsmmegncue6ugrpnpvzb3msphwvnybrmhyzkegagcjkd8yr7efj8ajcjxks0rgs/v34mcjepnktbmjksp1li3e//zbrmor/yciszxiojiotjnwkd41giomasq+cqqqiuzf8v0rcsh2vrwmyw4yyuvku5503wa7t1fo3vd1lffdxsczpclllel3ai26ickhtezekvv1pp1yr1bh4vrilvmjtefwj8/6iyypw==</latexit> <latexit sha1_base64="xvg5tdsq10kirbnjgu7jdffp6pi=">aaacbhicbvc7tsmwfhxkq5rxglglryxevcuiccykfsyi0yfurjhj3lrwhseyhaqq6sdcr7awgbarh8hg3+c2gadlsjaozrnh9j1hxpnsjvntvdbwnza3qtu1nd29/qp78kir0lxs6ncup7ifegwccehopjn0mwkkctn0wvhnzo89gfqsffd6kogfkkfgmanegymw6zixgokh9lgcy6wj1f4agph8fngnp+nmgvejw5igkteo7c8vsmmegncue6ugrpnpvzb3msphwvnybrmhyzkegagcjkd8yr7efj8ajcjxks0rgs/v34mcjepnktbmjksp1li3e//zbrmor/yciszxiojiotjnwkd41giomasq+cqqqiuzf8v0rcsh2vrwmyw4yyuvku5503wa7t1fo3vd1lffdxsczpclllel3ai26ickhtezekvv1pp1yr1bh4vrilvmjtefwj8/6iyypw==</latexit> <latexit sha1_base64="xvg5tdsq10kirbnjgu7jdffp6pi=">aaacbhicbvc7tsmwfhxkq5rxglglryxevcuiccykfsyi0yfurjhj3lrwhseyhaqq6sdcr7awgbarh8hg3+c2gadlsjaozrnh9j1hxpnsjvntvdbwnza3qtu1nd29/qp78kir0lxs6ncup7ifegwccehopjn0mwkkctn0wvhnzo89gfqsffd6kogfkkfgmanegymw6zixgokh9lgcy6wj1f4agph8fngnp+nmgvejw5igkteo7c8vsmmegncue6ugrpnpvzb3msphwvnybrmhyzkegagcjkd8yr7efj8ajcjxks0rgs/v34mcjepnktbmjksp1li3e//zbrmor/yciszxiojiotjnwkd41giomasq+cqqqiuzf8v0rcsh2vrwmyw4yyuvku5503wa7t1fo3vd1lffdxsczpclllel3ai26ickhtezekvv1pp1yr1bh4vrilvmjtefwj8/6iyypw==</latexit> <latexit sha1_base64="xvg5tdsq10kirbnjgu7jdffp6pi=">aaacbhicbvc7tsmwfhxkq5rxglglryxevcuiccykfsyi0yfurjhj3lrwhseyhaqq6sdcr7awgbarh8hg3+c2gadlsjaozrnh9j1hxpnsjvntvdbwnza3qtu1nd29/qp78kir0lxs6ncup7ifegwccehopjn0mwkkctn0wvhnzo89gfqsffd6kogfkkfgmanegymw6zixgokh9lgcy6wj1f4agph8fngnp+nmgvejw5igkteo7c8vsmmegncue6ugrpnpvzb3msphwvnybrmhyzkegagcjkd8yr7efj8ajcjxks0rgs/v34mcjepnktbmjksp1li3e//zbrmor/yciszxiojiotjnwkd41giomasq+cqqqiuzf8v0rcsh2vrwmyw4yyuvku5503wa7t1fo3vd1lffdxsczpclllel3ai26ickhtezekvv1pp1yr1bh4vrilvmjtefwj8/6iyypw==</latexit> Code State transition Interactive display Start/Stop toggle * By Kieff - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=101736
<latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="4zi68pjubg9qod0oec37qfpgx9m=">aaacg3icbvc7tsmwfhxkq5rxgzhfokjiqpikczaichbgitgh1esv4960vu0ksh1qffu/wpgvfgyqykji4g9w0g7qcqajc+61zz1+zjnstv1tfvzw19y3ipulre2d3b3y/kfbrymk0kirj2txjwo4c6glmebqjsuq4xpo+oprzo/cg1qscu/0jazpkghiakajnlk/xhodsblomcnv/aawvj3m4cs6trhlhekacgdrqdo1jn1o6lhfrthvowdejs6cvnaczx750x1enbeqasqjuj3hjrwxeqkz5tatuymc2dxmhtazncqcljfmt03xivegjolmy+bc/b2reqhurphmuha9uotejv7n9ridxhgpc+neq0hnhwujxzrcwvf4wcrqzsegecqzyyrpiehctamzzepwfk9eju1a1bgrzu1zpxe1r6oijtaxokuookcndioaqiuoektp6bw9wu/wi/vufcxgc9z85xd9gfx1a/tqn34=</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="l1v+nvwnndd8x8c8v2qztoniuwe=">aaachhicbvdlssnafj3uv62vqes3g0vwfziq6eyounfzwt4gcwuymbrdzzjhziku0g9x46+4cagigxecf+m0zujbd1w4nhpvzl0nyhhv2nw/rcrk6tr6rnwztrw9s7tn7x90lmgljm0smjc9ccncaerammpgepkkieemdkprzczvphcpqejv9tgjiuedlcyui22kvn0wjeiixicfjqmaixg24bx0yec5wyaogi0gpg2njuk4elbv113hlqcxivesoijr6tufqsxwzkmqmunk+z6b6xccpkaykwktybxjeb6hafentrenkpwux03hivfialy0lwpyql8njogrnear6erid9winxp/8/xcj5fhhkzzrkmk5x8loynawflsmkasym3ghiasqdkv4igscgutz82e4c2evew6dcdzhe/uvn68luooginwde6bby5ae9ycfmgddb7bm3gfb9at9wk9wx/z1opvzhycp7c+fgcxfp84</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="c5tq+pzsrkxuddn5byednlyolcm=">aaachxicbvbnswmxem3wr1q/vj16crbbu9ktbb0irs8ek9hw6c4lm07b0cs7jnlckf0jxvwrxjwo4sgl+g9mt3vq1gcdj/dmkpkxjzxp43nftmftfwnzq7hd2tnd2z9wd49aok4vhsaneaweiqkbmwlnwwyhh0qberghdjs6mfvtmsjnynlvjgmeggwk6znkjjw6bi3ox4pwjhmu2ape3mnvfiu9hdbhfwcno9ggw0krwrhk9mlxlxsvlwnejx5oyihho+t+br2ypgkkozxo3fg9xirtogyjhgalinwqedoia+hykokahu6z62b4zco9bne0jq3o1n8tuyk0nojidgpihnrzm4v/ez3u9c/dkznjakdsxuf9lgmt43luumcuummnlhcqmn0v0yfrhbobammg4c+fvepa1yrvvfy7wrl+ncdrrcfofj0jh12gorpfddrefd2iz/sk3pwn58v5dz4wrqunnzlgf+b8/qcamp+4</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> <latexit sha1_base64="p4jtto0v5ou49ox5jwon3hnwr44=">aaacghicbvdlssnafj3uv62vqks3g0vwfrmrdkfqdooygn1agspkctmonuzczeqpoz/hxl9x40irt935n07tlrr6vodz7uwee4kum6ud58sqls2vrk6v1ysbm1vbo9xdvzzkmkmhsroeye5afhamokmz5tbjjza44naohjdtv/0aurfe3otrcn5m+ojfjbjtpf71pbslkncogbbxi8bqeczhl9jbxrabakbwlag9fa+whlbxrtm2uwd/je6c1nacjv510g0tmsugnovekc91uu3nrgpgoywr3uxbsuiq9mezvjaylj8xj43xkvfce0awixch/tzisazuka7mzez0qc16u/e/z8t0dohntkszbkfnh6kmy53gaus4zbko5indcjxmzmv0qcsh2nrzmsw4iy//ja1t23vs9+6svr+e11fgb+gqhsmxnam6ukun1equpaex9iberwfr1fqwpmejjwu+s49+wzp8a9ehnl8=</latexit> Budgeting Invariants 8i.4 weeks[i] =months[i] 8i.12 months[i] = years[i] 8i.weeks[i] < 0 =) font[i] =red 8i.weeks[i] >= 0 =) font[i] =black 8i.i 8i.i mod 2 = 0 =) bkg[i] =evenc mod 2 = 1 =) bkg[i] =oddc Code Interactive cells Inflation Backgrounds *
<latexit sha1_base64="ytonubwk7z5fmdpm5iu7okouxp8=">aaacnnicfvhbssqwee3rfb2t+ujl4cki4tkkoa8qxkbeervcxdiwju1nnzi0jumfzfgz/bhf/bvtbr+8d4qczs5hzsxemedaen67446mjo1pte7vpmdm5+brc4t3os0vwxzlraraeduoeiitw43adqaqykjgffr0uttvn1fpnia3pp9hkoldwnucuwnt3fpr0esvfqj4e7zghsspozyefzby/bvqt/mcbehtezpgyfs0kr/5p28ppai4taohhqhpuh0jyp7+0bzs/yfsghfrda/pdqn+ar8cdvlfdbf+fsqpyyumhgmqdcf3mhmoqdkccxypbbngzhqhd9ixmkesdtgynn2bvzujwtq0lzgllc+kazva92vkmzkar/29vir/q3vy09snbzzjcomjkxv1cgemhejwehofzii+bzqpbr0ce6skmmmvwrnl8l+p/bpcbtv9r+nfbdcoj6t1tjjlsklwie92yce5i9ekrziz7bw5586fc+6pe+lelvtxqtrl5eu47q8o6sxy</latexit> <latexit sha1_base64="ytonubwk7z5fmdpm5iu7okouxp8=">aaacnnicfvhbssqwee3rfb2t+ujl4cki4tkkoa8qxkbeervcxdiwju1nnzi0jumfzfgz/bhf/bvtbr+8d4qczs5hzsxemedaen67446mjo1pte7vpmdm5+brc4t3os0vwxzlraraeduoeiitw43adqaqykjgffr0uttvn1fpnia3pp9hkoldwnucuwnt3fpr0esvfqj4e7zghsspozyefzby/bvqt/mcbehtezpgyfs0kr/5p28ppai4taohhqhpuh0jyp7+0bzs/yfsghfrda/pdqn+ar8cdvlfdbf+fsqpyyumhgmqdcf3mhmoqdkccxypbbngzhqhd9ixmkesdtgynn2bvzujwtq0lzgllc+kazva92vkmzkar/29vir/q3vy09snbzzjcomjkxv1cgemhejwehofzii+bzqpbr0ce6skmmmvwrnl8l+p/bpcbtv9r+nfbdcoj6t1tjjlsklwie92yce5i9ekrziz7bw5586fc+6pe+lelvtxqtrl5eu47q8o6sxy</latexit> <latexit sha1_base64="ytonubwk7z5fmdpm5iu7okouxp8=">aaacnnicfvhbssqwee3rfb2t+ujl4cki4tkkoa8qxkbeervcxdiwju1nnzi0jumfzfgz/bhf/bvtbr+8d4qczs5hzsxemedaen67446mjo1pte7vpmdm5+brc4t3os0vwxzlraraeduoeiitw43adqaqykjgffr0uttvn1fpnia3pp9hkoldwnucuwnt3fpr0esvfqj4e7zghsspozyefzby/bvqt/mcbehtezpgyfs0kr/5p28ppai4taohhqhpuh0jyp7+0bzs/yfsghfrda/pdqn+ar8cdvlfdbf+fsqpyyumhgmqdcf3mhmoqdkccxypbbngzhqhd9ixmkesdtgynn2bvzujwtq0lzgllc+kazva92vkmzkar/29vir/q3vy09snbzzjcomjkxv1cgemhejwehofzii+bzqpbr0ce6skmmmvwrnl8l+p/bpcbtv9r+nfbdcoj6t1tjjlsklwie92yce5i9ekrziz7bw5586fc+6pe+lelvtxqtrl5eu47q8o6sxy</latexit> <latexit sha1_base64="ytonubwk7z5fmdpm5iu7okouxp8=">aaacnnicfvhbssqwee3rfb2t+ujl4cki4tkkoa8qxkbeervcxdiwju1nnzi0jumfzfgz/bhf/bvtbr+8d4qczs5hzsxemedaen67446mjo1pte7vpmdm5+brc4t3os0vwxzlraraeduoeiitw43adqaqykjgffr0uttvn1fpnia3pp9hkoldwnucuwnt3fpr0esvfqj4e7zghsspozyefzby/bvqt/mcbehtezpgyfs0kr/5p28ppai4taohhqhpuh0jyp7+0bzs/yfsghfrda/pdqn+ar8cdvlfdbf+fsqpyyumhgmqdcf3mhmoqdkccxypbbngzhqhd9ixmkesdtgynn2bvzujwtq0lzgllc+kazva92vkmzkar/29vir/q3vy09snbzzjcomjkxv1cgemhejwehofzii+bzqpbr0ce6skmmmvwrnl8l+p/bpcbtv9r+nfbdcoj6t1tjjlsklwie92yce5i9ekrziz7bw5586fc+6pe+lelvtxqtrl5eu47q8o6sxy</latexit> Split expenses Invariants 8i.2 mid[i] =me[i]+you[i] 8i.debt[i] =mid[i] you[i] 8i.debt[i] < 0 =) color[i] =black 8i.debt[i] >= 0 =) color[i] =red Code Interactive cells Backgrounds *
Outline Data invariant calculus Extensions Invariants for Security GUI invariants
Outline Data invariant calculus Extensions Invariants for Security GUI invariants
Formalisms
Formalisms
Formalisms Interesting Translation Rule
Formalisms What we need Formal problem definition Full translation semantics Proof of correctness
Formal Correctness Problem: Correctness:
Formal Correctness Problem: Given a program with arrays and invariants Correctness:
Formal Correctness Problem: Given a program with arrays and invariants Correctness: We find a program with augmented semantics
Formal Correctness Problem: Given a program with arrays and invariants Thank you, Reviewer A!!! Correctness: We find a program with augmented semantics
<latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> Stronger Invariants 8i, j. i < j =) sorted[i] <sorted[j] Consider Sortedness
<latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> Stronger Invariants 8i, j. i < j =) sorted[i] <sorted[j]
<latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> Stronger Invariants 8i, j. i < j =) sorted[i] <sorted[j] Limited to maplike properties
<latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> Stronger Invariants 8i, j. i < j =) sorted[i] <sorted[j] Cannot express :(
<latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> Stronger Invariants 8i, j. i < j =) sorted[i] <sorted[j] Key insight: change of perspective!! Cannot express :(
<latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> <latexit sha1_base64="w/rt8x1midbnkxmdveacwkmailc=">aaachnicbvbns8naen3ur1q/oh69lbbbg5refd14khrxwmf+qbrkzjntt91swu5gkkx9i178k148kcj40n/jts1bwx8mpn6bywzekhcmton8w7ml5zxvtfx6ywnza3vh3t2rqtivfko05rfsbeqbzwkqmmkojuqciqio9ab/m/hrdyavi8w9hitgr6qjwjtroo3uss+b7vgszje7wb0sho8xw1e4h5ssmutbyrvldahhfcnnvoe37kjtcqbai8tnsbflqltsz2yy0zqcosknsnmuk2h/skrmlmoo0ewvjit2sqc8qwwjqpnd6xsjfgsuejs7tqmnp+rvisgjlbpegemmio6qew8i/ud5qw5f+kmmklsdolnf7zrjhenjvjhkeqjma0milczcimmxsek1sbrgqndnx14ktdos65tcu7ni+tqli48o0ce6ri66qgv0iyqoiih6rm/ofb1zt9al9w59zfpzvjazj/7a+vobsv+haq==</latexit> Stronger Invariants 8i, j. i < j =) sorted[i] <sorted[j]
<latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> 8i, j. i < j =) sorted[i] <sorted[i + 1] 8i. sorted[i] <sorted[i + 1]
<latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qq0fpwg5lceds6ddut6clsgrw9k=">aaacdnicbzbps8mwgmbt+w/of1wpxojjiailfuephozepe5wm9cvkabpfpymjumfubyv4mwv4swdil49e/pbmg1fdpobwi/nfv/yvk+ymqq0635zpaxlldw18nply3nre8fe3wspkulmmlgwie9cpaijndq11yzcpzkgjgskhq6ujvx2pzgkcn6rhykjettjnkyyawn17vonfhixbqkdx2oohnqk8mkal3742au6dtv13kngingfveghrtf+7eqczwnhgjoklo+5qq5yjdxfjiwqnuyrfoeb6hhfiecjuue+pwcea8ajonnlpk7h1p09kaneqwesms4e6b6ar03m/2p+pupzikc8ztthepzrndgobzxkaymqcdzsaabhsc2ueperrfibbcsmbg/+5evontie63g3p9x6zrfhgryaq3aephag6uaaneatypaansaleluerwfrzxqftzasymyf/jh18q2v5zso</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> <latexit sha1_base64="qzfx2szoil8eexwtgl/a7rtix+o=">aaacinicbvdjsgnbeo2jw4zbqecvjueqlgfgbbu8bl14jgawmblct6esdnkz0n0jhch5fs/+ihcpinos/bg7i6cjdwoe71vrvs9iojpktj+n3mli0vjkfrwwtr6xuwvu71rlnaokfrrzwnqdiogzccqkkq71raajaw61ohc98mv3icslozvvt8apsttiluaj0lldvpbassccy3bctfbwibm+xf3ssvbvb4k9d8tykgi6znfodz9y/izztc17ddxpnckpoinkdfpda8y0dsfslbmpxcdolj8rorjlmch4qyse0b5pg6tprekqfjz+cyaptnle+lzdkcjj9fderkip+2ggo0oionlwg4n/ew6qwud+xqikvrdryajwyrgk8sgv3gqcqoj9tqgvtn+kayciqpvotabdcgzfnifve8uxlef2tfi6msarr3tohx0ib52herpbzvrbfd2gj/scxo1h49l4mz4mrtljorol/sd4+gy4nqi8</latexit> 8i, j. i < j =) Hard sorted[i] <sorted[i + 1] Easy 8i. sorted[i] <sorted[i + 1]
<latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> Hard 8i, j. P (i, j) Easy 8i.P (i, i + 1)
<latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="9j1rtaqqu6p8b0ow3gywf5fy8kq=">aaacahicbvbns8naej34wetx1imhl4tfqfbcioiei148vraf0iay2w7abtebslsrsmkp/huvhhtx6s/w5r9x2+agrq8ghu/nmdmvsdht2nw/rzxvtfwnzdxwfntnd2/fpjisqtivhfzjzgpzclcinala1uxz2kgkxvhaat0y3e79+iovisxiqq8t6ke4k1jicnzgatvhrtcwmhpesn0htsaoumql1d9v2wxxcwday8tlsaeyvnr2v6stkzsiqhoolwp6bql9ezaaeu7h+vaqailjahdp01cbi6r80eybmtozsgezs0wjjwbq74krjpqarohpjlduquvvkv7nnvmdxvsjjpjuu0hmi8kuix2jarqowyqlmg8nwuqycysipswx0sazvanbw3x5mdquhm91vpvlqvkmiymhj3akrfdgcspwbxwoaoexpmmrvflp1ov1bn3mw1esboyi/sd6/aecs5s2</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> <latexit sha1_base64="/u9z2c+nkvumm7lkdb869+4hdso=">aaab/xicbvdlssnafl2pr1pf8bfzm1ieihisexrzdooygn1ag8pkommhtizhziluupwvny4ucet/upnvnlzzaoubgcm593lpncdhtgnx/byks8srq2vf9dlg5tb2jr2711bxkgmtk5jhshvgrtkttk6z5rsvsiqjgnnmmlyz+m0hkhwlxb0ejdspcf+wkbgsjds1dzphldhnidmovmfnij16j1277drufgiredkpq45a1/7q9gksrlrowrfsbc9ntj9hqrnhdfzqpiommaxxn7ynftiiys+m6cfo2cg9zgkyjzsaqr83mhwpnyocmxlhpvdz3kt8z2unorzymyasvfnbzofclcmdo0kvqmckjzqpdmfempmvkqgwmghtwmmu4m1/eze0zh3pdby7i3l1oq+jcidwbbxw4bkqcas1qaobr3igv3iznqwx6936mi0wrhxnh/7a+vwbc4stqq==</latexit> Hard 8i, j. P (i, j) Thanks Nadia!! Easy 8i.P (i, i + 1)
Synthesizing Insert adjacent (lo, hi) in (sorted) { lo < hi
Synthesizing Insert adjacent (lo, hi) in (sorted) { lo < hi sorted = sorted + newelem
Synthesizing Insert adjacent (lo, hi) in (sorted) { lo < hi sorted = sorted + newelem sorted = foldl adder ([], false) sorted adder (es, d) next =...
Synthesizing Insert adjacent (lo, hi) in (sorted) { lo < hi sorted = sorted + newelem But in imperative language sorted = foldl adder ([], false) sorted adder (es, d) next =...
Implications Not clear need to adjust at least 1) loop translation 2) synthesis Formal correctness would help!!
Outline Data invariant calculus Extensions Invariants for Security GUI invariants
Outline Data invariant calculus Extensions Invariants for Security GUI invariants
Security is really hard
Hot off the presses!! September 28
Manual Security Invariants Invariant: All urls are in the urlset
Manual Security Invariants Invariant: All urls are in the urlset All connections use the urlset
Manual Security Invariants Invariant: All urls are in the urlset All connections use the urlset