We present a new approach to automated reasoning about higher-order
programs by extending symbolic execution to use behavioral contracts
as symbolic values, thus enabling symbolic approximation of
higher-order behavior.

Our approach is based on the idea of an abstract reduction semantics
that gives an operational semantics to programs with both concrete
and symbolic components. Symbolic components are approximated by
their contract and our semantics gives an operational interpretation
of contracts-as-values. The result is an executable semantics that
soundly predicts program behavior, including contract failures, for
all possible instantiations of symbolic components. We show that our
approach scales to an expressive language of contracts including
arbitrary programs embedded as predicates, dependent function
contracts, and recursive contracts. Supporting this rich language of
specifications leads to powerful symbolic reasoning using existing
program constructs.

We then apply our approach to produce a verifier for contract
correctness of components, including a sound and computable
approximation to our semantics that facilitates fully automated
contract verification. Our implementation is capable of verifying
contracts expressed in existing programs, and of justifying
contract-elimination optimizations.