Learning frameworks for program synthesis