46. Resolución de problemas mediante lógica formal

La lógica formal permite convertir problemas en reglas precisas, analizar casos posibles y obtener conclusiones verificables antes de escribir código.

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:

  1. Leer el problema completo.
  2. Identificar datos, condiciones y restricciones.
  3. Definir proposiciones o predicados.
  4. Traducir las reglas a expresiones lógicas.
  5. Aplicar equivalencias o reglas de inferencia.
  6. Analizar casos posibles.
  7. 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.