La programacion logica es aquella que se basa en el uso de hechos y predicados para su funcionamiento entero, es en base a estos que el lenguaje comprende lo que va a manejar y como lo tiene que hacer.
prolog no tiene tipos de datos definidos, en cambio el usuario le dice al lenguaje que es lo que tiene, por ejemplo:
dog(fido).
dog(spike).
dog(sam).
cat(kit).
cat(neko).
animal:-cat(X);dog(X).
en el codigo anterior nosotros definimos 3 nombres que son perros y 3 que son de gatos y el ultimo dice que cualquier nombre introducido que sea de perros o gatos es un nombre de animal
para comprobar que esto funcione o no, guarde eso en un archivo de texto con extencion pl y carguelo en prolog, una vez hecho eso escriba:
dog(fido).
dog(kit).
animal(spike).
animal(kit).
notara que en algunos le arrojara un false o un true, en lenguaje logico los programas retornan un true o false segun el programa se ejecuto correctamente o no, o si el valor existe o no existe.
para que el programa realize alguna otra accion al terminar como imprimir o leer, se tiene que especificar en los programas, usando BIP's(built-in predicates) o palabras reservadas.
los predicados son las sentencias que el lenguaje lee y usa para entender que es lo que tiene que hacer, los predicados consisten en un cuerpo y un atomo, en los ejemplos anteriores el cuerpo es dog y el atomo es el nombre, los predicados pueden contener uno o mas atomos, no tiene un limite.
al crear predicados se puede hacer tambien uso de recursividad, llamando predicados dentro de los mismos predicados haciendo la funcion de ciclos, de la misma forma que en funcional se establece una condicion que terminara el ciclo.
BIP's (Palabras reservadas)
prolog como ya mencionamos contiene ya sus propios predicados que pueden ser utilizados para realizar los programas, antes de mencionarlos hay que explicar un termino que sirve mucho al momento de identificar un error en un predicado, la aridad hace referencia al numero de atomos o "parametros" que recibe un predicado, un predicado con aridad 1 recibe un solo atomo, aridad 2 recibe dos parametros.
write:aridad 1.
write("hola mundo").
write(X).
write es un predicado que imprime texto, ya sea contenido de una variable o texto fijo.
put y get0, estos son predicados que sirven para convertir caracteres en codigo ascii para obtener su valor correspondiente, son utiles al momento de requerir la manipulacion de cadenas de texto, get0 convierte de cadena a ascii y put de ascii a cadena.
Read, seen estos predicados sirven para leer archivos de texto, read tiene aridad 1 por lo que recibe un atomo que puede ser el nombre del archivo o ruta completa del archivo en caso de no estar en la carpeta default de prolog, seen es un predicado que se usa una vez que se a terminado de utilizar el archivo, seen no tiene aridad su funcion es cerrar el archivo.
tell, told, estos predicados sirven para crear archivos, tell tiene aridad 1, recibe como atomo el nombre del archivo que se quiere crear (o ruta completa) una vez abierto el archivo al usar el predicado write/1 lo que se introduzca como atomo se escribira en el archivo, al usar el predicado told, prolog finaliza el archivo y lo guarda en la carpeta de prolog o destino especificado.
jueves, 2 de junio de 2016
miércoles, 1 de junio de 2016
Tipos de evaluacion
Evaluacion imperativa o impaciente
La evaluacion imperativa es aquella que ejecuta todo el programa aunque ya no tenga sentido seguir adelante. este tipo de evaluacion es el que usan los lenguajes de programacion mas comunes y por lo general en cuanto a recursos se consumen mas debido a que muchas veces por el hecho de seguir adelante sin necesidad de puede provocar errores inesperados en los programas.
Evaluacion perezosa
La evaluacion perezosa a diferencia de la imperativa no se molesta en seguir adelante si no es necesario, digamos por ejemplo que se tiene que revisar una lista que contenga solo numeros pares y en la primera posicion se topa con un numero impar, haskell inmediatamente dejara de buscar en el resto de la lista por que no tiene caso.
Ventajas y desventajas de cada tipo de evaluacion.
la evaluacion imperativa entrega resultados exactos, y al momento de depurar en caso de errores de resultado es mucho mas facil corregir, pero consume mas recursos y tarda mas tiempo en ejecutarse.
la evaluacion perezosa por otra parte es mas inexacta y si se tienen errores en los resultados que da podria ser mas confuso encontrar donde esta el error ya que el programa simplemente deja de hacer lo que hace en vez de mostrar algun dialogo de error.
La evaluacion imperativa es aquella que ejecuta todo el programa aunque ya no tenga sentido seguir adelante. este tipo de evaluacion es el que usan los lenguajes de programacion mas comunes y por lo general en cuanto a recursos se consumen mas debido a que muchas veces por el hecho de seguir adelante sin necesidad de puede provocar errores inesperados en los programas.
Evaluacion perezosa
La evaluacion perezosa a diferencia de la imperativa no se molesta en seguir adelante si no es necesario, digamos por ejemplo que se tiene que revisar una lista que contenga solo numeros pares y en la primera posicion se topa con un numero impar, haskell inmediatamente dejara de buscar en el resto de la lista por que no tiene caso.
Ventajas y desventajas de cada tipo de evaluacion.
la evaluacion imperativa entrega resultados exactos, y al momento de depurar en caso de errores de resultado es mucho mas facil corregir, pero consume mas recursos y tarda mas tiempo en ejecutarse.
la evaluacion perezosa por otra parte es mas inexacta y si se tienen errores en los resultados que da podria ser mas confuso encontrar donde esta el error ya que el programa simplemente deja de hacer lo que hace en vez de mostrar algun dialogo de error.
Programacion en lenguaje funcional.
Recursividad
en haskell la recursividad es el metodo mas comun para realizar muchos programas, la recursividad consiste en que la funcion se llame asi misma un numero indefinido de veces como en el siguiente ejemplo
en la imagen declaramos la funcion factorial que lo que hace es multiplicar un numero n por todos los numeros menores a el hasta llegar a 0, para hacerlo la funcion se llama asi mismo una y otra vez, el resultado que obtenemos al llegar n a 0 es algo parecido a esto, factorial 4: 4*(3*(2*(1*1)))
y nos entrega el resultado: 24
funcion en funcion
como ya vimos anteriormente, haskell no nos permite simplemente mezclar distintos tipos de datos entre si dentro de una funcion por lo que programar puede llegar a ser algo complicado, si se requiere tener que manejar distintos tipos de datos se requieren hacer multiples funciones y hacer que se llamen entre si.
por ejemplo:
en la funcion anterior vemos que la funcion euler al final declara otra funcion multiplo que realiza operaciones por su cuenta. tambien se pudo haber declarado por separado en vez de usando el where.
en haskell la recursividad es el metodo mas comun para realizar muchos programas, la recursividad consiste en que la funcion se llame asi misma un numero indefinido de veces como en el siguiente ejemplo
en la imagen declaramos la funcion factorial que lo que hace es multiplicar un numero n por todos los numeros menores a el hasta llegar a 0, para hacerlo la funcion se llama asi mismo una y otra vez, el resultado que obtenemos al llegar n a 0 es algo parecido a esto, factorial 4: 4*(3*(2*(1*1)))
y nos entrega el resultado: 24
funcion en funcion
como ya vimos anteriormente, haskell no nos permite simplemente mezclar distintos tipos de datos entre si dentro de una funcion por lo que programar puede llegar a ser algo complicado, si se requiere tener que manejar distintos tipos de datos se requieren hacer multiples funciones y hacer que se llamen entre si.
por ejemplo:
en la funcion anterior vemos que la funcion euler al final declara otra funcion multiplo que realiza operaciones por su cuenta. tambien se pudo haber declarado por separado en vez de usando el where.
Suscribirse a:
Entradas (Atom)