Estou aqui começando a dar os primeiros passos em Prolog. Depois de estudar no período passado da faculdade sobre esta linguagem, comecei a botar a mão na massa com ela visando futuros projetos (iniciação científica, mestrado, etc...)
Antes de falar sobre o código em si, gostaria de debitar todos os créditos ao blog do Silveira, onde consegui localizar esse conteúdo para iniciar meus estudos.
O código que irei reproduzir aqui é o que está disponibilizado no link acima, porém, seguirá logo abaixo uma explicação passo a passo minha sobre o mesmo.
- fatorial.pl
fatorial(N,F) :-
N1 is N - 1,
fatorial(N1,F1),
F is N * F1.
Vamos lá! Antes de começar aconselho que leiam alguns artigos afins:
Só relembrando um pouco de matemática, para se calcular o fatorial de um número, multiplica-se ele por todos os seus números antecessores, até que se chegue a 0 (o qual possui por definição fatorial 1: 0! = 1). Ou seja, o fatorial de um número (com exceção do zero) vai ser SEMPRE ele mesmo multiplicado pelo fatorial do seu antecessor.
Exemplos:
3! = 3 * 2 * 1 = 6
4! = 4 * 3 * 2 * 1 = 24
ou
4 * 3! = 4 * 6 = 24
Entendida esta parte, vamos ao código. Se você, leitor, programa em alguma linguagem estruturada ou OO deve estar estranhando a forma de escrita do Prolog, certo?
Caso tenha lido os links que disponibilizei acima, a coisa fica um pouco mais clara...
Na primeira linha definimos uma função que retornará um resultado verdadeiro, nesta linha esta sendo definida que o fatorial de 0 sempre será 1. Para o fatorial de outros números existe a função fatorial aberta a retornar um valor (o parâmetro F).
Esta função é recursiva, ou seja, quando informar algo como fatorial(3,X). o compilador fará o seguinte:
Fatorial de 3 é quanto?
Não existe definição para isto.
Deixa a função fatorial(3,X) em aberto, aguardando resposta, em uma pilha de processamento.
Fatorial de 2 é quanto?
Não existe definição para isto.
Deixa a função fatorial(2,X) em aberto, aguardando resposta, em uma pilha de processamento.
Fatorial de 1 é quanto?
Não existe definição para isto.
Deixa a função fatorial(1,X) em aberto, aguardando resposta, em uma pilha de processamento.
Fatorial de 0 é quanto?
Opa, tem uma definição lá de que 0! = 1.
Como nossa intenção é solucionar o fatorial de 3 e armazená-lo na variável X, devemos percorrer toda a pilha de execução até o final. Já que temos o fatorial de 0 sendo igual a 1, vamos ao próximo item da pilha.
Fatorial de 1 é quanto?
1 * fatorial de 0, ou seja, 1 * 1 = 1
Fatorial de 2 é quanto?
2 * fatorial de 1, ou seja, 2 * 1 = 2
Fatorial de 3 é quanto?
3 * fatorial de 2, ou seja, 3 * 2 = 6.
Pronto! Está aí a forma de funcionamento do código deste post.
Para completar, abra o SWI-Prolog e digite o seguinte comando:
['d:/appProlog/fatorial.pl']. (indique o caminho físico do arquivo com a "/" mesmo)
Este comando carregará o conteúdo do arquivo e nos permitirá usar a função fatorial.
Existem duas formas de usá-la:
1 - Digitar o comando:
fatorial(0,1).
Retornará o valor "Yes", confirmando que existe no código esta definição.
2 - Executar a função em busca do fatorial de um número:
Sinta-se à vontade para trabalhar com esta função, varie números e variáveis de retorno (o "X" não é obrigatório)
Exemplo: fatorial(12,FAT).
Espero poder ter passado de forma útil um pouco do conhecimento que adquiri sobre Prolog... até a próxima e...
[]'s do MX...
2 comentários:
Blog ne nerd hem mal caráter!!!
Beijos!
FafaH
www.inconstantemente.wordpress.com
te linkei!
Cara, muito obrigado. Estava com muitas dúvidas quanto ao uso da recursividade. Ajudou muito! Valeu
Postar um comentário