46.1 Introducción
Resolver problemas con lógica formal significa representar la información relevante mediante proposiciones, predicados, operadores y reglas de inferencia.
Este enfoque ayuda a detectar ambigüedades, contradicciones y casos no considerados antes de implementar una solución.
46.2 Método general
Un método práctico para resolver problemas con lógica formal es:
- Leer el problema completo.
- Identificar datos, condiciones y restricciones.
- Definir proposiciones o predicados.
- Traducir las reglas a expresiones lógicas.
- Aplicar equivalencias o reglas de inferencia.
- Analizar casos posibles.
- Traducir la solución a código o a una decisión clara.
46.3 Problema de permisos
Regla:
Un usuario puede editar si es administrador o si es autor del documento y el documento no está bloqueado.
Definimos:
- p: El usuario es administrador.
- q: El usuario es autor del documento.
- r: El documento está bloqueado.
Expresión lógica:
p ∨ (q ∧ ¬r)
46.4 Implementación del problema de permisos
const puedeEditar = esAdmin || (esAutor && !documentoBloqueado);
La estructura del código conserva la agrupación lógica de la regla original.
46.5 Análisis de casos
Una tabla parcial ayuda a revisar el comportamiento esperado.
| Admin |
Autor |
Bloqueado |
Puede editar |
| V |
F |
V |
V |
| F |
V |
F |
V |
| F |
V |
V |
F |
| F |
F |
F |
F |
46.6 Problema de formulario
Regla:
El formulario se puede enviar si todos los campos obligatorios son válidos y el usuario aceptó los términos.
En lógica:
TodosValidos ∧ AceptoTerminos
En código:
const todosValidos = camposObligatorios.every(campo => campo.valido);
const puedeEnviar = todosValidos && aceptoTerminos;
46.7 Problema con existencia
Regla:
Se debe mostrar una alerta si existe al menos un producto sin stock.
Forma lógica:
∃x (Producto(x) ∧ SinStock(x))
En código:
const mostrarAlerta = productos.some(producto => producto.stock === 0);
46.8 Detectar contradicciones
La lógica formal ayuda a detectar reglas imposibles.
Un cupón solo puede usarse por usuarios nuevos.
El mismo cupón solo puede usarse por usuarios recurrentes.
Si nadie puede ser nuevo y recurrente al mismo tiempo, las reglas son incompatibles.
Nuevo(x) ∧ Recurrente(x)
Si esas categorías son excluyentes, la condición es contradictoria.
46.9 Detectar reglas redundantes
También podemos encontrar reglas repetidas o innecesarias.
Puede acceder si está activo y tiene permiso y está activo.
La expresión:
Activo(x) ∧ TienePermiso(x) ∧ Activo(x)
se simplifica a:
Activo(x) ∧ TienePermiso(x)
46.10 Problema de inferencia
Supongamos estas reglas:
Si un pedido fue pagado, se genera factura.
Si se genera factura, se envía comprobante.
El pedido fue pagado.
Por silogismo hipotético y Modus Ponens podemos concluir que se envía comprobante.
46.11 Implementación de inferencia
const pedidoPagado = true;
if (pedidoPagado) {
const facturaGenerada = true;
if (facturaGenerada) {
console.log("Enviar comprobante");
}
}
El flujo del programa refleja una cadena de reglas lógicas.
46.12 Verificar cobertura de casos
Cuando resolvemos un problema, conviene revisar si todos los casos importantes están contemplados.
- ¿Qué pasa si una condición es falsa?
- ¿Qué ocurre con colecciones vacías?
- ¿Hay alternativas no consideradas?
- ¿Las reglas se contradicen?
- ¿Hay condiciones redundantes?
46.13 De la lógica a las pruebas
Una expresión lógica puede convertirse en casos de prueba.
p ∨ (q ∧ ¬r)
Casos importantes:
- p verdadero: debe permitir.
- p falso, q verdadero, r falso: debe permitir.
- p falso, q verdadero, r verdadero: debe rechazar.
- p falso, q falso: debe rechazar.
46.14 Errores comunes
- Programar una regla antes de formalizarla.
- No definir claramente las proposiciones o predicados.
- Ignorar el dominio de discurso.
- No revisar contradicciones o redundancias.
- No probar casos límite, como colecciones vacías o alternativas faltantes.
46.15 Qué debes recordar de este tema
- La lógica formal ayuda a modelar problemas con precisión.
- Primero se identifican datos, reglas y restricciones.
- Luego se traducen a expresiones lógicas.
- Las equivalencias e inferencias permiten simplificar y deducir conclusiones.
- La expresión lógica puede guiar la implementación y los casos de prueba.
46.16 Conclusión
Resolver problemas mediante lógica formal permite pasar de reglas informales a decisiones verificables. Esta práctica mejora la calidad de las condiciones, algoritmos y pruebas.
En el próximo tema estudiaremos álgebra booleana.