Mode Based Type Inference for Prolog Programs