En este Blog se estará subiendo información acerca de la programación lógica y funcional, al igual que el código fuente de algunos programas en Haskell y C#.
domingo, 1 de mayo de 2016
viernes, 8 de abril de 2016
lunes, 7 de marzo de 2016
1.1 Estilos de programación
Estilos de programación.
Forma en que se le da forma al código fuente
Estilo de programación (también
llamado estándares de código o convención de código) es un término que describe
convenciones para escribir código fuente en ciertos lenguajes de programación.
El estilo de programación es frecuentemente dependiente del lenguaje de
programación que se haya elegido para escribir. Por ejemplo el estilo del
lenguaje de programación C variará con respecto al del lenguaje BASIC.
La programación
funcional es un estilo de programación que modela computaciones como la evaluación de las expresiones.
En
el proceso se lleva a cabo la compilación en el cual se transforma el código en algo que la maquina entiende.
ESTILO O MODELO
1.2 Evaluación de expresiones
Evaluación de expresiones
Las
expresiones se evalúan de acuerdo con la precedencia de los operadores. Ante una secuencia de operadores de igual
precedencia, la evaluación se realiza según el orden de escritura, de izquierda
a derecha. El orden de evaluación puede modificarse usando paréntesis.
Orden de
operadores:
1. Resolver
paréntesis, u otros símbolos. ( ) [
] { }
2. Resolver
exponentes o raíces.
3.
Multiplicación y división de izquierda a derecha.
4. Suma y
resta de izquierda a derecha.
Reducción de expresiones
La labor de un evaluador es calcular el resultado que se obtiene al
simplificar una expresión utilizando las definiciones de las funciones involucradas.
Una expresión se reduce sustituyendo, en la parte derecha de la
ecuación de la función, los Parámetros Formales o argumentos por los que
aparecen en la llamada(también llamados Parámetros Reales o Parámetros). Cuando
una expresión no pueda reducirse más, se dice que está en Forma Normal
ORDEN APLICATIVO
Se reduce
siempre el término MAS INTERNO (el más anidado en la expresión). En caso de que
existan varios términos a reducir (con la misma profundidad) se selecciona el
que aparece más a la izquierda de la expresión. Esto también se llama “paso de
parámetros por valor” , ya que ante una aplicación de una función, se reducen
primero los parámetros de la función.
ORDEN NORMAL
Consiste en
seleccionar el término MÁS EXTERNO (el menos anidado), y en caso de conflicto
el que aparezca más a la izquierda de la expresión. Esta estrategia se conoce
como “paso de parámetro por nombre o referencia”, ya que se pasan como
parámetros de las funciones expresiones en vez de valores.
Evaluación PEREZOSA o LENTA (Lazy)
No se evalúa
ningún elemento en ninguna función hasta que no sea necesario Las listas se
almacenan internamente en un formato no evaluado La evaluación perezosa
consiste en utilizar paso por nombre y recordar los valores de los argumentos
ya calculados para evitar recalcularlos. También se denomina estrategia de pasos
de parámetros por necesidad. Con una estrategia no estricta de la expresión
doble (doble 3), la expresión (3 + 3) se calcula dos veces.
1.3 Definición de funciones
Definición de funciones.
Una función
es una aplicación que toma uno o más argumentos y devuelve un valor.
Es una correspondencia en la que cada elemento
del dominio está relacionado con un único elemento de la imagen.
• Ejemplo de definición
de función en Haskell:
doble x = x * x
• Notación matemática: f(a, b) + cd
• Notación Haskell: f a b + c * d
• Los paréntesis se utilizan para
agrupar expresiones:
• Notación matemática: f(x, g (y))
• Notación Haskell: f x (g y)
Las definiciones se
incluyen en ficheros de texto. Se acostumbra a identificar dichos ficheros
mediante el sufijo .hs.
Los nombres de
funciones tienen que empezar por una letra en minúscula.
En Haskell la disposición
del texto del programa (el sangrado) delimita las definiciones mediante la
siguiente regla:
·
Una definición acaba con el primer trozo de código
con un margen izquierdo menor o igual que el del comienzo de la definición
actual.
·
Un comentario simple comienza con -- y se
extiende hasta el final de la línea.
·
Un comentario anidado comienza con {- y termina
en -}
máximo x y z=max x( max y z)
{- ejemplo de una definición y un comentario }
La manera más fácil de definir funciones es por combinación
de otras funciones:
fac n = product [1..n]
impar x = not (even x)
cuadrado x = x*x
suma_de_cuadrados lista = sum (map cuadrado lista)
Las funciones pueden tener más de un parámetro:
comb n k = fac n / (fac k * fac
(n-k))
formulaABC a b c = [ (-b+sqrt(b*b-4.0*a*c)) / (2.0*a)
, (-b-sqrt(b*b-4.0*a*c)) / (2.0*a)]
Las funciones sin parámetros se llaman
normalmente constantes:
pi = 3.1415926535
e = exp 1.0
Toda definición
de función tiene por tanto la siguiente forma:
• El nombre de la función
• Los
nombres de los parámetros (si existen)
• El símbolo
=
• una expresión, que puede contener los parámetros,
las funciones estándar y otras funciones definidas.
Una función
que tiene un valor booleano como resultado, tiene a la derecha del símbolo =
una expresión con un valor booleano:
negativo x = x < 0
positivo x = x
> 0
esCero
x = x
== 0
Note la
diferencia en el anterior ejemplo entre = y ==. El símbolo = separa la parte izquierda
de la parte derecha de la definición. El símbolo == es un operador, como < y >.
domingo, 6 de marzo de 2016
1.4 Disciplina de tipos
Disciplina de tipos
Los
tipos se infieren, es decir se comprueban, de forma estática, en tiempo de
compilación.
En
los lenguajes de programación con disciplina de tipos, cada tipo representa una
colección de valores (datos) similares. Una función cuyo tipo sea A1 ->… An
-> R espera n parámetros con tipos A1,…. An y devuelve un resultado de tipo
R. El conocer los tipos de las funciones ayuda a documentar los programas y a
evitar errores en tiempo de ejecución.
Haskell
y otros lenguajes funcionales utilizan el sistema de tipos de Milner, que tiene
dos características fundamentales:
Disciplina
estática de tipos:
Los
programas bien tipados se pueden conocer en tiempo de compilación. Un programa
bien tipado se puede utilizar sin efectuar comprobaciones de tipo en tiempo de
ejecución, estando garantizado que no se producirán errores de tipo durante el cómputo.
Polimorfismo:
Permite
que una misma función se pueda aplicar a parámetros de diferentes tipos,
dependiendo del contexto en el que la función se utilice.
Un
lenguaje tiene disciplina de tipos si los errores de tipos se detectan siempre es
necesario determinar los tipos de todos los operandos, ya sea en tiempo de
compilación o de ejecución.
1.5 Tipos de Datos
Tipos de Datos En lenguajes de programación un tipo de dato es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar.
Tipos de datos en Haskell
Los lenguajes
funcionales, en particular Haskell, tienen un rico conjunto de datos atómicos
predefinidos, tales como los numéricos int,
integer (de mayor precisión que
el anterior), float, double, etc., y además los tipos char y bool.
El sistema de tipos de
Haskell es uno de los más sofisticados que existen. Es un sistema polimórfico,
que permite una gran flexibilidad de programación, pero a la vez mantiene la
correctitud de los programas. Contrariamente a la mayoría de los lenguajes de programación
procedimentales actuales, Haskell utiliza un sistema de inferencias de tipos,
es decir sabe el tipo resultante de una expresión, por lo que las anotaciones
de tipo en un programa son opcionales.
La parte más
interesante de Haskell en relación con los tipos son los constructores, las
tuplas y las listas. Una tupla es un dato compuesto donde el tipo de cada
componente puede ser distinto. Una de las utilidades de este tipo de datos es
cuando una función tiene que devolver más de un valor:
predSuc :: Integer → (Integer,Integer)
predSuc x = (x-1,x+1)
Las listas son
colecciones de cero o más elementos de un mismo tipo (a diferencia de las
tuplas que pueden tenerlos de diferentes). Los operadores utilizados son el []
y (:). El primero representa una lista vacía, y el segundo denominado cons o constructor, permite añadir un
elemento al principio de una lista, construyendo la lista en función de agregar
elementos a la misma, por ejemplo.
4 : 2 : 3 : []
da lugar a la lista [4,
2, 3]. Su asociatividad es hacia la derecha. Un tipo particular de lista son
las cadenas de caracteres.
Para terminar diremos
que el constructor utilizado para declarar el tipo correspondiente a las
distintas funciones es el símbolo →.
Tipos de Datos en Hakell
Tipos de datos en C#
En la tabla siguiente se proporciona la lista de tipos de datos de C# y sus alias.
C# es un lenguaje con establecimiento inflexible de tipos. Antes de que un valor se pueda almacenar en una variable, se debe especificar el tipo de la variable, como en los ejemplos siguientes:
int a =1;
String cadena= "Hola Mundo";
Double num=3.12;....
viernes, 4 de marzo de 2016
Programas en haskell
PROGRAMAS EN HASKELL
Miguel Ángel Perez Velazquez
Miguel Ángel Perez Velazquez
practica 1:
suma x y=x+y ;suma de dos números
suma x y=x+y ;suma de dos números
resta x y=x-y ; resta de dos números
cubo x=x^3 ;cubo de un numero
pcuadrado l=l*4 ;perímetro de un cuadrado
arearec b a=b*a ;área de un rectángulo
areatri b a =(b*a)/2 ;área de un triangulo
maximo x y z=max x(max y z) ;comparación de que numero es mayor
Practica 2:
promedio a b c d=(a+b+c+d)/4 ;promedio de 4 números
iguales a b c=(a==b) &&(b==c) ;saber si tres números son iguales
diferentes a b c=(a/=b) &&(b/=c) ;saber si tres números son diferentes
areacir r =pi*r^2 ;área de un circulo
volesf r=4/3*pi*r^3 ; volumen de una esfera
Practica 2:
promedio a b c d=(a+b+c+d)/4 ;promedio de 4 números
iguales a b c=(a==b) &&(b==c) ;saber si tres números son iguales
diferentes a b c=(a/=b) &&(b/=c) ;saber si tres números son diferentes
areacir r =pi*r^2 ;área de un circulo
volesf r=4/3*pi*r^3 ; volumen de una esfera
Descarga los programas en Haskell y C#
Programas Haskell y C# (Bernardo Cruz)
1.- Suma de dos números
2.-Resta entre dos números
3.- Elevar un numero al cubo
4.-Sacar el perímetro de un cuadrado
5.-Sacar el perímetro de un rectángulo
6.-Calcular el área de un triangulo
7.-Calcular el máximo entre dos números
8.-Calcular la media de cuatro números
9.- Calcular el volumen de una esfera
10.-Verificar que 3 números sean iguales
11.-Verificar que 3 números sean diferentes
12.-Calcular el área de un circulo
suma x y=x+y
resta x y=x-y
cubo x= x*x*x
cuadrado x= x*4
rectangulo b h= b*h
triangulo b h= ((b*h)/2)
maximo x y z= max x(max y z)
media a b c d=(a+b+c+d)/4
volumen r=(4/3*pi)*(r^3)
igual n1 n2 n3= (n1==n2)&&(n2==n3)
diferente n1 n2 n3= (n1/=n2)&&(n2/=n3)
miércoles, 2 de marzo de 2016
Unidad 1: Conceptos Fundamentales
Lógica De
Programación: Base sobre la cual se sustenta la programación en sí.
Toda persona que pretenda construir un programa que dé solución a determinada problemática, se
enfrenta a dos grandes tareas:
El QUÉ: acciones a realizar para poder resolver el problema. Esta tarea forma parte del trabajo de mesa previo a toda actividad de programación.
El CÓMO: instrucciones
de las que se va a valer para escribir el código que realice las acciones determinadas en el QUÉ,
las cuales están determinadas por el lenguaje de programación seleccionado.
Muchas personas confunden la Programación con la Lógica de Programación, la primera involucra el conocimiento de técnicas e instrucciones de un determinado Lenguaje a través de los cuales se hace sencillo lograr
que la Computadora obtenga unos resultados mucho más rápidos
que una persona. La segunda involucra, de una manera técnica y organizada, los
conceptos que permiten diseñar en términos generales, la solución a problemas que pueden llegar a ser implementados a través
de una computadora.
Programación Lógica y Funcional |
Suscribirse a:
Entradas (Atom)