The CIFF Proof Procedure for Abductive Logic Programming with Constraints: Theory, Implementation and Experiments