  We propose a technique for synthesizing bidirectional programs from the
corresponding unidirectional code plus a few input/output examples. The core
ideas are: (1) constructing a sketch using the given unidirectional program as
a specification, and (2) filling the sketch in a modular fashion by exploiting
the properties of bidirectional programs. These ideas are enabled by our choice
of programming language, HOBiT, which is specifically designed to maintain the
unidirectional program structure in bidirectional programming, and keep the
parts that control bidirectional behavior modular. To evaluate our approach, we
implemented it in a tool called Synbit and used it to generate bidirectional
programs for intricate microbenchmarks, as well as for a few larger, more
realistic problems. We also compared Synbit to a state-of-the-art
unidirectional synthesis tool on the task of synthesizing backward
computations.
