Mechanized proof assistants are powerful verification
tools, but proof development can be difficult and
time-consuming. When verifying a family of related programs, the
effort can be reduced by proof reuse. In this paper, we show how to
engineer product lines with theorems and proofs built from feature
modules. Each module contains proof fragments which are composed
together to build a complete proof of correctness for each
product. We consider a product line of programming languages, where
each variant includes metatheory proofs verifying the correctness of
its semantic definitions. This approach has been realized in the Coq
proof assistant, with the proofs of each feature independently
certifiable by Coq. These proofs are composed for each language
variant, with Coq mechanically verifying that the composite proofs
are correct. As validation, we formalize a core calculus for Java in
Coq which can be extended with any combination of casts, interfaces,
or generics.