1 Conceptos Fundamentales


Programación Lógica y Funcional – IT Tehuacán

Instituto Tecnológico de Tehuacán

Ingeniería en Sistemas Computacionales | Programación Lógica y Funcional

Unidad 1: Análisis de Paradigmas y Conceptos Fundamentales

1. Análisis de Diferentes Estilos de Programación

Los paradigmas de programación son enfoques fundamentales para resolver problemas mediante código. Se dividen principalmente en dos grandes categorías:

Paradigma Imperativo

Se enfoca en CÓMO lograr un resultado mediante secuencias de instrucciones que modifican el estado del programa.

Ejemplos: C, Java, Python (estilo estándar).

Paradigma Declarativo

Se enfoca en QUÉ resultado se desea obtener, abstrayendo el control de flujo y las instrucciones explícitas.

Ejemplos: Haskell, Prolog, SQL.
Característica Imperativo (Estructurado/POO) Funcional (Declarativo) Lógico (Declarativo)
Estado Mutable (Variables cambian) Inmutable (Sin efectos secundarios) Basado en Hechos y Reglas
Mecanismo Central Bucles, Condicionales Recursión, Funciones de Alto Orden Unificación e Inferencia (Motor de búsqueda)
Transparencia Referencial Rara vez se cumple Garantizada siempre No aplica directamente
2. Evaluación de Expresiones

Define la estrategia mediante la cual los argumentos de una función o expresión son computados.

Evaluación Eager (Ambiciosa/Estricta)

Los argumentos se evalúan antes de pasar los valores a la función. Utilizada en la mayoría de lenguajes imperativos.

Evaluación Lazy (Perezosa/No Estricta)

Los argumentos se evalúan únicamente cuando se necesita su valor. Permite manejar estructuras de datos infinitas (característico de Haskell).

Ejemplo de Evaluación Lazy en Haskell:

-- Definición de una lista infinita de enteros empezando desde 1
enteros = [1..]

-- Toma únicamente los primeros 5 elementos de la lista infinita
primerosCinco = take 5 enteros  -- Resultado: [1, 2, 3, 4, 5]
3. Tipos de Datos y Disciplina de Tipos

La disciplina de tipos define las reglas para prevenir errores en tiempo de compilación o ejecución asignando categorías a los datos manipulados.

Categoría Estático Dinámico
Comprobación En tiempo de compilación (C, Java, Haskell) En tiempo de ejecución (Python, Lisp, Prolog)
Tipado Fuerte No permite conversiones implícitas no seguras (Ej. Haskell, Python)
Tipado Débil Permite conversiones de tipo implícitas automáticas (Ej. C, JavaScript)
4. Concepto Ampliado de Funciones

En el paradigma funcional, las funciones son tratadas como ciudadanos de primera clase (First-class citizens). Esto implica que pueden ser asignadas a variables, pasadas como parámetros y retornadas desde otras funciones.

  • Funciones de Alto Orden (Higher-Order Functions): Funciones que reciben o devuelven otras funciones (Ej. map, filter, fold).
  • Inmutabilidad: Los datos no cambian de valor; se crean nuevas estructuras modificadas a partir de las existentes.
  • Efectos Secundarios (Side Effects): En funciones puras, la entrada determina de forma única la salida sin alterar el estado externo.
Ejercicios Prácticos de Refuerzo
Ejercicio 1 (Haskell): Escribir una función recursiva para calcular el factorial de un número.
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
Ejercicio 2 (Prolog): Definir reglas lógicas para el parentesco simple (padre/hijo/abuelo).
% Hechos
padre(juan, pedro).
padre(pedro, maria).

% Regla
abuelo(X, Y) :- padre(X, Z), padre(Z, Y).
Ejercicio 3 (Funciones de Alto Orden – Haskell): Utilizar filter y una función lambda para filtrar los números pares de una lista.
obtenerPares :: [Int] -> [Int]
obtenerPares xs = filter (\x -> x `mod` 2 == 0) xs
-- Ejemplo de uso: obtenerPares [1..10] -> [2,4,6,8,10]
Examen de Conocimientos (15 Preguntas)

1. ¿Cuál es el enfoque principal del paradigma declarativo?

2. ¿Qué caracteriza a la evaluación perezosa (Lazy Evaluation)?

3. ¿Qué significa la Transparencia Referencial en programación funcional?

4. ¿Qué es un lenguaje fuertemente tipado?

5. ¿Cuál de los siguientes es un lenguaje emblemático del paradigma lógico?

6. ¿Qué es una función de alto orden (Higher-Order Function)?

7. La inferencia de tipos en lenguajes como Haskell permite:

8. ¿Qué ventaja ofrece la inmutabilidad de datos?

9. En el paradigma lógico, un «Hecho» representa:

10. ¿Qué se entiende por «Efecto Secundario» (Side Effect) en una función?

11. ¿Cuál es el mecanismo principal de iteración en programación funcional pura?

12. ¿En qué consiste el proceso de Unificación en Prolog?

13. La comprobación de tipos dinámicos se realiza durante:

14. ¿Qué función de alto orden transforma una lista aplicando una función a cada elemento?

15. ¿Qué característica permite el manejo de listas infinitas en Haskell?