1 Conceptos Fundamentales
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
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 |
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]
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) | |
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.
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
% Hechos
padre(juan, pedro).
padre(pedro, maria).
% Regla
abuelo(X, Y) :- padre(X, Z), padre(Z, Y).
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]