Synthesizing software verifiers from proof rules