Вы находитесь на странице: 1из 15

UNIDAD I. CONCEPTOS FUNDAMENTALES.

PROGRAMACIN LGICA Y
FUNCIONAL
UNIDAD I. CONCEPTOS
FUNDAMENTALES
INSTITUTO TECNOLOGICO SUPERIO DE
ACAYUCAN
INSTITUTO TECNOLOGICO SUPERIO
DE ACAYUCAN





UNIDAD I. CONCEPTOS FUNDAMENTALES.



ESTILOS DE PROGRAMACIN

Estilos o paradigmas de programacin; un paradigma dene un conjunto
de reglas, patrones y estilos de programacin que son usados por un
grupo de lenguajes de programacin


PARADIGMA ORIENTADO A OBJETOS

La Programacin Orientada a Objetos (POO u OOP segn sus siglas
en ingls) es un paradigma de programacin que usa objetos y sus
interacciones para disear aplicaciones y programas de
computadora. Est basado en varias tcnicas, incluyendo herencia,
modularidad, polimorfismo y encapsulamiento. Su uso se populariz
a principios de la dcada de 1990. Actualmente son muchos los
lenguajes de programacin que soportan la orientacin a objetos.

Ejemplo en Java








UNIDAD I. CONCEPTOS FUNDAMENTALES.



PARADIGMA LGICO


La computacin lgica direcciona mtodos de procesamiento
basados en el razonamiento formal. Los objetos de tales
razonamientos son "hechos" o reglas "if then". Para computar
lgicamente se utiliza un conjunto de tales estamentos para calcular
la verdad o falsedad de ese conjunto de estamentos. Un estamento
es un hecho si sus tuplas verifican una serie de operaciones. Un
hecho es una expresin en la que algn objeto o conjunto de objetos
satisface una relacin especfica. Una tupla es una lista inmutable.
Una tupla no puede modificarse de ningn modo despus de su
creacin. La computacin lgica est por tanto relacionada con la
automatizacin de algn conjunto de mtodos de inferencia, los
lenguajes son Prolog, Mercury, Oz.






PARADIGMA FUNCIONAL

Este paradigma concibe a la computacin como la evaluacin de
funciones matemticas y evita declarar y cambiar datos. En otras
palabras, hace hincapi en la aplicacin de las funciones y
composicin entre ellas, ms que en los cambios de estados y la
ejecucin secuencial de comandos (como lo hace el paradigma
procedimental). Permite resolver ciertos problemas de forma elegante
y los lenguajes puramente funcionales evitan los efectos secundarios
comunes en otro tipo de programaciones. Algunos de los lenguajes
basados en este paradigma: LISP, Scheme, Haskell, Scala,






UNIDAD I. CONCEPTOS FUNDAMENTALES.





EVALUACIN DE EXPRESIONES.
Expresin es una construccin que se evala para devolver un valor.

Construccin de expresiones


Literales y variables son expresiones primarias:

1.7 // Literal real de tipo double
sum // Variable
- Los literales se evalan a s mismos.
- Las variables se evalan a su valor.


Los operadores nos permiten combinar expresiones primarias y otras
expresiones formadas con operadores:
1 + 2 + 3*1.2 + (4 +8)/3.0
Los operadores se caracterizan por:
- El nmero de operandos (unarios, binarios o ternarios).
- El tipo de sus operandos (p.ej. numricos o booleanos).
- El tipo del valor que generan como resultado.






UNIDAD I. CONCEPTOS FUNDAMENTALES.




Operadores Unarios
Operador Descripcin
- Cambio de signo
! Operador NOT
~ Complemento a 1
++ Incremento en 1
-- Decremento en 1


Operadores Binarios
Operador Descripcin
+ - * / % Operadores aritmticos
== != < >
<= >= Operadores relacionales
&& || Operadores booleanos
& | "
<< >> >>> Operadores a nivel de bits
+ Concatenacin de cadenas



Tipos de los operandos
Operadores Descripcin Operandos Resultado
+ - * / % Operadores
aritmticos
Nmeros Nmero
= = ! = Operadores de
igualdad
Cualesquiera No aplica
== != < >
<= >=
Operadores de
comparacin
Nmeros o
caracteres
Booleano
&& || Operadores
booleanos
Booleanos Booleano
& | "
<< >> >>>
Operadores a nivel
de bits Enteros
Entero
+ Concatenacin de
cadenas
Cadenas Cadena





UNIDAD I. CONCEPTOS FUNDAMENTALES.


Sentencias de asignacin

Las sentencias de asignacin constituyen el
ingrediente bsico en la construccin de programas
con lenguajes imperativos.

Sintaxis:

<variable> = <expresin>;

Al ejecutar una sentencia de asignacin:
1. Se evala la expresin que aparece a la derecha
del operador de asignacin (=).
2. El valor que se obtiene como resultado de evaluar
la expresin se almacena en la variable que
aparece a la izquierda del operador de asignacin
(=).

Restriccin:

El tipo del valor que se obtiene como resultado de
evaluar la expresin ha de ser compatible con el tipo
de la variable.

Ejemplos
x = x + 1;
int mivariable = 20; // Declaracin con
inicializacin
otravariable = mivariable; // Sentencia de
asignacin






UNIDAD I. CONCEPTOS FUNDAMENTALES.


NOTA IMPORTANTE: Una sentencia de asignacin no es
una igualdad matemtica.

Nivel de Precedencia

Los delimitadores parntesis () son utilizados para darle
mayor nivel de precedencia a las expresiones. Es decir,
las expresiones entre parntesis son evaluadas primero.

Luego, el nivel de precedencia es como sigue:
++ --
/ %
+ -
Nota: Un mismo nivel de precedencia se evalua de
izquierda a derecha

Evaluacin de Expresiones


Para evaluar una expresin deben tenerse en cuenta las
siguientes reglas:


La prioridad de los operadores de mayor a menor es * / +
-
Las operaciones con igual prioridad se evalan de
izquierda a derecha
Al final de la operacin se efectan el resto de las
operaciones pendientes hasta que el contenedor de los
operadores quede vaco.

Ejemplo:



1 + 2 * 3
2*3 1 + 6 7
paso 1 paso 2 paso 3






UNIDAD I. CONCEPTOS FUNDAMENTALES.



(1+2) * 4 / 2

( 1 + 2 ) 3 * 4 12/2 6
paso 1 paso 2 paso 3 paso
4





(x + y + ) * (v + w)

R1 = x + y
R2 = R1 + z
R3 = v + w
R4 = R2 * R3

(3 + 4 + 1) * (2 + 2)

R1 = 3 + 4
R2 = 7 + 1
R3 = 2 + 2
R4 = 8 * 4
R5 = 32

a*b*c + d*e*f + g%h

R1 = a*b
R2 = R1*c
R3 = d*e
R4 = R3*f
R5 = g%h
R6 = R2 + R4 + R5

1*2*3 + 1*2*3 + 4%2

R1 = 1*2
R2 = 2*3
R3 = 1*2
R4 = 2*3
R5 = 4%2
R6 = 6 + 6 + 0
R7 = 12

(a * (b+c)) 2 * d + (4*e f)
R1 = b + c
R2 = a * R1
R3 = 4 * e
R4 = R3 f
R5 = 2 * d
R6 = R2 R5
R7 = R6 + R4

(2 * (1+1)) 2 * 1 + (4*3 4)
R1 = 1 + 1
R2 = 2 * 2
R3 = 4 * 3
R4 = 12 4
R5 = 2 * 1
R6 = 4 2
R7 = 2 + 8
R8 = 10






UNIDAD I. CONCEPTOS FUNDAMENTALES.


DEFINICIN DE FUNCIONES.
Una funcin: es un bloque de instrucciones que realiza tareas bien
definidas. Todo programa en C consta de una o ms funciones. La
ejecucin de un programa en C siempre comienza por la funcin.
Cuando se ejecuta una funcin el control pasa al punto donde esta
inicia. Una vez finalizada su ejecucin, se devuelve el control al
punto desde el que se hizo la llamada a la funcin.

Un procedimiento se llama as, en lenguaje Pascal, a un
subprograma que ejecuta unas ciertas acciones sin que valor
alguno de retorno est asociado a su nombre. En otras palabras:
Un procedimiento es una funcin que NO devuelve valores.

PARTES DE UNA FUNCIN

a) PROTOTIPO DE UNA FUNCIN. tiene la sintaxis:

tipo nombre(parmetro 1, parmetro 2, ...parmetro N);
donde :

tipo: es el tipo de valor devuelto por la funcin. Los
procedimientos son tipo void.

nombre: es el nombre de la funcin

parmetros: conjunto de argumentos, separados por
comas y encerrados entre parntesis. Los parmetros
son opcionales, en caso de que no se especifiquen,
enseguida del nombre de la funcin se escribe un par de
parntesis vacos. El prototipo de la funcin va seguido
de;


b) DEFINICIN DE LA FUNCIN: La definicin de la
funcin se hace despus de cerrar la llave de main. Est
formado por las siguientes partes:




UNIDAD I. CONCEPTOS FUNDAMENTALES.



Encabezado de la funcin. Es igual al prototipo pero no
termina con;



Cuerpo de la funcin. Entre llaves se declaran las
variables locales y luego se escriben las instrucciones. El
cuerpo de la funcin termina con la sentencia return()
que marca el final de la funcin. Slo se puede incluir
una expresin (variable u operacin) en la sentencia
return.


c) LLAMADA A LA FUNCIN. Es la ejecucin de la
Funcin. La funcin se realiza en el momento en que
desde el programa principal se hace referencia a su
nombre.



DISCIPLINA DE TIPOS.

Propsito de la disciplina de tipos

En los lenguajes de programacin con disciplina de tipos, cada
tipo representa una coleccin de valores (datos) similares. Una
funcin cuyo tipo sea Al -> . . . An -> R espera n parmetros
con tipos Al, . . . , 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 ejecucin.

Haskell y otros lenguajes funcionales utilizan el sistema de tipos
de Milner, que tiene dos caractersticas fundamentales:
Disciplina esttica de tipos: Los programas bien tipados se
pueden reconocer en tiempo de compilacin. Un programa
bien tipado se puede utilizar sin efectuar comprobaciones
de tipo en tiempo de ejecucin, estando garantizado que no
se producirn errores de tipo durante el cmputo. En




UNIDAD I. CONCEPTOS FUNDAMENTALES.


particular, el tipo de los resultados calculados por pro-
gramas bien tipados siempre es el previsto.
Polimorfismo: Un programa bien tipado puede incluir
definiciones de funciones. El polimorfismo permite que una
misma funcin se pueda aplicar a parmetros de diferentes
tipos, dependiendo del contexto en el que la funcin se
utilice.


Las reglas de inferencia de tipos, que permiten calcular el tipo
de las expresiones dadas, siempre que la expresin admita tipo
en el sistema de Milner. Estudiaremos adems las clases de
tipos, una extensin muy til del sistema de tipos de Milner, que
est soportada por el lenguaje Haskell.





UNIDAD I. CONCEPTOS FUNDAMENTALES.


TIPOS DE DATOS.

Valores numricos y booleanos
Los datos ms bsicos para cualquier problema de programacin son los
valores numricos y booleanos. En esta seccin estudiamos los tipos pre-
definidos que ofrece el lenguaje Haskell para manejar dichos valores.
Comenzamos considerando los principales tipos numricos disponibles.
Como criterio general, hay que tener en cuenta que todos los tipos
numricos existentes en Haskell, as como el tipo de los booleanos, son
ejemplares de las clases de tipos Eq, Ord, Read y Show. En particular, las
operaciones de comparacin (==), (/=), (<=), (<), (>=) y (>) se pueden
utilizar para comparar valores de cualquier tipo numrico, as como valores
booleanos. Las funciones max y min tambin se pueden aplicar a valores
de todos estos tipos.

Nmeros enteros

En Haskell existen dos tipos de nmeros enteros: el tipo Int de los enteros
de precisin limitada, y el tipo Integer de los enteros de precisin arbitraria.
En este curso usaremos preferentemente Int. Los valores de este tipo
comprenden los enteros negativos como -1057, el cero 0 y los enteros
positivos como 1782. El tipo Int es ejemplar de las clases Enum e Ix.
Adems, Int es ejemplar de Bounded, por lo cual las constantes
minBound y maxBound representan, respectivamente, el menor y el
mayor nmero de tipo Int soportado por el sistema. Los valores de estas
constantes son dependientes de la implementacin.


Para realizar clculos aritmticos con nmeros enteros, Haskell ofrece
un repertorio de operadores y funciones predefinidas:




UNIDAD I. CONCEPTOS FUNDAMENTALES.


+ ,* Operadores de adicin y multiplicacin
Operador de exponenciacin
Operador infijo de sustraccin;
operador prefijo de cambio de signo
div Funcin que calcula el cociente de la divisin entera
mod Funcin que calcula el resto de la divisin entera
abs Funcin que calcula el valor absoluto
negate Funcin que calcula el opuesto
signum Funcin que calcula el signo (-1, 0 o 1)

Los enteros no negativos (desde 0 inclusive en adelante) se llaman
nmeros naturales. En Haskell no existe un tipo de datos que contenga
nicamente los nmeros naturales. Sin embargo, en muchos casos se
utilizan funciones que solo estn definidas para los nmeros naturales.
Esto ocurre por ejemplo para las funciones definidas siguiendo los
esquemas de recursin simple y recursin final que hemos estudiado en la
seccin 1.3.

Nmeros fraccionarios de punto flotante

El tipo Float de Haskell agrupa a los nmeros fraccionarios con repre-
sentacin en el formato llamado de punto flotante, que tienen una precisin
limitada. Estos nmeros se pueden escribrir en notacin decimal, con parte
entera, punto decimal, parte fraccionaria y (si se desea) signo negativo:

0.0230879 -1025.37 409.347 -1512.0

Para escribir nmeros de tipo Float tambin se puede utilizar la llamada
notacin cientfica, indicando un exponente entero que puede ser positivo o
negativo, que se interpreta con respecto a la base 10. As:
507.43e5 equivale a 50743000.0
209.472e-7 equivale a 0.0209472
Asociadas al tipo Float, Haskell ofrece un repertorio de funciones pre-
definidas, que incluyen las operaciones aritmticas habituales. En
particular, hay un operador infijo de divisin / y dos operadores de
exponenciacin: para la exponenciacin con exponente entero, y ** para la
exponenciacin con exponente de tipo Float. Algunas otras funciones de
inters, junto con sus tipos, se muestran en la tabla siguiente:

13
Opuesto Valor
absoluto Signo (-1,
0 o 1) Conversin
Redondeo por
exceso Redondeo
por defecto
Redondeo
Raz cuadrada positiva
Potencia de e
Logaritmo con base e
Logaritmo con base
dada Aproximacin de
ir Funciones
trigonomtricas
Funciones
trigonomtricas
inversas

Nmeros fraccionarios de mayor precisin

La representacin interna de los nmeros de tipo Float impone un lmite
fijo al nmero de cifras sigificativas. Para clculos numricos que requieran
mayor precisin, Haskell ofre el tipo Double de los nmeros de punto
flotante con precisin doble, cuyo nmero de cifras significativas es el doble
que en el caso de los nmeros de tipo Float. Para clculos que requieran
precisin ilimitada, Haskell ofrece el tipo Rational, cuyos nmeros
equivalen a fracciones con numerador y denominador de tipo Integer.

La clase de tipos Num

Todos los tipos numricos de Haskell son ejemplares de la clase de tipos
predefinida Num, declarada en el preludio como sigue:

class (Eq a, Show a) => Num a where
(+), (-), (*)
negate abs,
signum
fromlntege
r fromlnt
a -> a -> a
a -> a a ->
a
Integer ->
a Int -> a

Conjunto suficiente de mtodos: todos, excepto negate o
(-)
x - y
fromln
t
negate
x
x + negate
y
fromlntegr
al 0 - x
negate Float
-
>
Float
abs Float
-
>
Float
signum Float
-
>
Int
romlnt Int -> Float
ceiling Float
-
>
Int
loor Float
-
>
Int
round Float
-
>
Int
sqrt Float
-
>
Float
exp Float
-
>
Float
log Float
-
>
Float
logBase Float
-
>
Float
Pi Float

sin, eos, tan Float
-
>
Float
asin, acos, atan Float
-
>
Float
-> Float

Lenguajes y Autmatas I MTI. Pamela Lizette Guadalupe Cerdn Valds



Como vemos, los mtodos propios de la clase Num incluyen las operaciones
binarias ( + ), (*) y (-), as como la operacin negate que calcula el opuesto de un
nmero de cualquier tipo. Gracias a estos mtodos, muchas funciones basadas en
operaciones aritmticas sencillas se pueden programar genricamente, con un
tipo cualificado por Num. Por ejemplo, la funcin que calcula el cubo de un
nmero admite un tipo cualificado:
cubo :: Num a => a -> a cubo x =
x*x*x
Ntense tambin los mtodos fromlnteger y fromlnt, que permiten convertir
nmeros enteros en valores de cualquier otro tipo numrico. Gracias a los
mtodos de la clase Num, Haskell puede interpretar expresiones construidas con (
+ ), (*), (-) y constantes enteras como valores de cualquier tipo numrico. Las
siguientes pruebas con el intrprete Hugs 98 ilustran este hecho:
Prelude> :type -1025 + 3*4 (-1025) +3*4 ::
Num a => a
Prelude> 1 / (-1025 + 3*4) -0.000987167
La segunda de las dos pruebas anteriores muestra que Haskell convierte
implcitamente el entero (-1025 + 3*4) a un valor numrico fraccionario, con el cual
tiene sentido la operacin de divisin (/). El mtodo fromlnteger hace posible la
conversin.

Smbolos tales como ( + ), (*), (-) y otros estn sobrecargados, ya que
representan diferentes operaciones en diferentes tipos numricos. A veces ocurre
que el uso de smbolos sobrecargados en una expresin causa ambigedades
que un intrprete o compilador no es capaz de resolver. En estos casos est
permitido emplear anotaciones de tipo, utilizando la sintaxis e : : T, que indica una
expresin e cuyo tipo se declara como T. Haskell admite expresiones de esta
forma en cualquier contexto, siempre que T no contradiga el tipo principal inferido
para e.

Por ejemplo, al evaluar la expresin (3 : : Float) + 2, Hugs 98 obtiene el resultado
5.0, ya que la anotacin (3 : : Float) fuerza al sistema a operar con nmeros
fraccionarios. En este caso, la expresin 3 + 2 no es ambiga, y se puede evaluar
tambin dando el resultado entero 5. En otros casos, las anotaciones de tipo son
esenciales para resolver ambigedades. Se pueden utilizar con cualquier tipo, no
solamente con tipos numricos.

Вам также может понравиться