Estilos de Programación?
El estilo de programación se refiere a la forma en que se da formato al código fuente.
Los lenguajes de programación tienen la particularidad de cumplir un doble rol.
Por un lado sirven para comunicar humanos con computadoras. Son la forma de transformar una serie de abstracciones como algoritmos, módulos, tipos de datos y sistemas en algo que una computadora pueda ejecutar.
Básicamente, es la forma de organizar el código para facilitar la lectura de el.
NOTA: Si eliges un estilo para tu programa debes seguir con el mismo estilo. El código debe estar bien escrito. Debe ser atendible para todos.
Código ofuscado,
el código es enrevesado para ocultar su funcionalidad. (es cuando se tiene todo revuelto.Las cualidades:
• Expansibilidad• Verificabilidad
• Reparabilidad
• Capacidad de Evolución
• Comprensibilidad
Consideraciones:
• Estilo debe ser uniforme.
• Programas que puedan ser comprendidos de manera inmediata
• No debe promover fragmentos de código (Ej. Comentarios Innecesario)
• Definir lo más posible como corre el programa
• Indentación, que la estructura sea correcta
El estilo K&R es el más usado en el lenguaje C y PHP. El estilo K&R, fue llamado de esta forma porque fue usado por Kernighan y Ritchies en su libro The C Programming Language.
Se trata de abrir la llave en la misma línea de declaración de la orden,indentando los siguientes pasos al mismo nivel que la llave y cerrando la llave en el mismo nivel que la declaración.
Ejemplo

Estilo Allman
El estilo Allman fue definido por Eric Allman. Se trata de crear una nueva línea para las llaves, e identar el código debajo de ellas.
La llave de cierre tiene el mismo identado que la de inicio.
Ejemplo:
Estilo BSD KNF
También conocido como estilo Kernel Normal Form, es la manera más usada para el código de la distribución del software del sistema operativo de Berkeley.Es un extensión del estilo K&R.
Se define un tabulador duro (8 espacios) el cual es usado para indentar bloques de código, mientras un tabulador suave (4 espacios) para todas las lineas continuas que exceden el espacio de visión de la consola
Ejemplo
Estilo Whitesmiths
El estilo Whitesmiths también llamado estilo Wishart. Este estilo coloca las llaves asociadas con la instrucciones de control indentada en la siguiente linea.
Este estilo pone la llave que sigue a la declaración de un bloque se realiza indentada en la línea siguiente. Instrucciones dentro del bloque son indentados en el mismo nivel que la llave.
Ejemplo
Estilo GNU
El estilo GNU coloca una llave sobre la siguiente linea.
Las llaves son indentadas por 2 espacios,y el código que contiene indentada por 2 espacios adicionales.
Ejemplo

Paradigma?
Los paradigmas de programación nos indican las diversas formas que, a lo largo de la evolución de los lenguajes,
han sido aceptadas como estilos para programar y para resolver los problemas por medio de una computadora.
han sido aceptadas como estilos para programar y para resolver los problemas por medio de una computadora.
Programación Imperativa:
Es el paradigma de programación más utilizado y mejor desarrollado. A finales de los 30’s Alan Turing, John von Newmann y otras personas
reconocieron que un programa como sus datos se pueden ir guardando dentro de la memoria principal.
El equipo tiene una memoria, que contiene tanto las instrucciones del programa como los valores de los datos.
Es un Lenguaje de recorrido competo: es recorrido competo cuando el lenguaje contenga variables, valores, secuencias, etc.
Características:
• Tipos de datos
• Estructuras de control, bucles, for y while
• Asignación de elementos y arreglos
Algunos lenguajes de programación imperativa
• Cobol
• Fortran
• C
• C++
POO:
Trata de ver todo como un objeto y una clase que lo relacione entre sí.
Algunos lenguajes de programación imperativa
• Smalltalk
• Java
• C++
• Eiffel
Guiado por Eventos:
Es un bucle continuo que responde a los eventos generados en un orden no predecible. Los eventos se llaman a partir de un click.
Algunos lenguajes de programación imperativa
• Java
• Visual Basic
Paradigmas Declarativos :
Apareció como un paradigma independiente, en los años 60’s.
No se centra en como haces las cosas si no en los resultados de las cosas.
Característica esencial:
Los cálculos se ven como una función matemática que hace corresponder entrada y salidas.
No hay notaciones implícitas de estado y por lo tanto, no hay necesidad de una instrucción de asignación.
Algunos lenguajes de programación imperativa:
• LISP
• Haskell
Programación lógica:
Es un paradigma basado en la lógica de primer orden. A partir de una expresión tu deduces cosas.
Ejemplo. :
• Todos los hombres son mortales.
• Sócrates es un hombre.
• Sócrates es Mortal.
• LOGICA!!!
Tipo de programación declarativa, no se indican como se hacen las cosas……
Algunos lenguajes de programación imperativa:
• Prolog
Inteligencia Artificial: :
Se dedica al desarrollo de programas que imitan el comportamiento de la inteligencia humana, la deducción lógica y la cognición.
• Es una combinación de constantes, variables y funciones.
Están compuesta por operadores, operandos, paréntesis y llamadas a funciones.
• Unarios: cuando tiene un solo operando. Son prefijos o sufijos
• Binarios: 2 operandos. Son operadores infijos
• Trinarios: 3 Operandos
Orden de la evaluación de los operadores
• Reglas de procedencia: el orden de como iras resolviendo la ecuación.
• Reglas de Asociatividad: si solo quedan de + y – se van de izq. a derecha
• Uso de Parentesis: son los primeros que se llevan a cabo.
Tres reglas de prioridad a seguir:
1. Paréntesis
2. Seguir orden de prioridad de operadores
3. De izquierda a derecha
Expresiones:
secuencias de constantes y/o variables se paradas por operadores válidos.
En caso de paréntesis anidados. De adentro hacia afuera.
Se basa en el cálculo Lambda. Es un lenguaje abstracto. Es un sistema formal diseñado para investigar la definición de función.
La noción de aplicaciones. Simplemente sustitución de variables.
Se dice que es universal porque cualquier función computable puede ser expresada y evaluada a través de el.
Es equivalente a las máquinas de Turing.
Lenguaje Haskell, es un lenguaje funcional puro. De propósito general.
Programación Funcional
• Puros, eliminan la noción celda de una variable. Si la variable indica un valor inmutable
• Impuros, Mantienen un tipo de valor de asignación.
• No tiene noción de estado. El valor de una función como Square, depende de parámetros.
• Transparencia referencial: el programa ignora lo que se hiso antes y no afecta a nuevos cálculos.
• Impuros, Mantienen un tipo de valor de asignación.
• No tiene noción de estado. El valor de una función como Square, depende de parámetros.
• Transparencia referencial: el programa ignora lo que se hiso antes y no afecta a nuevos cálculos.
1. Suma 10 al número ingresado

2. Construye la función f(x)=2x en un archivo y cárgalo al interprete.
3. Construye la función g(xy)=x^2+y^2 y recarga el archivo
4. Construye la función h (x,y)=6x+ x^2+y^2 utilizando las funciones anteriores.

1. Nombre x y = if x>y then “es mayor” else “es menor”

2. Estructura if que evalué si X es divisible, si lo es va a imprimir “es divisible” si no “no es divisible”.

3. Si X es mayor que 50 y si lo es que le sume 20

4. Calcular promedio/media aritmética de 3 números

5. Calcular el volumen de una esfera

Estructura de datos que representa un conjunto de datos de un mismo tipo.
• Int, enteros
• Char, caracteres
• Bool, boleanos True y False
OJO: Las listas deben ser del mismo tipo
Agregar elementos a una lista
Agregar elementos a una lista
++ para agregar números al final
: para agregar al principio
Agregar la B al principio de “ienvenidos”

Let permite crear listas, ponerle un nombre y asociarlo con ese nombre.
!! para saber la posición de un elemento.
Definir una función que contenga 5 parámetros.
Su objetivo será la suma de todos con su valor correspondiente.
• 1er parámetro = $ 5
• 2do parámetro = $ 10
• 3er parámetro = $ 20
• 4to parámetro = $ 50
• 5to parámetro = $ 100
¡Suma de las monedas que insertaste!!!!
Lista en las Listas con !!

Longitud de la lista

Ver elementos de la lista (Length/head/tail/last/init)

Voltear valores de una lista

Tomar ciertos valores de la lista Take

Quitar valores de las listas

Máximos y mínimos de las listas

* Cálculos con listas
* Sum(+) y Producto(*)
* Preguntar por elementos de la lista (ALT96 comillas simples)
* Rangos
* Definir una función tal que “n” numero de primeros elementos de la lista se posicionen al final de la lista. n=2 Nota: agarrar n y te dirá cuantos elementos se irán al final.


* Definir una función que, aplicado a una lista, muestre el mínimo y el máximo de esa lista.

* Palíndromo (que se lee igual al derecho y al revés) Definir una función que verifique si una lista es un palíndromo

* Mostrar los elementos interiores de una lista. Dada la lista [40,20,3,5,7] mostrar solo los elementos interiores [20,3,5]

Idea principal:
Haskell incluye una sintaxis especial para representar de forma más compacta operaciones sobre listas.Ejemplos de listas intencionales
[f x | x <- xs]
Equivale a map f xs. De hecho, la notaci&oactue;n usada en el ejemplo anterior debe leerse como "Para cada elemento x de la lista xs, debe devolverse la aplicación de la función f a dicho valor x". La parte representada por "x <- xs" es lo que se denomina un generador, mientras que la parte "f x" es la expresión que se usa para cada elemento generado en la parte derecha. Realmente, podemos usar tantos generadores como sea necesario, como ilustra el siguiente ejemplo.
[(x,y) | x <- xs, y <- xs]
Debe leerse como "para cada elemento x de xs y para cada elemento y de ys, debemos devolver la pareja (x,y)". Nótese que lo que estamos haciendo no es algo equivalente a lo que hace la función zip. Lo que realmente se está haciendo es combinar cada posible elemento de la primera lista con cada posible elemento de la segunda. Es decir, si ejecutamos[(x,y) | x <- [1,3], y <- [2,5,8] ] obtendremos como resultado [(1,2),(1,5),(1,8),(3,2),(3,5),(3,8)].
Es decir, cada elemento de la primera lista se combina con cada elemento de la segunda, y el orden en el que se hace es exactamente el mostrado.
Además de poder utilizar múltiples generadores, podemos hacer que unos generadores dependan de otros. Por ejemplo, si ejecutamos [(x,y) | x <-[1,3], y<-[0..x]] obtendremos el resultado [(1,0),(1,1),(3,0),(3,1),(3,2),(3,3)]. La restricción que debe cumplirse es que un generador sólo puede utilizar variables que hayan sido introducidas por generadores que se encuentren más a la izquierda que él.
Además del uso de generadores,las listas intencionales permiten introducir restricciones que deben cumplir los elementos generadores. Por ejemplo, [x^2 | x <- [1..10], even x] debe leerse como: "para cada elemento x de la lista [1..10], si cumple la condición even x, entonces devolvemos x^2". Es decir, el resultado que devolvería sería [4,16,36,64,100]
El esquema general es:
[expresión | generador_o_restriccion, ..., generador_o_restriccion]
donde debe tenerse en cuenta que:
Un generador es de la forma: variable <- lista.
Una restricción es una expresión booleana definida sobre una serie de varialbes.
Una variable no se puede introducir más de una vez.
Un generador sólo puede depender de variables introducidas por generadores anteriores.
Una restricción sólo puede depender de variables introducidas por generadores anteriores.
Para reducir cómputos, es conveniente introducir las restricciones lo antes posible.
Errores típicos:
El orden de los generadores y de las restricciones es relevante: no puede usarse una variable hasta que no se ha introducido. Además, cuanto antes se introduzcan las restricciones más cómputos se ahorran.
• Dato compuesto donde cada componente puede ser de un tipo diferente
• Si v1, v2, ..., vn son valores con tipo t1, t2, ..., tn (respectivamente), entonces (v1,v2,...,vn) es una tupla con tipo (t1,t2,...,tn)

Let dupla
en cadena debe ser con (), las mismos campos y tipo de dato. (“uno”, 4) (“dos”,2)
fst (true, 4.8) snd (true, 4.8) Posiciones
Juntar dos listas: zip nombres estaturas (serían los nombres de las listas)
Numerar: Zip [1..] nombres (nombre de la lista)


Comando Show y Read
* Show : Transformar cualquier cosa a cadena de texto “ “.
* Read: Nos permite convertir a una variedad de tipos y show nomas a cadena de texto. Con read lo podemos hacer como queramos. El primer parámetro lo toma como si fuera del tipo del segundo dato.
Árboles
Es una estructura no lineal aciclica.
La Definición es Recursiva
Es una colección de valores {v1, v2, … vn}
Tal que:
- Si n=0 el árbol se dice vació
- En otro caso, existe un valor destacado que se denomina raíz (p.e v1), y los demás elementos forman parte de colecciones disjuntas que a su vez son arboles.
Estos arboles se llaman subárboles de raíz.
Elementos de un árbol
- Nodo , son los elementos
- Raíz del árbol, todos se dependen de el
- Nodo hoja, no contienen ningún subárbol
- Tamaño del árbol, numero de nodos
- Cada nodo no es una hoja si tiene descendiente.
- Cada nodo tiene asociado un antecesor o ascendiente llamado padre
- Todos los nodos tienen un solo padre excepto el raíz que no tiene padre
- Cada nodo tiene asociado un numero de nivel que se determina por la longitud del camino
Recorrido en Pre-Orden
(raíz, izquierdo, derecho).
Para recorrer un árbol binario no vacío en preorden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo de raíz:
- 1. Visite la raíz
- 2. Atraviese el sub-árbol izquierdo
- 3. Atraviese el sub-árbol derecho
Recorrido en In-Orden
(izquierdo, raíz, derecho).
Para recorrer un árbol binario no vacío en inorden (simétrico), hay que realizar las siguientes operaciones recursivamente en cada nodo:
- 1. Atraviese el sub-árbol izquierdo
- 2. Visite la raíz
- 3. Atraviese el sub-árbol derecho
Recorrido Post-Orden
(izquierdo, derecho, raíz).
Para recorrer un árbol binario no vacío en postorden, hay que realizar las siguientes operaciones recursivamente en cada nodo:
- 1. Atraviese el sub-árbol izquierdo
- 2. Atraviese el sub-árbol derecho
- 3. Visite la raíz
En general, la diferencia entre preorden, inorden y postorden es cuándo se recorre la raíz. En los tres, se recorre primero el sub-árbol izquierdo y luego el derecho.
- En preorden, la raíz se recorre antes que los recorridos de los subárboles izquierdo y derecho.
- En inorden, la raíz se recorre entre los recorridos de los árboles izquierdo y derecho.
- En postorden, la raíz se recorre después de los recorridos por el subárbol izquierdo y el derecho
Preorden (antes), inorden (en medio), postorden (después).

Listas Infinitas
Repeat para un
carácter o numero repeat 6
Prelude> repeat 6
[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
Cycle para listas
cycle [123456]
Prelude> cycle [123456]
[123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123
Replicate cuantas
veces quiere que se repita
replicate 8 123
Prelude> replicate 8 123
[123,123,123,123,123,123,123,123]
Tomar valores de la
lista infinita:
Take 5 ( repeat 3) ó take 22 (cycle “hola”)
Prelude> take 22 (cycle
"hola")
"holaholaholaholaholaho"
Estrategia
de Evaluación
Listas Infinitas
Repeat para un
carácter o numero repeat 6
Prelude> repeat 6
[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
Cycle para listas
cycle [123456]
Prelude> cycle [123456]
[123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123456,123
Replicate cuantas
veces quiere que se repita
replicate 8 123
Prelude> replicate 8 123
[123,123,123,123,123,123,123,123]
Tomar valores de la
lista infinita:
Take 5 ( repeat 3) ó take 22 (cycle “hola”)
Prelude> take 22 (cycle
"hola")
"holaholaholaholaholaho"
Estrategia de Evaluación
Listas Infinitas
· Repeat
· Cycle
· Replicate
Evaluación
Perezosa o por necesidad:
Es una estrategia de evaluación que retrasa el
cálculo de una expresión hasta que su calor sea necesario, y que también evita
repetir la evaluación en caso de ser necesaria en posteriores ocasiones.
Los
beneficios de la evaluación perezosa son:
· El incremento en el rendimiento al evitar
cálculos innecesarios, y en tratar condiciones de error al evaluar expresiones
compuestas.
· La capacidad de construir estructuras de datos
potencialmente infinitas.
· Al contrario de
la evaluación perezosa son Acapadores/Estrictas,
hace todos los cálculos.
o
Primo :: Int -> bool
o
Primo x = divisores x == [1,x]
Esta función es totalmente perezosa.
**Ejercicios **
Definición por Comprensión
Lista obteniendo cada elemento
según su posición
Lista :: [a] -> [a]
Lista xs = concat [replicate i x | (i x) <- zip [1..] xs ]
Hacer una lista [1,2,3,4]
1 . Zip =
[1,2,3] [9,8,7] input
Zip = [1,9] , [2,8], [3,7]] output
. i = 1 x=1
i = 2 x=2
. replicate
2 2
replicate 3 3
. concat =
[[1,2,3] , [1,2,3]] input
concat = [1,2,2,3,3,3…] output
Funcion ZIP, combina 2 listas.
Funcion CONCAT, es para concatenar, te vuelve a juntar las
listas.
Para el capitulo dos, se pidió un reporte y la realización de dos ejercicios.
Ejercicio 1. Crear el programa con 10 hechos. Y realizar una condición que arroje las posibles combinaciones.
Se declaran los hechos, formados por predicados y argumentos, para que se pongan todas las posibles combinaciones. Para ello, se le da una variable a animal(X), y para perro (X). Lo cual quiere decir que los perros, son animales y viceversa. Al correrlo. Se le da una variable diferente a cat y dog, X, Y, entonces, realiza las posibles combinaciones.
?-cat(X),dog(Y). y arroja el siguiente resultado.
Ejercicio 2. Se pone tal cual el código dado en el libro. En la parte de abajo, te está pidiendo que:
El programa pide cuatro cosas las cuales les muestro a continuación.
a)
All the mammals.
Se manda llamar: ?-animal(mammal,X,Y,Z).
b) All the carnivores that
are mammals.
Se manda llamar: ?-animal(mammal,X,carnivore,Z).
c) All the mammals with
stripes.
Se manda llamar: ?-animal(mammal,X,Y,stripes).
d) Whether there is a reptile
that has a mane
Se manda llamar: ?-animal(reptile,X,Y,mane).
Regla: Couple(X,Y):-person(X,male),person(Y,female).
Estas
declarando el predicado y se le asignan dos variables, indicando que “X” para
hombres y “Y” para mujeres.
Al
ejecutar el programa:
?-couple(X,Y).
se
obtiene lo siguiente:
Ejercicio: del siguiente código, utilizando operaciones, realizar combinaciones de quien sigue (chases) a quien, arroje los gatos, perros, large or small animales. para ello se utiliza el siguiente código.
Define and test a predicate which takes two arguments, both numbers, and calculates and outputs the following values:
a) the average b) square root of their product c) the larger of "a" and "b".
Se
deben declarar dos variables “A” y “B” para poder calcular la average. Se suman ambos valores y se
dividen entre dos, eso se almacena en la variable “C” y se imprime el
resultado. Para la Raíz, se pone sqrt
y la suma de las variables A y B, eso se almacena en la variable “D” e imprime
el resultado. Para el número mayor, se utiliza max para realizar la comparación, se almacena en la variable “E” e
imprime el resultado. Como se muestra en la siguiente imagen:

Se define el predicado
makelower/0, se utiliza el código ASCII para poder hacer la conversión de
mayúsculas a minúsculas.
Se
declara el proceso y los casos. Usamos el get0 para convertir el carácter de
entrada y utilizamos case(X,Y) para concluir el rango de ASCII . como se
muestra en la imagen del código. Después lo corremos con la sentencia:
?-makelower. Cuando aparece ( |: ) insertamos la frase o
palabra que queramos y prolog realiza la conversión a minúsculas, como se
muestra en la segunda imagen.





























