Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PARADIGMA DECLARATIVO:
Fuertemente basado en el uso de relaciones, el paradigma declarativo hace uso de funciones o
bien de la lógica de predicados para establecer dichas relaciones. Se centra en la descripción
del problema para elaborar un enunciado preciso y así descubrir un algoritmo o solución
general.
Desventaja: Tiende a ser usado con propósitos especiales.
Ventaja: La solución de un problema se realiza con niveles de abstracción altos.
PROLOG
TERMINOS SIMPLES:
TERMINOS ESTRUCTURADOS:
Listas: secuencia ordenada de términos (que pueden ser otras listas). Si la lista no está vacía
[] puede considerarse que posee una cabeza (primer elemento) y una cola (el resto).
Ejemplo: [a1, a2, a3].
Una consulta se escribe como un predicado durante la ejecución del programa, donde si solo
posee constantes devolverá Yes o No , y si posee una variable devolverla los valores para
donde esa variable sea verdadera.
Regla: se utiliza para representar conocimiento. Resultan útiles para definir nuevos predicados
en base a otros, por ejemplo: padre(X, Y) :- hijo(Y, X) . Donde :- significa si , resultando en Y
es hijo de X si X es padre de Y . En general las reglas tienen cabeza y cuerpo. Otro ejemplo más
complejo: abuelo(X, Y):- padre(X, Z), (padre(Z, Y) ; madre(Z, Y)).
Cláusulas de Horn: los hechos, reglas y consultas son clausulas. Los hechos son clausulas sin
cabeza, las consultas clausulas sin cuerpo. Los hechos y reglas forman la base de
conocimientos. Durante la ejecución el usuario realiza consultas a esta base de conocimientos.
Backtracking: es el proceso que se inicia cuando se llega a un resultado falso en una cláusula
de Horn, se comienza a deshacer todo lo ejecutado, dejando todo como estaba antes de la
ejecución.
Findall
Esta operación que nos provee Prolog posee tres argumentos, y se escribe de la siguiente
manera: findall(Respuesta, Objetivo, ListaRespuestas).
habitacion(001, ocupada).
habitacion(002, desocupada).
PARADIGMA FUNCIONAL:
Este paradigma se caracteriza por utilizar funciones para resolver problemas, devolver un
resultado, en base a los datos que le proporcionamos. Se dispone de un conjunto de valores,
funciones y operadores predefinidos, denominado Prelude.
HASKELL
Lenguaje funcional puro, no estricto y fuertemente tipificado.
Fuertemente tipificado: indica que los elementos utilizados en el lenguaje (valores, funciones,
operadores) están clasificados en distintas categorías o tipos. Cuando compilamos un
programa, el compilador sabe que trozos del código son enteros, cuales son cadenas de texto,
etc. Gracias a esto un montón de posibles errores son capturados en tiempo de compilación.
Haskell usa un fantástico sistema de tipos que posee inferencia de tipos. Esto significa que no
tenemos que etiquetar cada trozo de código explícitamente con un tipo porque el sistema de
tipos lo puede deducir de forma inteligente.
Si una función es llamada dos veces con los mismos parámetros, obtendremos siempre el
mismo resultado. A esto lo llamamos transparencia referencial y no solo permite al
compilador razonar acerca del comportamiento de un programa, sino que también nos
permite deducir fácilmente (e incluso demostrar) que una función es correcta y así poder
construir funciones más complejas uniendo funciones simples.
¿Polimorfismo en Haskell? Funciones que tienen sentido para más de un tipo. Ejemplos head
(devuelve la cabeza de una lista) o fst (primer elemento de una tupla) fts :: (a, b) -> a
Cuando declaremos una función con variables de tipo se puede especificar a qué grupo de
tipos pertenecerá esta, por ejemplo:
cuadrado :: Num a => a -> a
cuadrado x = x*x
Cualquier cosa antes del símbolo => es una restricción de clase. Podemos leer la declaración de
tipo anterior como: la función cuadrado toma un parámetro del tipo Num y devuelve otro
del mismo tipo.
Estructuras de datos
Una tupla es un dato compuesto donde el tipo de cada componente puede ser distinto, se
escribe (Hola, 2). Por otro lado una lista es un conjunto de 0 o más elementos del mismo tipo,
de la forma [a1, a2, .., aN]. La lista vacía se representa como []. Las listas poseen cabeza y cola
(x:xs).
Las listas por comprensión son listas formadas a partir de un comportamiento o condición, por
ejemplo:
Esto es todos los números del 50 al 100 cuyo resto al dividir por 7 fuera 3.
Encaje/Ajuste de patrones
Un ajuste de patrones consiste en una especificación de pautas que deben ser seguidas por los
datos, los cuales pueden ser desarmados permitiéndonos acceder a sus componentes.
Cuando llamamos a lucky, los patrones son verificados de arriba a abajo y cuando un patrón
concuerda con el valor asociado, se utiliza el cuerpo de la función asociado. En este caso, la
única forma de que un número concuerde con el primer patrón es que dicho número sea 7. Si
no lo es, se evaluara el siguiente patrón, el cual coincide con cualquier valor y lo liga a x.
También se podría haber implementado utilizando una sentencia if. Pero, ¿qué pasaría si
Guardas
Las guardas se indican con barras verticales que siguen al nombre de la función y sus
parámetros. Normalmente tienen una sangría y están alineadas. Una guarda es básicamente
una expresión booleana. Si se evalúa a True, entonces el cuerpo de la función correspondiente
es utilizado. Si se evalúa a False, se comprueba la siguiente guarda y así sucesivamente.
Muchas veces la última guarda es otherwise, está definido simplemente
como otherwise = True y acepta todo. Si todas las guardas de una función se evalúan a False,
entonces otherwise entra en acción.
Where
Nos sirve para declarar una variable auxiliar que se calcula utilizando los datos proporcionados.
Por ejemplo:
bmiTell :: (RealFloat a) => a -> a -> String
bmiTell weight height
| bmi <= 18.5 = "Tienes infrapeso ¿Eres emo?"
| bmi <= 25.0 = "Supuestamente eres normal."
| bmi <= 30.0 = "¡Estás gordo! Pierde algo de peso gordito."
| otherwise = "¡Enhorabuena, eres una ballena!"
where bmi = weight / height ^ 2
Función map
La función map toma una función y una lista y aplica esa función a cada elemento de esa lista,
produciendo una nueva. Vamos a ver su definición de tipo y como se define.
map _ [] = []
Función filter
Es una función que toma un predicado (un predicado es una función que dice si algo es cierto o
falso, o en nuestro caso, una función que devuelve un valor booleano) y una lista y devuelve
una lista con los elementos que satisfacen el predicado. Ejemplos:
ghci> filter (>3) [1,5,3,2,1,6,4,3,2,1]
[5,6,4]
ghci> filter even [1..10]
[2,4,6,8,10]
Lambdas
Las lambdas son funciones anónimas que suelen ser usadas cuando necesitamos una función
una sola vez. Normalmente creamos funciones lambda con el único propósito de pasarlas a
funciones de orden superior. Para crear una lambda escribimos un \ (Porque tiene un cierto
parecido con la letra griega lambda si le echas mucha imaginación) y luego los parámetros
separados por espacios. Luego escribimos una -> y luego el cuerpo de la función. Ejemplo:
map (\(a,b) -> a + b) [(1,2),(3,5),(6,3),(2,6),(2,5)]
[3,8,9,8,7]
PARADIGMA IMPERATIVO:
En contraposición a la programación declarativa, es un paradigma de programación que
describe la programación en términos del estado del programa y sentencias que cambian
dicho estado.
Herencia
Es un mecanismo que permite derivar de una superclase métodos y propiedades comunes a
sus clases hijas. Logrando así una mayor reutilización y extensibilidad. La herencia permite
crear clases que nunca serán instanciadas directamente, por ejemplo: una clase "perro"
heredaría los atributos y métodos de la clase "mamífero", así como también "gato", "delfín" o
cualquier otra subclase; pero, en ejecución, no habrá ningún objeto "mamífero" que no
pertenezca a alguna de las subclases. A estas clases se las conoce como abstractas.
Polimorfismo
El polimorfismo es una relajación del sistema de tipos, en un lenguaje fuertemente tipado
como es Java o C. Gracias a este mecanismo el lenguaje aceptará objetos de la clase hija o
derivada, y no solo de la clase padre declarada. Ejemplo: creamos una clase Vehículo , la cual
tiene tres clases derivadas o hijas, que son Auto , Moto y Colectivo . Si creamos un array
de tipo Vehículo:
Este aceptara no solo objetos de tipo vehículo, sino también de las clases hijas auto, moto y
colectivo. El polimorfismo también se aplica a parámetros de funciones, siguiendo el ejemplo
de recién si creamos una función: void ejemplo(Vehículo a1);
Esta función aceptara que le pasemos como parámetros, además de vehículos, autos, motos
y colectivos.
Abstracción
Abstracción es un término del mundo real que podemos aplicar tal cual lo entendemos en el
mundo de la Programación Orientada a Objetos. Algo abstracto es algo que está en el universo
de las ideas, los pensamientos, pero que no se puede concretar en algo material, que se pueda
tocar.
Por ejemplo ¿en el mundo real hay un "animal" como tal? No, ni tan siquiera hay un
"mamífero". Lo que tenemos son especímenes de "perro" o "vaca", "hormiga", "cocodrilo",
"gorrión" pero no un "animal" de forma general. Es cierto que un perro es un animal, pero el
concepto final, el ejemplar, es de perro y no animal. Por tanto "animal", en términos del
lenguaje común, podemos decir que es un concepto genérico, pero no una concreción. En
términos de POO decimos que es un concepto abstracto, que implementaremos por medio de
una clase abstracta. No instanciaremos animales como tal en el mundo, sino que
instanciaremos especímenes de un tipo de animal concreto.
Abstracción y Herencia
En POO no solo tenemos clases abstractas, sino también, métodos abstractos. Siguiendo el
ejemplo de los animales, podríamos pensar en un mecanismo que todos los animales realizan,
aunque sea de distinta manera, por ejemplo nacer . Creamos así: public abstract function
nacer();
Esto quiere decir que todos los animales del mundo heredarán un método abstracto llamado
nacer. En las clases concretas que hereden de animal y donde ya sepamos cómo nace tal
animal, por ejemplo, la gallina, podemos implementar ese método, para que deje de ser
abstracto.
Abstracción y Polimorfismo
Esta relación es difícil de explicar de manera precisa, pero con un ejemplo se logra entender
fácilmente. Por ejemplo, tengo la clase "PoligonoRegular", sé que los polígonos regulares voy a
querer conocer su área, pero para saber su área necesito conocer el número de lados que
tiene. Entonces la clase "PoligonoRegular" tendrá un método abstracto "calcularArea()".
Luego, al definir la clase "cuadrado", o el "pentágono", etc., podremos implementar tal
método, con lo que dejará de ser abstracto. Gracias a que fueron definidos los métodos
abstractos "calcularArea()"en la clase padre, tengo clara una cosa: cuando trabajo con
elementos de la clase "poligonoRegular", sé que a todos los polígonos regulares que pueda
recibir les puedo pedir que me devuelvan su área. Eso me permite, en un esquema de
polimorfismo, que pueda estar seguro que todos los objetos que reciba puedan responder a
acciones determinadas, pues en las clases hijas habrán sido definidas necesariamente, aunque
los métodos se calculen de forma distinta.
Cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a
un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados de un
objeto contra su modificación por quien no tenga derecho a acceder a ellos, eliminando
efectos secundarios e interacciones.
Componentes POO
Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La
instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.
JDBC
Java Database Connectivity, más conocida por sus siglas JDBC, es una API que permite la
ejecución de operaciones sobre bases de datos desde el lenguaje de programación Java,
independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se
accede, utilizando el dialecto SQL del modelo de base de datos que se utilice.
Driver
En nuestro proyecto de aplicación Java, sobre la plataforma del IDE Netbeans, tenemos que
añadir las bibliotecas, drivers o interfaces adecuadas para el servicio Jdbc que utilizaremos,
MYSQL JDBC Driver es la biblioteca adecuada para MySql.
Clase GestionConexion
Esta clase es clave para que el programa se conecte con la base de datos. Cuenta con los
siguientes atributos: