Synthesis with the Sketch System Day 3 Over the last few days, we have seen several different applications of synthesis for what could collectively be called Quality Control Armando Solar-Lezama
In place list reversal
Problem statement Given a list like this: Produce a list like this: head . . . head . . .
Constraints Your algorithm must be O(n) Your algorithm must use a constant space It can not use arrays or recursion
The Spec harness void main(int n){ if(n >= MAXN){ n = MAXN-1; } node[n] nodes = null; list l = newList(); popList(n, l, nodes); reverseSK(l); check(n, l, nodes); }
The Spec void popList(int n, list l, ref node[n] nodes){ node tail= null; for(int i=0; i<n;++i){ node t = newNode(); if(i>0){ tail.next = t; }else{ l.head = t; } tail = t; nodes[i] = t;
The Spec void check(int n, list l, node[n] nodes){ node cur = l.head; int i=0; while(cur != null){ assert cur == nodes[n-1-i]; cur = cur.next; i = i+1; } assert i == n; if(n > 0){ assert l.head == nodes[n-1]; }else{ assert l.head == null;
The Sketch {| (tmp1 | tmp2 | l.head)(.next)? |} void reverseSK(ref list l){ node tmp1 = null; node tmp2 = null; while( ){ } {| (tmp1 | tmp2 | l.head)(.next)? |}