Prolog Programming In Depth