Fundamentos da programação lógica e funcional. O princípio de resolução e a teoria de reescrita