45. Traducción de lenguaje natural a expresiones lógicas

Traducir lenguaje natural a lógica permite convertir reglas ambiguas en expresiones precisas que pueden analizarse, verificarse y programarse.

45.1 Introducción

Muchas reglas comienzan escritas en lenguaje natural: requisitos, permisos, validaciones, restricciones o condiciones de negocio.

La lógica permite traducir esas frases a expresiones precisas, reduciendo ambigüedades antes de implementarlas en código.

45.2 Método general

Para traducir una frase a lógica:

  1. Identifica las proposiciones o predicados principales.
  2. Define el dominio de discurso si hay variables o cuantificadores.
  3. Detecta conectores: no, y, o, si... entonces, si y solo si.
  4. Identifica cuantificadores: todos, alguno, existe, ninguno.
  5. Agrega paréntesis para evitar ambigüedades.
  6. Verifica la expresión con ejemplos o contraejemplos.

45.3 Tabla de conectores

Lenguaje natural Símbolo lógico JavaScript
No p ¬p !p
p y q p ∧ q p && q
p o q p ∨ q p || q
Si p, entonces q p → q !p || q
p si y solo si q p ↔ q p === q

45.4 Ejemplo con conjunción

Frase:

El usuario puede comprar si hay stock y el pago fue aprobado.

Definimos:

  • p: Hay stock.
  • q: El pago fue aprobado.

Expresión:

p ∧ q
const puedeComprar = hayStock && pagoAprobado;

45.5 Ejemplo con disyunción

Frase:

El usuario puede acceder si es administrador o editor.

Expresión:

Administrador(x) ∨ Editor(x)
const puedeAcceder = esAdmin || esEditor;

45.6 Ejemplo con negación

Frase:

La cuenta no está bloqueada.

Si p significa "la cuenta está bloqueada", entonces:

¬p
const puedeIngresar = !cuentaBloqueada;

45.7 Ejemplo con implicación

Frase:

Si el usuario es menor de edad, debe tener autorización.

Definimos:

  • p: El usuario es menor de edad.
  • q: El usuario tiene autorización.

Expresión:

p → q
const reglaCumplida = !esMenorDeEdad || tieneAutorizacion;

45.8 Ejemplo con cuantificador universal

Frase:

Todos los usuarios activos pueden ingresar.

Forma lógica:

∀x (UsuarioActivo(x) → PuedeIngresar(x))

La implicación es importante: no afirma que todos los elementos sean usuarios activos, sino que los usuarios activos pueden ingresar.

45.9 Ejemplo con cuantificador existencial

Frase:

Existe un producto sin stock.

Forma lógica:

∃x (Producto(x) ∧ SinStock(x))

La conjunción indica que el mismo objeto es producto y está sin stock.

45.10 Ejemplo con negación de cuantificadores

Frase:

No todos los pedidos pagados tienen factura.

Primero:

¬∀x (Pagado(x) → TieneFactura(x))

Forma equivalente:

∃x (Pagado(x) ∧ ¬TieneFactura(x))

Se lee: existe un pedido pagado que no tiene factura.

45.11 Ambigüedad de "o"

La palabra "o" puede ser inclusiva o exclusiva según el contexto.

Frase Interpretación probable Operador
Puede acceder si es admin o editor Puede tener ambos roles OR inclusivo
Debe elegir entrega a domicilio o retiro en sucursal, pero no ambas Exactamente una opción XOR

45.12 Traducción a código

Una vez obtenida la expresión lógica, podemos llevarla a código.

∀x (ProductoPublicado(x) → TienePrecio(x))
const reglaCumplida = productos.every(producto =>
  !producto.publicado || producto.precio !== null
);

Usamos la equivalencia p → q ≡ ¬p ∨ q.

45.13 Verificar con casos

Después de traducir, conviene probar casos representativos.

  • Un producto publicado con precio debe cumplir la regla.
  • Un producto publicado sin precio debe violarla.
  • Un producto no publicado no debería violarla por no tener precio.

Esta verificación evita traducciones incorrectas.

45.14 Errores comunes

  • Traducir "todos los A son B" como ∀x (A(x) ∧ B(x)).
  • Traducir "existe un A que es B" con implicación en lugar de conjunción.
  • No definir el dominio de discurso.
  • Ignorar la ambigüedad de la palabra "o".
  • No usar paréntesis en expresiones con varios operadores.

45.15 Qué debes recordar de este tema

  • Traducir exige identificar proposiciones, predicados, operadores y cuantificadores.
  • "Todos los A son B" suele traducirse como ∀x (A(x) → B(x)).
  • "Existe un A que es B" suele traducirse como ∃x (A(x) ∧ B(x)).
  • La palabra "o" puede requerir OR inclusivo o XOR.
  • La traducción debe verificarse con casos concretos.

45.16 Conclusión

Traducir lenguaje natural a expresiones lógicas permite convertir reglas informales en fórmulas precisas. Esta habilidad es clave para programar condiciones correctas y analizar problemas formalmente.

En el próximo tema estudiaremos la resolución de problemas mediante lógica formal.