Los predicados expresan propiedades o relaciones, y las variables permiten formular afirmaciones generales sobre objetos todavía no especificados.
En lógica de predicados, no tratamos las proposiciones como bloques indivisibles. En su lugar, analizamos de qué objetos hablamos y qué propiedades o relaciones les atribuimos.
Para eso usamos predicados y variables.
Un predicado es una expresión que representa una propiedad de un objeto o una relación entre varios objetos.
El primer predicado expresa una propiedad. El segundo expresa una relación entre dos elementos.
Un predicado unario se aplica a un solo objeto.
| Predicado | Lectura |
|---|---|
| Activo(x) | x está activo |
| Producto(x) | x es un producto |
| Par(x) | x es par |
| Valido(x) | x es válido |
Un predicado binario relaciona dos objetos.
| Predicado | Lectura |
|---|---|
| MayorQue(x, y) | x es mayor que y |
| Compra(usuario, producto) | el usuario compra el producto |
| Pertenece(pedido, cliente) | el pedido pertenece al cliente |
| AutorDe(usuario, documento) | el usuario es autor del documento |
También pueden existir predicados con tres o más argumentos.
Este predicado puede leerse como: el cliente recibe el producto en una dirección.
Una variable representa un objeto no especificado dentro de un predicado.
La letra x puede representar cualquier objeto del dominio que estemos considerando.
Una variable libre es una variable que no tiene un valor concreto ni está controlada por un cuantificador.
Esta expresión no es todavía una proposición completa, porque no sabemos qué objeto representa x.
Un predicado con variable puede convertirse en proposición de dos maneras principales:
| Expresión | ¿Es proposición? | Motivo |
|---|---|---|
| Activo(x) | No | x no tiene valor concreto |
| Activo(Ana) | Sí | Habla de un objeto concreto |
| ∀x Activo(x) | Sí | El cuantificador controla la variable |
Una función que devuelve un booleano puede verse como un predicado.
function esMayorDeEdad(usuario) {
return usuario.edad >= 18;
}
La función expresa una propiedad del objeto usuario.
Una función booleana con dos parámetros puede representar una relación.
function puedeEditar(usuario, documento) {
return usuario.id === documento.autorId || usuario.rol === "admin";
}
Esta función representa una relación entre un usuario y un documento.
Un buen nombre de predicado debe expresar claramente una propiedad o relación.
| Menos claro | Más claro |
|---|---|
| check(x) | EsValido(x) |
| user(x) | UsuarioActivo(x) |
| permiso(x, y) | PuedeEditar(x, y) |
| relacion(a, b) | PerteneceA(a, b) |
En programación, el tipo de dato esperado ayuda a definir correctamente un predicado.
function tieneStock(producto) {
return producto.stock > 0;
}
Este predicado tiene sentido si producto es un objeto con una propiedad stock.
Los predicados pueden combinarse con operadores lógicos.
Se lee: x es usuario y x está activo.
function usuarioActivo(x) {
return esUsuario(x) && x.activo;
}
Los predicados y variables permiten expresar propiedades y relaciones de manera flexible. Son la base para trabajar con cuantificadores, dominios de discurso y traducción de lenguaje natural a lógica formal.
En el próximo tema estudiaremos el dominio de discurso.