A Prolog-oriented extension of Java programming based on generics and annotations