  Relational properties arise in many settings: relating two versions of a
program that use different data representations, noninterference properties for
security, etc. The main ingredient of relational verification, relating aligned
pairs of intermediate steps, has been used in numerous guises, but existing
relational program logics are narrow in scope. This paper introduces a logic
based on novel syntax that weaves together product programs to express
alignment of control flow points at which relational formulas are asserted.
Correctness judgments feature hypotheses with relational specifications,
discharged by a rule for the linking of procedure implementations. The logic
supports reasoning about program-pairs containing both similar and dissimilar
control and data structures. Reasoning about dynamically allocated objects is
supported by a frame rule based on frame conditions amenable to SMT provers. We
prove soundness and sketch how the logic can be used for data abstraction, loop
optimizations, and secure information flow.
