jueves, 21 de octubre de 2010

PROLOG - Programas Aritméticos

Laboratorio de Lenguajes de Programación - Semana 7

Ya vimos como utilizar Prolog para resolver problemas lógicos, esta vez tengo un 2 ejemplos aritméticos.

IDENTIFICAR NUMEROS POSITIVOS Y NEGATIVOS

Para saber si un número es positivo o negativo necesitamos saber como deseamos ver el resultado final, en este caso yo utilizaré un hecho con 2 argumentos:

numero(X, Y).

donde: X sera el número el cual yo deseo saber si es positivo, negativo o nulo; y Y me mostrará el resultado.

Ahora, por simple razonamiento: un número positivo es aquel mayor a 0, los negativos son menores a 0 y el 0 es el único nulo. Entonces:

X > 0: POSITIVO
X < 0: NEGATIVO
X == 0: NULO

Con este razonamiento podemos proceder a realizar el programa, abrimos un archivo en emacs (emacs -nw numeros.pro), procedemos a teclear la siguientes reglas:

numero(X,Y) :- X > 0 , Y = 'POSITIVO'.
numero(X,Y) :- X < 0 , Y = 'NEGATIVO'.
numero(X,Y) :- X == 0, Y = 'NULO'.


Lo guardamos en alguna ubicación donde nos sea facil ubicarlo.

Ahora, abrimos SWI-PROLOG en una terminal, ahi tecleamos prolog.
Una vez en el interprete compilamos el código con el comando consult('ubicacion_del_archivo')., aqui una captura de los 2 anteriores pasos:


Ahora comprobemos que el programa funciona correctamente, con los siguientes cuestionamientos:

numero(1,X).
numero(5,X).
numero(-2,X).
numero(-120,X).
numero(0,X).

RESULTADO:



El programa funciona correctamente.

POTENCIA EN PROLOG

Otro clásico de la programación, este ejemplo lo tome para que vean como Prolog es compatible con la recursividad.

Para empezar, utilizaremos un hecho con 3 argumentos:

potencia(X, Y, Z)

donde: X es la base, Y es el exponente, Z es el resultado.

Al momento de calcular una potencia tenemos 2 posibles casos que nunca cambian:

0 ^ 0 = no se puede calcular.
n ^ 0 = 1 ; siempre sera uno.

La potencia recursiva se calcula en base a esta regla:

X^Y = X * potencia(X,Y-1)

Abrimos un archivo de texto y tecleamos el siguiente código:

potencia(0,0,'ERROR') :- !.
potencia(X,0,1) :- X =\= 0.
potencia(X,Y,Z) :- A is Y -1, potencia(X,A,B), Z is B*X.

La primera linea es caso de error una base 0 elevada a un exponente 0.
La segunda linea se especifica que si una base N ,siempre que N sea diferente de 0, se eleva a un exponente 0 siempre es 1.
La tercera linea es el caso recursivo, se crea una variable A que guarda el decremento de Y hasta que el exponente es 0, se crea una nueva funcion potencia(X,A,B) donde B guarda el resultado de la multiplicación B * X durante la recursión, el resultado real se guarda en Z de la primera función potencia(X,Y,Z).

Abrimos en la terminal el interprete SWI-PROLOG y compilamos el código:


Ahora realizamos algunos calculos para probar el programa:


En ejemplo solo pongo la base y el exponente, es decir potencia(2,3,X) (2 elevado a la 3); pongo una X mayúscula porque quiero que el programa me evalue la operación y me regrese el resultado, recordemos que la funcion original es potencia(X,Y,Z) : X es la base, Y es el exponente, Z es el resultado.

**Es importante volver a mencionar que cuando queremos evaluar algun argumento de un hecho debemos poner en ese argumento cualquier letra (variable) en MAYÚSCULA, si no nos interesa evaluar algun argumento escribimos un GUIÓN BAJO.

Espero y les hayan servido estos ejemplos.

SALUDOS!!! ^_^

3 comentarios:

  1. Bien, te pongo 5 puntos para el lab por esta entrada.

    ResponderEliminar
  2. este codigo no me funciona en visualprolog VIP32 :/ ...nose que le tendria que cambiar para que compile

    ResponderEliminar
  3. hola!! buen tutorial..... para que halle la potencia de 2 numeros como seria?!

    ResponderEliminar