“…The first class involves search techniques that explicitly try to build a syntactic representation of each program in the search spaceabstract syntax trees (ASTs) are common as a representation. These techniques achieve efficiency by ruling out large sets of possible programs without exploring them one-by-one, usually by discovering that particular sub-structures can never be part of a correct solution [3,28,52,57,75]. The second class involves symbolic search techniques, where the entire program space is represented symbolically, either using a special purpose representation [32,58], or, in the case of constraint-based synthesis, by reducing it to a set of constraints whose solution can be mapped to a concrete program, which can be solved using a SAT or SMT solver [33,72,74], or in some cases a numerical optimization procedure [17].…”