viernes, 5 de noviembre de 2010

*Tipos de Datos Abstractos

Materia: Laboratorio de lenguajes de programación
Hora: Jueves v1




Hola a todos aquí les dejo una pequeña entrada sobre Tipos de Datos Abstractos (TDA) :)




Un tipo de dato abstracto (TDA) es un modelo matemático compuesto por una colección de operaciones definidas sobre un conjunto de datos para el modelo. El concepto de tipo de dato abstracto fue propuesto por John Guttag en 1974.

Con mucha frecuencia se utilizan los términos TDA y Abstracción de Datos de igual manera, y esto es debido a la similitud que tienen, pero es importante definirlos por separado.


 

Un TDA de una lista puede ser implementado mediante un arreglo, una lista enlazada o un árbol binario de búsqueda. Una lista es un Tipo de Dato Abstracto con operaciones bien definidas (agregar elemento, agregar al final, agregar al principio, recuperar, eliminar, etc) mientras una lista enlazada es una estructura de datos basada en punteros o referencias que puede ser usada para crear una representación de una lista, la lista enlazada es comúnmente usada para representar una TDA lista. Un TDA Árbol binario de búsqueda puede ser representado de muchas maneras: Árbol binario, Árbol AVL, Árbol rojo-negro, Arreglo, etc. A pesar de la implementación un Árbol binario siempre tiene las mismas operaciones (insertar, eliminar, encontrar, etc.)







Algunos ejemplos donde se utilizan los Tipos de Dato Abstracto son:


  • Conjuntos: Implementación de conjuntos con sus operaciones básicas (unión, intersección y diferencia), operaciones de inserción, borrado, búsqueda...



  • Árboles Binarios de Búsqueda: Implementación de árboles de elementos, utilizados para la representación interna de datos complejos. Aunque siempre se los toma como un TDA separado son parte de la familia de los grafos.


  • Pilas y Colas: Implementación de los algoritmos FIFO y LIFO.


  • Grafos: Implementación de grafos; una serie de vértices unidos mediante una serie de arcos o aristas.




Aquí les dejo unos videos que encontre sobre Tipos de Datos Abstractos :
* Video 1
* Video 2
* Video 3
* Video 4
* Video 5

Bueno esto es todo sobre mi entrada, espero les sea útil la información cualquier comentario hagánmelo saber. Saludos :)

*Prolog

Puntos extra


Hola a todos, aquí les dejo otro problema lógico, sólo que éste esta un poco más sencillito :)

Y el problema dice asi :

Estaban Ángela, Rosa y Cecilia hablando en clase y el maestro quiere saber quién de las 3 era la que estaba hablando más alto. Entonces si Ángela habla más bajito que Rosa y Cecilia habla más alto que Rosa, ¿Quién de las 3 es la que habla más alto? .

Ahora resolveremos el problema: 

Tenemos 3 personas : 

  • Ángela 
  • Rosa
  • Cecilia
 Y basándonos en la redacción se puede decir que :

  • Ángela habla más bajito que Rosa
  • Rosa habla más alto que Cecilia
Entonces sacamos por conclusión que la que habla más alto de las 3 es Rosa :)



Ahora pasaremos el problema a Prolog :


Primero tenemos que hacer nuestro programa en emacs





          Después compilamos el programa en prolog, lo ejecutamos e introducimos
                                                          la  pregunta :)


Y entonces como vemos dio resultado que la que habla más alto de las 3 es Rosa :)







Espero les haya gustado la entrada cualquier comentario hagánmelo saber. Saludos :)


*Prolog

Materia: Lenguajes de Programación

Hora: Martes M1 - M3



Hola a todos, aquí les dejo mi entrada sobre el programa lógico.

Y el problema dice así:

Pedro, Cecilia, Dario y Oscar tienen cada uno un perro en su casa. Todos los perros son de diferentes razas: Dálmata, Ovejero Alemán, Pekinés y Collie. Como cecilia tiene un pequeño departamento no puede tener un Ovejero Alemán, sin embargo hay uno en el mismo edificio dolnde ella vive. Dario asegura que en su edificio no hay ningún Pekinés, este se encuentra en otro edificio que tampoco es el de Oscar. Si ninguno de ellos tiene un perro cuya raza comience con la misma letra que su nombre, y no hay 2 perros iguales.¿Cuál es el perro de Cecilia?.

Entonces ahora resolveremos el problema:

Tenemos 4 personas :
  • Pedro
  • Cecilia
  • Dario
  • Oscar

Tenemos 4 perros :
  • Dálmata
  • Ovejero Alemán
  • Collie
  • Pekinés

Y ahora basándonos en la redacción podemos decir lo siguiente:

  • Pedro no puede tener el Pekinés.
  • Cecilia no puede tener el Collie ni el Ovejero Alemán.
  • Dario no puede tener el Dálmata ni el Pekinés.
  • Oscar no puede tener el Ovejero Alemán ni el Pekinés.

Entonces como ni Pedro, ni Dario, ni Oscar pueden tener el Pekinés sacamos por conclusión que el perro de Cecilia es el Pekinés.

Ahora les pondre el problema planteado en Prolog :

Primero realizamos nuestro programa en emacs y quedaría algo asi


Después tenemos que ejecutar el programa en la terminal, primero ponemos Prolog para que lo habrá y nos va a aparecer algo asi 


Despúes ponemos consult y la ubicación del programa y quedaría
consult('/home/ubuntu/programa.prolog').



Después ponemos listing. para que nos muestre el programa.



Y después introducimos la pregunta :)




Y como vemos si nos dio la respuesta el perro de Cecilia es el Pekinés :)





Espero que les haya gustado mi entrada, cualquier comentario hagánmelo saber. Saludos :)

domingo, 31 de octubre de 2010

*Lenguajes Funcionales


Hola a todos, aquí les dejo mi reporte sobre los lenguajes funcionales voy a dar una pequeña introducción de cada uno pero los programas que voy a realizar van a ser en : R y Haskell.

----------------------------------------------------------------------------------------------------------
Lenguaje R 

Es un lenguaje utilizado para uso de análisis estadístico y gráfico, es un lenguaje orientado a objetos, es un lenguaje interpretado como java y no compilado como c, c++,etc. Fue desarrollado por  Robert Gentleman y Ross Ihaka del Departamento de Estadística de la Universidad de Auckland en 1993. La manipulación de datos en R es muy flexible.

A continuación les mencionare algunas características de R :

  • Almacena y manipula efectivamente los datos.
  • Utiliza operadores para cálculo sobre variables indexadas como arrays, en particular matrices.
  • Tiene una amplia colección de herramientas para análisis de datos.
  • Utiliza gráficas para analizar los datos que funcionan directamente sobre pantalla, es decir que al momento que se introducen los comandos se ejecutan directamente.
  • Es un lenguaje de programación bien desarrollado, simple y efectivo, incluye condicionales, ciclos, funciones recursivas y posibilidad de entradas y salidas.
Aquí les dejo:


Una Tarjeta de referencia donde vienen algunos comandos que tal ves les puedan ser útil 

Un Curso básico de R donde te dicen como empezar a utilizar este lenguaje. :)

Aquí les dejo unos ejemplos de cosas que puedes realizar en R :

Una de las cosas que podemos hacer en R es utilizarlo como calculadora y realizar diferentes operaciones aritméticas 


Otra cosa que puedes realizar en R es leer datos desde un archivo que ya tengas, por ejemplo yo tengo este archivo de datos.txt en emacs y lo que quiero hacer esque R me lo lea y esto lo realizará con la función read.table
Está es mi base de datos que tengo de calificaciones entonces para que R lo lea en la terminal introduzco lo siguiente : misdatos <- read.table("datos.txt"). En este caso R va a crear un marco llamado misdatos.

Y una última cosa que voy a poner es que en R se pueden realizar gráficas, pero  a su vez si quieres para que no solo te quede una sola gráfica en la pantalla puedes dividirla en varias partes para ir colocando las gráficas que quieras y para esto yo utilice la función  layout(matrix(1:6, 3, 2)), en donde el 1 marca el principio, el 6 el final osea serán 6 partes y el 3 es de filas y el 2 de columnas.



-----------------------------------------------------------------------------------------------------------

Lenguaje LISP

Les voy a hablar un poco sobre el lenguaje LISP, éste lenguaje fue creado por el profesor John McCarthy como una notación matemática basada en el cálculo lambda, es uno de los lenguajes favoritos utilizados para la inteligencia artificial. El nombre de LISP se deriva de LISt Processing

La lista es el elemento fundamental del lenguaje LISP, las listas estan delimitadas por paréntesis, uno de los motivos por los que LISP es utilizado en la inteligencia artificial es que el código y los datos tengan listas ya que es más sencillo escribir programas capaces de escribir otros programas.

El Lisp trata de manera no destructiva a los elementos que le introducimos, de forma que la mayoría de las funciones nos devuelven una lista que es el resultado de alguna transformación de otra que recibió.

Las estructuras de datos en LISP pueden clasificarse en dos grupos:
  • Primitivas: se llaman “átomos” en LISP (“átomo” en griego significa
    indivisible).
  • Constructores: es la lista, la cual permite estructuras complicadas a partir de
    estructuras simples.

Hay al menos dos tipos de átomos:
  • Los átomos numéricos tienen la sintaxis de los números (o sea, son dígitos,
     posiblemente con un punto decimal).
  • Los átomos no numéricos son cadenas de caracteres que se pretendía originalmente
     que representaran palabras o símbolos.


Comandos en LISP : 

  • car : devuelve el primer elemento de una lista.
> (CAR ‘(A B C D))
A
  • cdr: devuelve la lista sin su primer elemento.
> (cdr ’(a b c))
(B C)
  • cond: ejecuta un flujo de control dependiendo de la condicion si es cierta o no lo es, es parecido al switch en c pero en lisp lo que se pone en los case son condiciones lógicas y no constantes.
> (defun notas (n)
    (cond ((< n 5) ’suspenso)
          ((< n 7) ’aprobado)
          ((< n 9) ’notable)
          (t ’sobresaliente) )) => NOTAS
> (notas 8)                     => NOTABLE
  • cons: añade al principio de una lista dada un elemento.
> (cons ’a ’(b c d))
(A B C D)
  • defun: define una función con un nombre el cual será llamado mediante el comando (nombre-función args) y tiene como argumentos una lista de variables.
(defun CUADRADO (x) "Mi funcion cuadrado"
  (* x x
     )
  )
  • endp: cierto (T), si la lista está vacia y nil en caso contrario.
 (endp '(a b c)) >nil 
(endp '())
>T  
  • eq: se utiliza para saber si dos átomos son iguales.
(eq 3 3)                       => T
     (eq 3 3.0)                     => NIL
     (eq 3.0 3.0)                   => NIL
     (eq (first ’(a b c)) ’a)       => T
     (eq (cons ’a ’(b c)) ’(a b c)) => NIL 
  • equal
(equal (cons ’a ’(b)) (cons ’a ’(b))) => T 
 
  • list: construye una lista a partir de sus elementos.
> (list ’a (+ 1 2) nil)
(A 3 NIL) 
  • quote: está función evita la evaluación de su argumento.
> (quote (+ (- 5 2) (* 3 3)))
(+ (- 5 2) (* 3 3))  

Aquí les dejo una guía de lisp espero les sea útil :) 
 
-----------------------------------------------------------------------------------------------------------

Lenguaje Scheme 

Les hablare un poco sobre el lenguaje Scheme, éste lenguaje fue desarrollado por Guy L. Steele y Gerald Jay Sussman, es el primer dialecto de lisp que útiliza un ámbito estático o léxico. 

A continuación les voy a mencionar algunas ventajas y desventajas que existen al utilizar Scheme:

~Ventajas:
- Tiene una sintáxis muy reducida, no necesita reglas de precedencia.
- Utiliza un sistema de macros higiénico que evita colisiones entre los nombres usados en la definición de la macro y en el contexto que ésta se expande.
- Se utilizan procedimientos con objetos de primera clase, y esto permite la definición de  funciones de orden superior, que facilitan los programas.

~ Desventajas:
- Como el estándar de Scheme es minimalista y específico provoca que existan muchas implementaciones diferentes.
- Que los procedimientos y variables tengan el mismo espacio de nombres ya que algunas funciones tienen nombres que se utilizan comúnmente para las variables.
- Como el espacio de nombres tiene que ser único y en Scheme no lo es, no se pueden distinguir en uso de una macro o el de una función, entonces si no sabemos cual es la definición de cada uno de los objetos no vamos a poder determinar el orden de evaluación en los programas.

*Elementos de Scheme

1. Para agregar un comentario se inicia con un punto y coma (;) y continúan hasta el final de la línea.
2. Para poder asociar las variables a un valor concreto podemos utilizar define que las variables son visibles en el programa, y cuando utilizamos let es para ver su ámbito reducido.
3. En Scheme hay 3 tipos de igualdad: eq? = es el que devuelve #t si los objetos son exactamente el mismo objeto, eqv? = es muy parecido al eq? solo que trata algunos objetos como caracteres y números de forma especial para que los números que sean iguales eqv? incluso si no son eq?, equal? = es el que compara el contenido de las estructuras de datos tales como listas, vectores y cadenas para determinar si son iguales.
4. En Scheme hay operadores de equivalencia dependientes : string=? = es el que compara dos cadenas, char=? = es el que compara dos caracteres y el = compara números.

Aquí les dejo un Manual de Scheme  está muy completo ojala les sea útil :)

-----------------------------------------------------------------------------------------------------------

Lenguaje Haskell 

Les hablare un poco sobre este lenguaje, Éste lenguaje funcional fue creado por Haskell Curry. Algunas características que tiene son : el soporte para tipos de datos y funciones recursivas, listas, tuplas y calce de patrones. 

~ Algunos valores en haskell 

-El tipo Bool
Los valores con este tipo representan expresiones lógicas cuyo resultado puede ser True o False.

Funciones y operadores
  • (&&) :: Bool -> Bool -> Bool. Conjunción lógica.
  • (||) :: Bool -> Bool -> Bool. Disyunción lógica.
  • not :: Bool -> Bool. Negación lógica.
  • otherwise :: Bool. Función constante que devuelve el valor True.

-El tipo Integer

Los valores de este tipo son números enteros de precisión ilimitada que tienen las mismas funciones y operadores del tipo Int.

-El tipo Float

Los valores de este tipo son números reales. ( 2010, 23.4 , 5.7 )

Funciones y operadores

  • (+), (-), (*), (/), (^):: Float -> Float -> Float. Suma, resta, producto, división real y potencia de exponente entero.
  • abs, signum, negate :: Int -> Int. Valor absoluto, signo y negación.
  • (**) :: Float -> Float. Potencia de exponente real

-El tipo Double

Los valores de este tipo son números reales, de mayor rango y con aproximaciones más precisas que los de tipo Float.

-El tipo Char

Los valores de este tipo son caracteres que se encuentran en una masa de alta complejidad de en una suma de caracteres dados con su alta definición antes de utilizar esta función en hugs debemos utilizar IMPORT CHAR antes de nuestro algoritmo.

-Tuplas

Los elementos que forman una tupla pueden ser de distintos tipos.
Por ejemplo: ('a',True,3)

-Listas

Los valores de este tipo son una colección de elementos del mismo tipo.
  • [Elementos_separados_por_comas] , por ejemplo: [1,2,3,4]

Aquí les dejo unos sencillos programas que hice en haskell
El primero es que te dice cual de los dos números es el máximo, y sí los dos números son iguales te dice "error ambos números son iguales".



Otro programa que realice en Haskell fue uno que te cuenta los dígitos del número que introduzcas.



Y el último que hice fue basandome en éste es parecido solo que en lugar de solo contarte los dígitos, te los suma y te saca el producto entre ellos. 



Es todo de mi reporte 4 espero en verdad les sea útil :) 

Saludos.

lunes, 6 de septiembre de 2010

*Ordenamiento por mezcla

Materia: Lenguajes de programación 

Hora: Martes m1-m3


Hola compañeros, aquí les dejo mi presentación sobre el ordenamiento de mezcla. Aquí  solo veran un pequeño ejemplo de como es el ordenamiento por mezcla ya que la explicación en sí del pseudocódigo le toco a mi compañera Carmen Suarez  y mi compañero Jorge Molano también tendrá en su blog otro ejemplo.


Les explicare un poquito mi ejemplo: primero se da una lista de números, después se divide a la mitad la lista, cuando ya esta dividida en dos partes lo que se hace es empezar a tomar de dos en dos los números, se comparan se empiezan a ordenar, esto se realiza sucesivamente hasta que queden todos los números completamente ordenados.

Espero les sea útil la información y espero le entiendan al ejemplo. Saludos :)

domingo, 5 de septiembre de 2010

*Recursividad

Materia: Laboratorio de Lenguajes de Programación.
 
Hora: Jueves v1.


Hola compañeros, en esta entrada hablare sobre lo que es recursividad. Para tener un poco más claro lo que vimos en clase.

Se dice que una función recursiva es una función que se llama así misma de manera directa o indirecta a través de otra función. Ahora les explicare como se realiza una función recursiva para resolver un problema, primero se llama a la función recursiva y cuando ya checa todo la función sólo sabe cómo resolver el problema para el caso más sencillo, o caso base, después se llama a la función desde el caso base y ésta sólo devuelve un resultado, pero si se llama a la función desde un problema más complejo la función va a dividir el problema en dos partes, una de las partes va a saber como resolver y la otra parte no sabrá cómo, entonces para que la segunda parte haga la recursividad tiene que replantear el problema original pero con una versión más sencilla o más pequeña que el problema original, entonces como este problema se parece al problema original lo que hace esque se llama a una nueva copia de sí misma para que trabaje con el problema más pequeño. 

El paso recursivo también incluye la palabra reservada return, debido a que su resultado se combinará con la parte del problema que la función sabe cómo resolver para formar un resultado que se pase a la llamada original de la función.

El paso recursivo se ejecuta mientras la llamada a la función original este abierta, es decir, que no termine su ejecución por lo tanto puede generar muchas más de estas llamadas recursivas, mientras la función continúa dividiendo cada problema en dos partes para que la recursividad termine, cada vez que la función se invoca a sí misma con una versión del problema original la función reconoce el caso base, devuelve el resultado a la copia previa de la función y presenta una secuencia de resultados hasta que la función original devuelve el resultado final.



Espero les sea útil la información. Saludos :)