quarta-feira, 9 de janeiro de 2008

Minha primeira aplicaçãozinha Prolog

Boa noite meu povo!
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(0,1).

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:

Anônimo disse...

Blog ne nerd hem mal caráter!!!

Beijos!

FafaH

www.inconstantemente.wordpress.com

te linkei!

Anônimo disse...

Cara, muito obrigado. Estava com muitas dúvidas quanto ao uso da recursividade. Ajudou muito! Valeu