Cantando em Prolog

Se tem uma raça de programador pior do que o bobo-alegre eu não conheço. Mas eu confesso: sou uma programadora boba-alegre.

Mas o que isso quer dizer?

Duas características principais de um programador bobo-alegre:

1. Bater palminhas quando chegam ao resultado esperado.

Sim, eu faço isso, por mais ridículo que seja, eu faço. Mas não é de maldade. Programar é como brincar de Lego, você junta as bibliotecas, procura uma função que faça o que você precisa, faz um esquema (algoritmo) e pronto! Se tudo correr bem (o que nem sempre acontece), você consegue fazer o seu código rodar.

Para quem é técnico em eletrônica (como eu), já deve ter passado pela emoção de fazer um pisca-pisca. Ver aqueles dois leds piscando é a maior emoção do mundo! Compilar um código sem erros então? Dá vontade de chorar de amoção.. =)

O legal está no fato de você saber que realmente aprendeu algo, isso não tem preço. É por isso que eu comemoro.

2. Conversar com o código.

Euzinha bato altos papos com as linhas, variáveis. São praticamente minhas amigas. Quanto mais eu vou programando, mais amigos eu faço.

Tudo bem que tem certas horas que um ou outro resolve encrencar comigo e esconder o jogo, mas nada que um jeitinho não resolva.

Explicado? Às vezes nem eu mesma entendo. Só sei que gosto de programação e é isso que me faz feliz no trabalho.

Tá, mas o que tudo isso tem a ver com o título desse post?

Simples. Nas aulas de Inteligência Artificial, estamos estudando Prolog. Um paradigma, digamos, ímpar. A tarefa desta semana era fazer um código que “cantasse” a música do elefante (sabe, aquela que incomoda a gente?).

Desafio extra, já que eu perdi muitas aulas e nem um simples if-then-else eu sabia fazer. Mas desafio é desafio e é isso que me anima.

Depois de alguns minutos e da super ajuda do Pai dos Internautas e Programadores Aflitos Google, eis que surge o código abaixo:

cante(Y):-cante(1,Y).
cante(X,Y):-X=<Y,
	(Z is X mod 2,
	(Z=1 -> impar(X); par(X)),
	 X1 is X+1, 
	 cante(X1,Y)).

impar(X):-write(X), (X is 1 -> write(' elefante incomoda muita gente\n');
				write(' elefantes incomodam muita gente\n')).

par(X):-write(X), write(' elefantes'), not(incomoda(X)), write(' muito mais\n').

incomoda(Y):-incomoda(1,Y).
incomoda(X,Y):-X=<Y,
	(write(' incomodam'),
	X1 is X+1,
	incomoda(X1,Y)).

O código é simples, usa recursividade para a contagem dos elefantes e outro laço recursivo para a impressão dos “incômodos”.
Para executar o código, basta chamar a função cante() passando como argumento a quantidade de “elefantes” desejada.

That’s it!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s