  Hoare logic provides a syntax-oriented method to reason about program
correctness and has been proven effective in the verification of classical and
probabilistic programs. Existing proposals for quantum Hoare logic either lack
completeness or support only quantum variables, thus limiting their capability
in practical use. In this paper, we propose a quantum Hoare logic for a simple
while language which involves both classical and quantum variables. Its
soundness and relative completeness are proven for both partial and total
correctness of quantum programs written in the language. Remarkably, with novel
definitions of classical-quantum states and corresponding assertions, the logic
system is quite simple and similar to the traditional Hoare logic for classical
programs. Furthermore, to simplify reasoning in real applications, auxiliary
proof rules are provided which support standard logical operation in the
classical part of assertions, and of super-operator application in the quantum
part. Finally, a series of practical quantum algorithms, in particular the
whole algorithm of Shor's factorisation, are formally verified to show the
effectiveness of the logic.
