jueves, 2 de junio de 2016

programacion Logica.

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.

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.

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.

lunes, 30 de mayo de 2016

Tipos de datos en programacion funcional

En lenguaje funcional el uso de los datos debe ser selectivo y se debe tener cuidado al momento de hacer uso de un tipo en especifico de dato para retornar algun otro, por naturaleza del lenguaje es imposible hacerlo directamente ya que una vez iniciado un procedimiento no se pueden incluir tipos de datos diferente a la entrada, para poder hacer eso se deben hacer especificaciones en la declaracion de la funcon como por ejemplo:

       <Haskell>

        Funcion :: Int -> String
        Funcion x = <parametros de la funcion>

donde "x" representa la entrada de datos que habra al nomas ser solo la x solo recibira un parametro,
en este caso se esta creando una funcion que va a recibir un entero y va a retornar una cadena, otro ejemplo de funciones que requieren mas trabajo la especificacion de tipos se hace de la siguiente manera:

        <Haskell>

         Funcion :: [a]->Int->Bool
         Funcion x = <parametros de la funcion>

En el ejemplo anterior se esta declarando una fucnion que recibira una lista, luego manejara enteros y retornara un booleano.

Los tipos de datos que puede recibir haskell son
Int
String
Bool
Char
[a] (lista)
[Int] (lista enteros)
Float
Double

Para crear un tipo de dato personalizado se utiliza la expresion type <nombre> = (<contenido>)
por ejemplo podemos crear un tipo nombre de la siguiente manera:
     type nombre = String

o un tipo numero de telefono
     type numero = Int

o un dato mas complejo como una tupla
    type contacto = (String,Int)
    o
    type contacto = (nombre,numero)

Lista:
Una lista es un conjunto de datos indefinido, que almacena solo un tipo de dato, algo similar a los arreglos con la limitande a un solo tipo de dato Ejemplo:

          [10,20,30,40] <- Lista Int
          ['a','b','c','d']         <- Lista String

Si tratamos de hacer una mezcla tal como [10,20,30,a,b,c] seria incorrecto y arrojaria error debido a que se esstan integrando enteros y caracteres en la lista cuando deberian ser solo enteros o solo cadenas

creacion de listas en haskell:
en haskell  para crear una lista se utiliza el comando let <nombre_lista> =  [<Valores>]
Ejemplo:
         Let lista1 = [1,2,3,4,5,6,7,8,9]
         Let lista2 = ['a','b','c']
una vez creadas es solo cuestion de teclear en el prompt de haskell en nombre de la lista para que muestre sus contenidos


Las listas pueden ser manipuladas de distintas formas como por ejemplo si usamos la palabra reservada head nos muestra el primer valor dentro de la lista:
       head lista1
       head lista2



Otros comandos que hay para el uso de las listas son tail, init ,last.
tail muestra todos los elementos menos el primero, init muestra todos los elementos menos el ultimo y last muestra solo el ultimo elemento, se tiene tambien otra funcion de uso en listas que

todos estos comandos pueden ser utilizados en combinacion para poder desarrollar ciertas operaciones con las listas como sumarlas, mezclarlas o recorrer valores dentro de la lista

Tupla:

Las tuplas en haskell a diferencia de las listas estas pueden tener multiples tipos de valores dentro
por ejemplo:
    let tupla = (1,a,3.5)

Las tuplas pueden tener un gran uso dentro de programacion funcional ya que se pueden conjuntar multiples datos en una tupla y luego asignar esa tupla como un tipo de dato

En lenguajes de tipo funcional se pueden crear tipos de datos personalizados, los cuales, son declarados como algun tipo de dato ya existente (para un uso mas sencillo al momento de declarar en un programa o mas entendible) o un conjunto de datos