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

Apuntes

CARRERA INGENIERIA EN SISTEMAS COMPUTACIONALES

MATERIA Programación Lógica y Funcional

CLAVE SCC-1019

UNIDAD 1 Conceptos Fundamentales

Nombre del Autor:

Mario Alfonso Lores Vázquez

Agosto 2013

Instituto Tecnológico de Cd. Victoria 1


Índice de contenido.

Unidad 1: Tema Página

Conceptos Fundamentales.
Introducción.
1.1 Estilos de Programación 5
1.2 Evaluación de expresiones 7
1.3 Definición de Funciones 10
1.4 Disciplina de tipos 13
1.5 Tipos de Datos 16
Glosario 20
Bibliografía 21

Índice de Figuras.

Unidad 1: Tema Página

Conceptos Fundamentales.
Figura 1 7
Figura 2 8
Figura 3 9
Figura 4 10
Figura 5 11

Instituto Tecnológico de Cd. Victoria 2


Unidad 1
Conceptos Fundamentales.
Introducción.
LA PROGRAMACIÓN LÓGICA ES UN TIPO DE PARADIGMAS DE PROGRAMACIÓN
DENTRO DEL PARADIGMA DE PROGRAMACIÓN DECLARATIVA. EL RESTO DE LOS
SUBPARADIGMAS DE PROGRAMACIÓN DENTRO DE LA PROGRAMACIÓN
DECLARATIVA SON: PROGRAMACIÓN FUNCIONAL, PROGRAMACIÓN BASADA EN
RESTRICCIONES, PROGRAMAS DSL (DE DOMINIO ESPECÍFICO) E HÍBRIDOS. LA
PROGRAMACIÓN LÓGICA GIRA EN TORNO AL CONCEPTO DE PREDICADO, O
RELACIÓN ENTRE ELEMENTOS. LA PROGRAMACIÓN FUNCIONAL SE BASA EN EL
CONCEPTO DE FUNCIÓN (QUE NO ES MÁS QUE UNA EVOLUCIÓN DE LOS
PREDICADOS), DE CORTE MÁS MATEMÁTICO.

Instituto Tecnológico de Cd. Victoria 3


1.1 Estilos de Programación
Los tipos o técnicas de programación son bastante variados, aunque puede que
muchos de los lectores sólo conozcan una metodología para realizar programas. En la
mayoría de los casos, las técnicas se centran en programación modular y
programación estructurada, pero existen otros tipos de programación. Los
explicaremos a lo largo del artículo.

Programaciónestructurada(PE)
La programación estructurada está compuesta por un conjunto de técnicas que han
ido evolucionando aumentando considerablemente la productividad del programa
reduciendo el tiempo de depuración y mantenimiento del mismo.

Esta programación estructurada utiliza un número limitado de estructuras de control,


reduciendo así considerablemente los errores.
Esta técnica incorpora:
Diseño descendente (top-dow): el problema se descompone en etapas o estructuras
jerárquicas.
•Recursos abstractos (simplicidad): consiste en descompones las acciones complejas
en otras más simples capaces de ser resueltas con mayor facilidad.
•Estructuras básicas: existen tres tipos de estructuras básicas:
◦Estructuras secuénciales: cada acción sigue a otra acción secuencialmente. La salida
de una acción es la entrada de otra.
◦Estructuras selectivas: en estas estructuras se evalúan las condiciones y en función
del resultado de las mismas se realizan unas acciones u otras. Se utilizan expresiones
lógicas.
Estructuras repetitivas: son secuencias de instrucciones que se repiten un número
determinado de veces.

Las principales ventajas de la programación estructurada son:


Instituto Tecnológico de Cd. Victoria 4
•Los programas son más fáciles de entender
•Se reduce la complejidad de las pruebas
•Aumenta la productividad del programador
•Los programas queden mejor documentados internamente.

Un programa está estructurado si posee un único punto de entrada y sólo uno de


salida, existen de "1 a n" caminos desde el principio hasta el fin del programa y por
último, que todas las instrucciones son ejecutables sin que aparezcan bucles infinitos.

Programaciónmodular
En la programación modular consta de varias secciones dividas de forma que
interactúan a través de llamadas a procedimientos, que integran el programa en su
totalidad.

En la programación modular, el programa principal coordina las llamadas a los


módulos secundarios y pasa los datos necesarios en forma de parámetros.
A su vez cada módulo puede contener sus propios datos y llamar a otros módulos o
funciones.

Programaciónorientadaaobjetos(POO)
Se trata de una técnica que aumenta considerablemente la velocidad de desarrollo de
los programas gracias a la reutilización de los objetos.

El elemento principal de la programación orientada a objetos es el objeto.


El objeto es un conjunto complejo de datos y programas que poseen estructura y
forman parte de una organización.
Un objeto contiene varios datos bien estructurados y pueden ser visibles o no
dependiendo del programador y las acciones del programa en ese momento.
El polimorfismo y la herencia son unas de sus principales características y por ello
dedicaremos más adelante un artículo exclusivamente a tratar estos dos términos.

Instituto Tecnológico de Cd. Victoria 5


Programaciónconcurrente
Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la
vez.
Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de
forma simultánea.
Se trata de una programación más lenta y laboriosa, obteniendo unos resultados
lentos en las acciones.

Programaciónfuncional
Se caracteriza principalmente por permitir declarar y llamar a funciones dentro de
otras funciones.

Programaciónlógica
Se suele utilizar en la inteligencia artificial y pequeños programas infantiles. Se trata
de una programación basada en el cálculo de predicados (una teoría matemática que
permite lograr que un ordenador basándose en hecho y reglas lógicas, pueda dar
soluciones inteligentes).

1.2 Evaluación de expresiones


En todos los lenguajes de programación se utilizan operadores para efectuar
operaciones aritméticas. Combinando las variables y constantes en expresiones
aritméticas por medio de funciones adecuadas.
Una expresión es un conjunto de datos o funciones unidos por operadores aritméticos,
los cuales se muestran en la siguiente tabla:
Operador Significado
+ Suma
- Resta
* Multiplicación
/ División
^ Exponenciación
Mod Modulo
Figura 1- Tabla Operadores

Instituto Tecnológico de Cd. Victoria 6


Expresiones Lógicas
En los programas con frecuencia debemos enfrentarnos con situaciones en las que se
deben proporcionar instrucciones alternativas que pueden o no ejecutarse,
dependiendo de los datos de entrada, reflejándose el cumplimiento o no de una
determinada condición.
Por ejemplo, supongamos que queremos diseñar un programa para calcular el salario
semanal de un empleado que trabaja por horas, la empresa paga una tasa de 1.5 la
tasa normal por todas las horas trabajadas mayores a 40. El algoritmo sería:
leer(tasa)
leer(Horas_trabajadas)
siHoras > 40 condición
entonces(se cumple la condición)
paga<- tasa * 40 + 1.5 * tasa *(horas - 40)
sino(no se cumple la condición)
paga< tasa * horas
fin_si

Si te das cuenta la solución del problema requiere el uso de estructuras de control


selectivas: si(if), entonces(then), sino(else). Para realizar el algoritmo anterior se
necesita realizar la pregunta: Son las horas trabajadas mayores a 40? Esto se realiza
mediante la evaluación de expresiones lógicas, comparando dos valores y utilizando
un operador de relación.
Una expresión lógica es una expresión que puede ser verdadera o falsa.

Operadores de Relación
Se utilizan para expresar condiciones y describen una relación entre 2 variables. El
conjunto de operaciones relacionales se muestran en la siguiente tabla.
Operador Significado
< Menor que
> Mayor que
= Igual a
>= Mayor o igual que
<= Menor o igual que
<> Distinto o diferente a
Figura 2- Tabla de Operadores de Relación

Instituto Tecnológico de Cd. Victoria 7


El resultado de una expresión lógica es un valor de tipo lógico: verdadero o falso.
Cuando se aplican a elementos de tipo carácter se verifican en orden alfabético,
tomando en cuenta el orden del código ASCII. De la siguiente manera:

0 < 1 <2 ...< 9


a < b <c ...< z
A < B <C ...< Z

Orden de Evaluación
Al incluir estos operadores con los operadores aritméticos, obtenemos este nuevo
orden de evaluación:

Prioridad Operador
1 Contenido de paréntesis()
2 *,/, div, mod
3 +, -
4 =, <, >, <=, >=, distinto a
Figura 3 – Tabla de Orden de Evaluación

Nota: usare el símbolo <> para especificar que el valor entre un operador debe ser
distinto o diferente a el otro operador. ;

Variables Lógicas
La expresión lógica más simple es una variable o constante lógica que puede
establecerse a valores verdadero (true) o falso (false).

Operadores Lógicos
Las expresiones lógicas pueden combinarse para formar expresiones más complejas
utilizando los operadores lógicos and, or y not. Estos se utilizan con constantes
lógicas.

Instituto Tecnológico de Cd. Victoria 8


[operando1] operador operando2

El operando1 según el tipo de operador puede no existir.

La operación and combina dos condiciones simples y produce un resultado verdadero


solo si los dos operandos son verdaderos. La operación or es verdadera si uno de los
dos operandos es verdadero. La operación not actúa sobre una sola condición simple
u operando y simplemente niega (o invierte) su valor. Esto se describe más fácilmente
usando unas tablas denominadas 'tablas de verdad'.

Cuando la expresión lógica contiene varios tipos de operadores, es preciso seguir un


nuevo orden de precedencia o prioridad para obtener el valor final de la expresión.

Prioridad Operador
1 (exp), not
2 *, /, div, mod, and
3 +, -, or
4 <, <=, =, <>, >=
Figura 4- Tabla de Operadores Lógicos

1.3 Definición de funciones


El concepto de función en programación se fundamenta en el concepto de función
matemática.

Una función, desde el punto de vista de la programación, se define como un proceso


que recibe valores de entrada (llamados argumentos) y el cual retoma un valor
resultado. Adicionalmente, las funciones son sub-programas dentro de un programa
que se pueden invocar (ejecutar), desde cualquier parte del programa, es decir otra
función, desde la misma función o desde el programa principal cuantas veces sean
necesario.

Instituto Tecnológico de Cd. Victoria 9


Las funciones se usan cuando existen dos o más porciones de algoritmo dentro de un
programa que son iguales o muy similares, por ejemplo, en un algoritmo se pude
emplear varias veces una porción de algoritmo que eleva a una potencia dada un
número real. De esta manera se define una función que al ser invocada ejecute dicho
código, y en el lugar donde estaba la porción de algoritmo original, se hace llamado
(ejecución) de la función creada.

Una función se declara de la siguiente manera:

Figura 5- Función

Donde,

 Nombre: es el nombre de la función.


 Arg!: es nombre del argumento ¡-esimo de la función.
 Tipo!: es el tipo del ¡-esimo de la función.
 Tipo: es el tipo de dato que retoma la función.
 <declaraciones>: es el conjunto de variables definidas para la función (diferentes a los
argumentos).
 <instrucciones>: es el conjunto de instrucciones que se realiza la función.
 <valor>: es el valor o una expresión que dé como resultado un dato del tipo de
retorno.

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)

Instituto Tecnológico de Cd. Victoria 10


, (-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
>.
En la definición de la función formula ABC se encuentran las expresiones sqrt(b*b-
4.0*a*c) y (2.0*a) dos veces. Esto da mucho trabajo para teclear, pero calcular estas
expresiones exige también demasiado tiempo: se calcula dos veces la misma
expresión. Para evitar eso, se puede dar (en Gofer) un nombre a (sub)expresiones. La
definición mejorada serıa formula ABC’:
Una función se declara de la siguiente manera:

Formula ABC’ a b c = [ (-b+d)/n


, (-b-d)/n
]
where d = sqrt (b*b-4.0*a*c)
n = 2.0*a

Instituto Tecnológico de Cd. Victoria 11


Con la opción de estadística del interprete (el comando :set +s) se puede ver la
diferencia muy bien:

? formulaABC’ 1.0 1.0 0.0


[0.0, -1.0]
(18 reductions, 66 cells)
? formulaABC 1.0 1.0 0.0
[0.0, -1.0]
(24 reductions, 84 cells)

1.4 Disciplina de tipos


En los lenguajes de programación con disciplina de tipo, cada tipo representan 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 enviar 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 reconocer
en tiempo de compilación. Un programa bien tipado se puede utilizar sin
efectuar comprobaciones de tipo en tipo en tiempo de ejecución, estado
garantizado que no se producirán errores de tipo durante el cómputo. En
particular, el tipo de los resultados calculados por programas bien tipos
siempre es el previsto.
 Polimorfismo: Un programa bien tipado puede incluir definiciones de
funciones polimórficas. El 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.

Inferencia de tipos

El problema de la inferencia de tipos se puede formular del siguiente modo: calcular el


tipo Τ de una expresión dada 𝓮, suponiendo que los identificadores 𝑥𝑖 que aparezcan
libres en 𝓮 tengan tipos 𝑇𝑖 . Vamos a utilizar la notificación Τ ⊢ 𝓮 ∶ : 𝜯 para indicar que
es posible inferir el tipo Τ para la expresión 𝓮, bajo los supuestos 𝑥𝑖 ∶ : 𝑇𝑖 incluidos en
el conjunto 𝛵. Por ejemplo:
(a) {𝑥 ∶: 𝐼𝑛𝑡, 0 ∶: 𝐼𝑛𝑡, (>) ∷ 𝐼𝑛𝑡 → 𝐼𝑛𝑡 → 𝐵𝑜𝑜}

Instituto Tecnológico de Cd. Victoria 12


⊢ 𝑥 > 0 ∶: 𝐵𝑜𝑜𝑙
(b) {𝑥 ∶: 𝑎} ˫ (𝑥, 𝑥) ∷ (𝑎, 𝑎)

(c) { } ⊢\𝑥 → 𝑥 ∶ : ∀𝑎 (𝑎 → 𝑎)

En el ítem (c) del ejemplo, la cuantificación universal ∀𝑎 indica que en el tipo inferido
𝑎 → 𝑎 el patrón a se puede sustituir por cualquier tipo concreto. En cambio, en el ítem
(b) el tipo inferido no se puede generalizar a ∀𝑎 (𝑎, 𝑎), porque la inferencia depende
del supuesto de que se tenga 𝑥 ∶: 𝑎.

El ejemplo motiva que al formular reglas de inferencia de tipos es necesario indicar


explícitamente (por medio de una cuantificación universal) aquellos parámetros de un
tipo que se pueden particularizar reemplazándolos por tipos concretos cualesquiera.
Con esta motivación, en el aparato siguiente vamos a distinguir entre los tipos simples
ya introducidos, y los tipos genéricos que incluyen parámetros cuantificados
universalmente.

Tipos simples y genéricos

Llamaremos tipos simples a cualquier tipo 𝜯que se pueda formar utilizando las
siguientes reglas en BNF:

𝛵 ∶≔ 𝑎

| 𝑇𝑃

| (𝑇1, … , 𝑇𝑛)

| (𝑇1 → 𝑇)

Recordamos que al escribir tipos simples se abrevian la sintaxis aceptando el


convenio de que -> asocia por la derecha. Por ejemplo, lo que sigue son tres tipos
simples escritos en notación abreviadas:
(𝐼𝑛𝑡, 𝐵𝑜𝑜𝑙) (𝑎, 𝑏) 𝐼𝑛𝑡 → 𝐼𝑛𝑡 → 𝐵𝑜𝑙𝑙 (𝑎 → 𝑎) → 𝑎 → 𝑎

Por otra parte, llamaremos tipos genéricos a cualquier tipo S que tenga una de las dos
formas siguientes:

 Un tipo simple𝜯.
 Un tipo de la forma ∀𝑎𝑆1, siendo 𝑆1 otro tipo genérico.

Es decir, un tipo genérico siempre es de la forma ∀𝑎1 … ∀𝑎𝑛 𝑇, siendo 𝑛 ≥ 0 y 𝑇 un


tipo simple. En un tipo genérico 𝑆, las cuantificaciones universales ∀𝑎𝑖 indican
parámetros 𝑎𝑖 que pueden reemplazar por tipos simples cualquiera, mientras que los
parámetros que aparezcan en S sin estar afectados por ninguna cuantificación
universal se suponen “congelados”. Por ejemplo, los siguientes tipos son genéricos,
pero no simples:

Instituto Tecnológico de Cd. Victoria 13


∀𝑎 𝑎 → 𝑎 ∀𝑎 (𝑎 → 𝑎) → 𝑎 → 𝑎
∀𝑎 (𝑎, 𝑏) → 𝑎 ∀𝑎 ∀𝑏 (𝑎, 𝑏) → (𝑏, 𝑎)

En lo que sigue, usaremos las notaciones 𝑇𝑆 y 𝑇𝐺 para referirnos al conjunto de todos


los tipos simples y al conjunto de todos los tipos genéricos, respectivamente.
Obsérvese que 𝑇𝑆 ⊂ 𝑇𝐺, ya que cualquier tipo simple es un caso particular de tipo
genérico, pero no a la inversa.

Los parámetros libres de un tipo genérico 𝑆1 son aquellos parámetros 𝑎 que


aparezcan dentro de 𝑆1 sin estar afectados por una cuantificación ∀𝑎.Usaremos la
notación 𝑆1 [𝑎−> 𝑇] para indicar el resultado de sustituir en el tipo genérico 𝑆1
todas las aplicaciones libres del parámetro 𝑎 por el tipo simple T, renombrando si es
necesario los parámetros cuantificados en S1 para evitar que los parámetros de T
queden capturados por una cuantificación después de la sustitución.

La operación de sustitución la vamos a utilizar para construir casos particulares de un


tipo genérico dado. Más concretamente, siempre que tengamos un tipo genérico 𝑆 ≡
∀𝑎 𝑆1 y un tipo simple T, entenderemos que la sustitución 𝑆1 [𝑎−> 𝑇] nos da un
tipo que es un 𝑐𝑎𝑠𝑜 𝑝𝑎𝑟𝑡𝑖𝑐𝑢𝑙𝑎𝑟 de 𝑆. por ejemplo, considerando 𝑆 ≡ ∀𝑎 ∀𝑏 (𝑎, 𝑏) →
(𝑏, 𝑎) , resulta que:

 ∀𝑏 (𝑎, 𝑏) → (𝑏, 𝑎)[𝑎−> 𝑇] ≡

∀𝑏 (𝐼𝑛𝑡, 𝑏) → (𝑏, 𝐼𝑛𝑡)es un caso particular de S.

 ∀𝑏 (𝑎, 𝑏) → (𝑏, 𝑎)[𝑎 → (𝑏, 𝑏)] ≡


∀𝑐 ((𝑏, 𝑏), 𝑐) → (𝑐, (𝑏, 𝑏))es otro caso particular de S.

Inferencia de tipos en Haskell

Los lenguajes de programación con disciplina estática de tipos siempre comprueban


que no hay errores de tipo en un programa antes de ejecutarlo. En particular, las
implementaciones de Haskell utilizan un algoritmo basado en las reglas de inferencia
de tipos de Milner, con el fin de decidir si las funciones definidas dentro de un
programa dado admiten tipo. En caso afirmativo, el sistema infiere el tipo principal.
En el caso de que el usuario haya incluido declaraciones de tipo en el programa, el
sistema se encarga de comprobar que ésta sea consistente con los tipos inferidos. Si el
usuario no ha incluido declaraciones de tipo en el programa, el sistema las infiere por
sí mismo.

Además, dada cualquier expresión 𝓮, un usuario de Haskell puede solicitar el cálculo


del tipo principal de 𝓮mediante la orden : 𝑡𝑦𝑝𝑒 𝓮,que se puede abreviar como :𝑡 𝓮.
Para ejecutar dicha orden, el sistema aplica un algoritmo basado en las reglas de
inferencia de tipos a la expresión 𝑙𝑒𝑡𝑟𝑒𝑐 {𝑑𝑒𝑓1 ; … ; 𝑑𝑒𝑓𝑛 } in e, donde 𝑑𝑒𝑓; representa
las definiciones incluidas en el programa que esté cargado en el momento de
ejecutarse la orden.

Instituto Tecnológico de Cd. Victoria 14


Advertencia: los tipos calculados por Haskell son genéricos, pero el sistema las
muestras sin hacer explicita la cuantificación universal de los paramentos. En
cualquier tipo T que aparezca declarado en el texto de un programa Haskell, o que sea
calculando mediante la orden : 𝑡𝑦𝑝𝑒, hay que entender que todos los parámetros que
aparezcan en T llevan una cuantificación universal implícita. Por ejemplo, el intérprete
Hugs 98 calcula el tipo principal de la expresión \𝑥 → 𝑥 como sigue:

𝑃𝑟𝑒𝑙𝑢𝑑𝑒 >∶ 𝑡𝑦𝑝𝑒 \𝑥 → 𝑥

\𝑥 → 𝑥 ∶: 𝑎 → 𝑎

Y hay que entender que se trata del tipo genérico ∀𝑎 a → a.

1.5 Tipos de datos


Los datos en los programas pueden clasificarse de acuerdo con sus tipos. En otras
palabras, virtualmente todo valor de datos expresable en un lenguaje de
programación tiene implícito un tipo. Por ejemplo, en C el valor-1 es del tipo int,
3.14159 es del tipo doublé y “hello” es del tipo “matriz de char”. Por ejemplo

int x;

Lo que asigna el tipo de datos int a la variable x. En una declaración como ésta, un tipo
es sólo un nombre (en este casi la palabra clave int), aportando algunas propiedades,
como los valores que pueden almacenarse, y la forma en que esos valores se
representan internamente.

Algunas declaraciones asocian de manera 𝑖𝑚𝑝𝑙𝑖𝑐𝑖𝑡𝑎 un tipo con un nombre, en


la declaración de Pascal

const PI = 3.14159;

que de manera implícita le da a la constante PI el tipo de dato real, o en el caso de la


declaración ML

val x = 2;

que implícitamente el da a la constante x el tipo de datos int.

Dado que la representación interna es una característica dependiente del sistema,


desde el punto de vista abstracto, podemos considerar que un nombre de tipo de
representa los valores posibles que una variable de dicho tipo puede contener. Incluso
de manera más abstracta, podemos considerar el nombre del tipo como esencialmente
idéntico al conjunto de valores que representa, y podemos enunciar lo siguiente:

Instituto Tecnológico de Cd. Victoria 15


Definición 1. Un tipo de datos es un conjunto de valores.

Por lo que la declaración de x como un int dice que el valor de x debe estar en el
conjunto de enteros definidos por el lenguaje (y por la implementación), o, en
terminología matemática (utilizada ∈ como membresía), la declaración

int x;

quiere decir lo mismo que

valor de x∈ 𝐼𝑛𝑡𝑒𝑔𝑒𝑟𝑠

donde 𝐼𝑛𝑡𝑒𝑔𝑒𝑟𝑠 es el conjunto de enteros como se define en el lenguaje y en la


implementación (en Java, por ejemplo, este conjunto siempre es de enteros desde -
2,147,483,648 hasta 2,147,483,647, dado que los enteros siempre se almacenan en
forma de complementos a dos de 32 bits).

Puede especificarse de muchas formas un tipo de datos como un conjunto: puede


listarse o enumerarse explícitamente; o puede dársele como un subrango de valores
por otra parte conocidos; o puede tomarse prestado de su definición. Los ejemplos
que pueden mencionarse incluyen las operaciones aritméticas sobre enteros o reales,
la operación de subíndice “[]” sobre los arreglos, y el operador de miembros
estructural “.” En los tipos de estructura o de registro. Estas operaciones también
tienen propiedades específicas, que pueden o no quedar enunciadas de manera
explícita [por ejemplo, (x + 1) – 1 = x o x + y = y + x]. Por lo que para ser incluso más
precisos, revisamos nuestra primera definición con la finalidad de incluir de manera
explícita las operaciones, como en la definición que sigue:

Definición 2. Un tipo de datos es un conjunto de valores, junto con un conjunto de


operaciones sobre dichos valores con ciertas propiedades.

La asignación de tipos a los datos tiene dos objetivos principales:

Por un lado, detectar errores en las operaciones.

Por el otro, determinar cómo ejecutar estas operaciones.

Tipos estáticos

Casi todos los tipos de datos son estáticos, la excepción son los punteros y no se
tratarán debido a su complejidad.

Que un tipo de datos sea estático quiere decir que el tamaño que ocupa en memoria
no puede variar durante la ejecución del programa. Es decir, una vez declarada una

Instituto Tecnológico de Cd. Victoria 16


variable de un tipo determinado, a ésta se le asigna un trozo de memoria fijo, y este
trozo no se podrá aumentar ni disminuir.

Tipos dinámicos

Dentro de esta categoría entra solamente el tipo puntero. Este tipo te permite tener un
mayor control sobre la gestión de memoria en tus programas. Con ellos puedes
manejar el tamaño de tus variables en tiempo de ejecución, o sea, cuando el programa
se está ejecutando.

Los punteros quizás sean el concepto más complejo a la hora de aprender un lenguaje
de programación, sobre todo si es el primero que aprendes. Debido a esto, no lo
trataremos. Además, lenguajes que están muy de moda (por ejemplo Java) no
permiten al programador trabajar con punteros.

Tipos simples

Como su nombre indica son los tipos básicos en Pascal. Son los más sencillos y los más
fáciles de aprender. Por todo esto, serán en los que nos centremos.

Los tipos simples más básicos son: entero, lógico, carácter y real. Y la mayoría de los
lenguajes de programación los soportan, no como ocurre con los estructurados que
pueden variar de un lenguaje a otro.

Todo lenguaje contiene un conjunto de tipos predefinidos, a partir de los cuales se


construyen todos los demás tipos. Estos están generalmente especificados utilizando
palabras clave (como int o doublé en C++ o Java) o identificadores predefinidos (como
String o Process en Java). También a veces se predefinen las variaciones sobre los
tipos básicos, por ejemplo short, long, long doublé, unsingned int, etcétera, que
típicamente tienen propiedades especiales para los tipos numéricos.

Los tipos predefinidos son principalmente tipos simples: tipos que no tienen otra
estructura que su aritmética inherente o una estructura secuencial. Todos los tipos
que siguen, excepto String y Process, son simples. Sin embargo, existen tipos simples
que no están predefinidos: los tipos enumerados y los tipos de subrango, que
también son tipos simples.

Tipos estructurados

Mientras que una variable de un tipo simple sólo referencia a un elemento, los
estructurados se refieren a colecciones de elementos.

Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy
variadas: tenemos colecciones ordenadas que se representan mediante el tipo array,

Instituto Tecnológico de Cd. Victoria 17


colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen
otros tipos, son los llamados registros.

Tipos ordinales

Dentro de los tipos simples, los ordinales son los más abundantes. De un tipo se dice
que es ordinal porque el conjunto de valores que representa se puede contar, es decir,
podemos establecer una relación uno a uno entre sus elementos y el conjunto de los
números naturales.

Dentro de los tipos simples ordinales, los más importantes son:

 El tipo entero (integer)


 El tipo lógico (boolean)
 El tipo carácter (char)

Tipos no-ordinales

Simplificando, podríamos reducir los tipos simples no-ordinales al tipo real. Este tipo
nos sirve para declarar variables que pueden tomar valores dentro del conjunto de los
números reales.

A diferencia de los tipos ordinales, los no-ordinales no se pueden contar. No se puede


establecer una relación uno a uno entre ellos y los número naturales. Dicho de otra
forma, para que un conjunto se considere ordinal se tiene que poder calcular la
posición, el anterior elemento y el siguiente de un elemento cualquiera del conjunto.
¿Cuál es el sucesor de 5.12? Será 5.13, o 5.120, o 5.121,...

Instituto Tecnológico de Cd. Victoria 18


Glosario

Instituto Tecnológico de Cd. Victoria 19


Bibliografía:
http://www.desarrolloweb.com/articulos/2477.php

http://rodrigogu.super-red.es/fundamentos/tema6/expresiones_logicas.pdf

http://aplicaciones.virtual.unal.edu.co/drupal/files/Funciones%20y%20Procedimientos%20-
%20Programacion%20de%20computadores.pdf

http://teleformacion.edu.aytolacoruna.es/PASCAL/document/tipos.htm

Instituto Tecnológico de Cd. Victoria 20

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