Las tablas de verdad son una herramienta fundamental de la lógica proposicional que permite visualizar todos los posibles resultados de una expresión lógica según los valores de sus variables. En programación, comprender las tablas de verdad es esencial para diseñar correctamente las condiciones de los flujos de control: sentencias if, bucles while y cualquier lógica de decisión que utilice operadores booleanos.
En esta guía completa estudiaremos las tablas de verdad de cada operador lógico —negación, conjunción, disyunción, disyunción exclusiva, condicional y bicondicional—, demostraremos las leyes de De Morgan con tablas y veremos cómo implementar todo esto en Java con ejemplos ejecutables. Al finalizar, serás capaz de construir, interpretar y aplicar tablas de verdad tanto en el ámbito teórico como en el código real.
📖 ¿Qué son las tablas de verdad?
Una tabla de verdad es una representación tabular que muestra el valor resultante de una proposición compuesta para cada combinación posible de valores de sus proposiciones simples. Cada fila de la tabla corresponde a un escenario distinto.
El número de filas de una tabla de verdad depende del número de variables (proposiciones simples) involucradas. Si hay n variables, la tabla tendrá 2n filas, ya que cada variable puede tomar dos valores: verdadero (1) o falso (0).
| Variables (n) | Filas (2n) | Ejemplo |
|---|---|---|
| 1 | 2 | NOT p |
| 2 | 4 | p AND q |
| 3 | 8 | p AND q OR r |
| 4 | 16 | p AND q OR r XOR s |
🔢 Valores lógicos: verdadero y falso
En lógica proposicional trabajamos con dos únicos valores que se conocen como valores de verdad:
| Valor | Símbolo numérico | En Java | Significado |
|---|---|---|---|
| Verdadero | 1 | true | La proposición se cumple |
| Falso | 0 | false | La proposición no se cumple |
A lo largo de este artículo usaremos indistintamente 1 y verdadero (true), así como 0 y falso (false). En Java, el tipo de dato que almacena estos valores es boolean.
🚫 Negación (NOT)
La negación es un operador unario que invierte el valor de verdad de una proposición. Si la proposición es verdadera, su negación es falsa, y viceversa. En lógica se representa como ¬p y en Java como !p.
📋 Tabla de verdad de la negación
| p | ¬p |
|---|---|
| 1 (true) | 0 (false) |
| 0 (false) | 1 (true) |
▶️ Ejemplo en Java
boolean p = true;
System.out.println("p = " + p); // p = true
System.out.println("NOT p = " + !p); // NOT p = false
boolean q = false;
System.out.println("q = " + q); // q = false
System.out.println("NOT q = " + !q); // NOT q = true
🔗 Conjunción (AND)
La conjunción es un operador binario que devuelve verdadero solo cuando ambas proposiciones son verdaderas. En lógica se representa como p ∧ q y en Java como p && q. Es el equivalente lógico de la palabra «y»: para que la proposición compuesta sea cierta, todas las partes deben serlo.
📋 Tabla de verdad de la conjunción
| p | q | p ∧ q |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
▶️ Ejemplo práctico: validación de acceso
// Un usuario accede solo si tiene credenciales válidas Y cuenta activa
boolean credencialesValidas = true;
boolean cuentaActiva = false;
boolean acceso = credencialesValidas && cuentaActiva;
System.out.println("Acceso permitido: " + acceso); // false
// Tabla de verdad completa generada por código
boolean[] valores = {true, false};
System.out.println("\n p\t q\t p AND q");
System.out.println("-----------------------------");
for (boolean p : valores) {
for (boolean q : valores) {
System.out.printf(" %s\t %s\t %s%n", p, q, (p && q));
}
}
🔀 Disyunción (OR)
La disyunción inclusiva devuelve verdadero cuando al menos una de las proposiciones es verdadera. Solo es falsa si ambas son falsas. En lógica se escribe p ∨ q y en Java p || q. Corresponde a la palabra «o» en sentido no excluyente.
📋 Tabla de verdad de la disyunción
| p | q | p ∨ q |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
▶️ Ejemplo práctico: sistema de alertas
// Se activa la alarma si hay humo O si la temperatura supera 60°C
boolean hayHumo = false;
boolean temperaturaAlta = true;
boolean activarAlarma = hayHumo || temperaturaAlta;
System.out.println("Alarma activada: " + activarAlarma); // true
// Tabla de verdad completa
boolean[] v = {true, false};
System.out.println("\n p\t q\t p OR q");
System.out.println("-----------------------------");
for (boolean p : v) {
for (boolean q : v) {
System.out.printf(" %s\t %s\t %s%n", p, q, (p || q));
}
}
⚡ Disyunción exclusiva (XOR)
La disyunción exclusiva (también llamada XOR o OR exclusivo) devuelve verdadero solo cuando los operandos son diferentes. Si ambos son verdaderos o ambos son falsos, el resultado es falso. En lógica se escribe p ⊕ q y en Java p ^ q.
📋 Tabla de verdad de XOR
| p | q | p ⊕ q |
|---|---|---|
| 1 | 1 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
▶️ Ejemplo práctico: sistema de turnos
// En un turno rotativo, exactamente uno de los dos empleados trabaja
boolean trabajaAna = true;
boolean trabajaCarlos = true;
boolean turnoValido = trabajaAna ^ trabajaCarlos;
System.out.println("Turno válido: " + turnoValido); // false (ambos a la vez)
trabajaCarlos = false;
turnoValido = trabajaAna ^ trabajaCarlos;
System.out.println("Turno válido: " + turnoValido); // true (solo uno)
➡️ Condicional (implicación)
El condicional o implicación lógica se lee como «si p entonces q» y se escribe p → q. La única combinación que produce un resultado falso es cuando el antecedente (p) es verdadero y el consecuente (q) es falso. Es decir, verdadero no puede implicar falso.
Aunque Java no tiene un operador específico para la implicación, esta se puede expresar como !p || q, que es su forma lógica equivalente.
📋 Tabla de verdad del condicional
| p | q | p → q |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 1 |
| 0 | 0 | 1 |
▶️ Ejemplo en Java
// Implicación: "Si estudias, entonces apruebas"
// En Java: !p || q (equivalente lógico de p → q)
boolean estudia = true;
boolean aprueba = false;
boolean implicacion = !estudia || aprueba;
System.out.println("Si estudia → aprueba: " + implicacion); // false
// La única combinación falsa: estudia=true, aprueba=false
// Todas las demás devuelven true
🔄 Bicondicional (doble implicación)
El bicondicional se lee «p si y solo si q» y se escribe p ↔ q. Devuelve verdadero cuando ambas proposiciones tienen el mismo valor (ambas verdaderas o ambas falsas). Es la negación del XOR.
En Java se puede expresar como p == q (cuando ambos operandos son boolean) o equivalentemente como !(p ^ q).
📋 Tabla de verdad del bicondicional
| p | q | p ↔ q |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |
p ↔ q = ¬(p ⊕ q).📊 Tabla resumen comparativa de todos los operadores
La siguiente tabla muestra los resultados de todos los operadores lógicos para cada combinación de valores. Es una referencia rápida muy útil:
| p | q | ¬p | p ∧ q | p ∨ q | p ⊕ q | p → q | p ↔ q |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
🧮 Leyes de De Morgan
Las leyes de De Morgan son dos equivalencias lógicas fundamentales que relacionan la negación con la conjunción y la disyunción. Son imprescindibles para simplificar condiciones en programación y para transformar expresiones lógicas.
🔹 Primera ley: negación de la conjunción
¬(p ∧ q) ≡ (¬p) ∨ (¬q)
«La negación de (p Y q) equivale a (NO p) O (NO q).»
| p | q | p ∧ q | ¬(p ∧ q) | ¬p | ¬q | (¬p) ∨ (¬q) |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 | 0 | 1 |
| 0 | 0 | 0 | 1 | 1 | 1 | 1 |
✅ Las columnas ¬(p ∧ q) y (¬p) ∨ (¬q) son idénticas en todas las filas. Queda demostrada la equivalencia.
🔹 Segunda ley: negación de la disyunción
¬(p ∨ q) ≡ (¬p) ∧ (¬q)
«La negación de (p O q) equivale a (NO p) Y (NO q).»
| p | q | p ∨ q | ¬(p ∨ q) | ¬p | ¬q | (¬p) ∧ (¬q) |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 | 0 | 0 |
| 0 | 0 | 0 | 1 | 1 | 1 | 1 |
✅ Nuevamente las columnas resultado coinciden. La segunda ley también queda demostrada.
▶️ Aplicación en Java
// Demostración de las leyes de De Morgan en Java
boolean[] valores = {true, false};
System.out.println("=== Primera Ley de De Morgan ===");
System.out.println(" p\t q\t !(p&&q)\t !p||!q");
for (boolean p : valores) {
for (boolean q : valores) {
boolean izq = !(p && q);
boolean der = !p || !q;
System.out.printf(" %s\t %s\t %s\t\t %s\t %s%n",
p, q, izq, der, izq == der ? "✓" : "✗");
}
}
System.out.println("\n=== Segunda Ley de De Morgan ===");
System.out.println(" p\t q\t !(p||q)\t !p&&!q");
for (boolean p : valores) {
for (boolean q : valores) {
boolean izq = !(p || q);
boolean der = !p && !q;
System.out.printf(" %s\t %s\t %s\t\t %s\t %s%n",
p, q, izq, der, izq == der ? "✓" : "✗");
}
}
!(edad >= 18 && tienePermiso) es equivalente a edad < 18 || !tienePermiso, que suele ser más fácil de entender.☕ Tablas de verdad en Java
Java no tiene un tipo «proposición» como tal, pero los operadores booleanos del lenguaje implementan exactamente las mismas operaciones lógicas. La siguiente tabla muestra la correspondencia entre la lógica formal y Java:
| Operación lógica | Símbolo formal | Operador Java | Cortocircuito |
|---|---|---|---|
| Negación | ¬p | !p | N/A (unario) |
| Conjunción | p ∧ q | p && q | Sí |
| Disyunción | p ∨ q | p || q | Sí |
| XOR | p ⊕ q | p ^ q | No |
| Condicional | p → q | !p || q | Sí (vía ||) |
| Bicondicional | p ↔ q | p == q | No |
▶️ Generador completo de tablas de verdad
El siguiente programa genera la tabla de verdad completa de todos los operadores para dos variables:
public class TablasDeVerdad {
public static void main(String[] args) {
boolean[] valores = {true, false};
System.out.println("╔═══════╦═══════╦══════╦══════╦══════╦══════╦════════╦═════════╗");
System.out.println("║ p ║ q ║ NOT ║ AND ║ OR ║ XOR ║ p→q ║ p↔q ║");
System.out.println("╠═══════╬═══════╬══════╬══════╬══════╬══════╬════════╬═════════╣");
for (boolean p : valores) {
for (boolean q : valores) {
System.out.printf("║ %-5s ║ %-5s ║ %-4s ║ %-4s ║ %-4s ║ %-4s ║ %-6s ║ %-7s ║%n",
p, q,
!p, // NOT p
p && q, // AND
p || q, // OR
p ^ q, // XOR
!p || q, // Condicional (p → q)
p == q // Bicondicional (p ↔ q)
);
}
}
System.out.println("╚═══════╩═══════╩══════╩══════╩══════╩══════╩════════╩═════════╝");
}
}
La salida del programa muestra una tabla formateada con bordes que permite verificar visualmente cada operador. Este tipo de programas es un excelente ejercicio para practicar bucles anidados y formateo de salida.
🏗️ Ejemplo integrador: validador de proposiciones
El siguiente programa combina todos los conceptos estudiados en un validador de proposiciones lógicas que: genera tablas de verdad, verifica equivalencias usando las leyes de De Morgan y clasifica fórmulas como tautologías, contradicciones o contingencias.
public class ValidadorProposiciones {
// Verificar si una fórmula es tautología (siempre verdadera)
public static boolean esTautologia(boolean[] resultados) {
for (boolean r : resultados) {
if (!r) return false;
}
return true;
}
// Verificar si es contradicción (siempre falsa)
public static boolean esContradiccion(boolean[] resultados) {
for (boolean r : resultados) {
if (r) return false;
}
return true;
}
// Verificar si dos fórmulas son equivalentes
public static boolean sonEquivalentes(boolean[] f1, boolean[] f2) {
if (f1.length != f2.length) return false;
for (int i = 0; i < f1.length; i++) {
if (f1[i] != f2[i]) return false;
}
return true;
}
public static void main(String[] args) {
boolean[] valores = {true, false};
// === Verificar: p OR NOT p (tautología esperada) ===
System.out.println("=== Fórmula: p ∨ ¬p ===");
boolean[] resultadosORNot = new boolean[2];
int idx = 0;
for (boolean p : valores) {
boolean resultado = p || !p;
resultadosORNot[idx++] = resultado;
System.out.printf(" p=%s → %s%n", p, resultado);
}
System.out.println("¿Tautología? " + esTautologia(resultadosORNot));
// === Verificar: p AND NOT p (contradicción esperada) ===
System.out.println("\n=== Fórmula: p ∧ ¬p ===");
boolean[] resultadosANDNot = new boolean[2];
idx = 0;
for (boolean p : valores) {
boolean resultado = p && !p;
resultadosANDNot[idx++] = resultado;
System.out.printf(" p=%s → %s%n", p, resultado);
}
System.out.println("¿Contradicción? " + esContradiccion(resultadosANDNot));
// === Verificar ley de De Morgan ===
System.out.println("\n=== Ley de De Morgan: ¬(p∧q) ≡ ¬p∨¬q ===");
boolean[] formula1 = new boolean[4];
boolean[] formula2 = new boolean[4];
idx = 0;
for (boolean p : valores) {
for (boolean q : valores) {
formula1[idx] = !(p && q);
formula2[idx] = !p || !q;
System.out.printf(" p=%s, q=%s → ¬(p∧q)=%s, ¬p∨¬q=%s%n",
p, q, formula1[idx], formula2[idx]);
idx++;
}
}
System.out.println("¿Equivalentes? " + sonEquivalentes(formula1, formula2));
// === Clasificar: (p → q) ∧ (q → p) ↔ (p ↔ q) ===
System.out.println("\n=== (p→q)∧(q→p) vs (p↔q) ===");
boolean[] f1 = new boolean[4];
boolean[] f2 = new boolean[4];
idx = 0;
for (boolean p : valores) {
for (boolean q : valores) {
f1[idx] = (!p || q) && (!q || p); // (p→q) ∧ (q→p)
f2[idx] = (p == q); // p ↔ q
System.out.printf(" p=%s, q=%s → F1=%s, F2=%s%n",
p, q, f1[idx], f2[idx]);
idx++;
}
}
System.out.println("¿Equivalentes? " + sonEquivalentes(f1, f2));
}
}
Este programa demuestra que p ∨ ¬p es una tautología (siempre verdadera), que p ∧ ¬p es una contradicción (siempre falsa), que la primera ley de De Morgan se cumple y que el bicondicional equivale a la doble implicación.
❌ Errores frecuentes
🔹 Error 1: confundir OR con XOR
Uno de los errores más comunes es asumir que OR es exclusivo (que solo uno puede ser verdadero). En lógica y en Java, OR es inclusivo: devuelve verdadero también cuando ambos operandos son verdaderos.
// ❌ Error: asumir que || es exclusivo boolean a = true, b = true; System.out.println(a || b); // true (no false) // ✅ Si necesitas exclusividad, usa XOR (^) System.out.println(a ^ b); // false
🔹 Error 2: aplicar De Morgan incorrectamente
Al aplicar las leyes de De Morgan, un error habitual es negar las proposiciones sin cambiar el operador (AND por OR o viceversa).
// ❌ Error: negar sin cambiar el operador // !(a && b) NO es igual a (!a && !b) boolean a = true, b = false; System.out.println(!(a && b)); // true System.out.println(!a && !b); // false ← ¡DIFERENTE! // ✅ Correcto: negar Y cambiar el operador System.out.println(!a || !b); // true ← Igual que !(a && b)
🔹 Error 3: olvidar que el condicional p→q es verdadero cuando p es falso
En el lenguaje natural, «si llueve entonces llevo paraguas» no dice nada sobre qué pasa si no llueve. En lógica formal, cuando el antecedente es falso, la implicación es vacíamente verdadera.
// p → q equivale a !p || q boolean llueve = false; boolean llevoParaguas = false; // ❌ Error: pensar que esto es false boolean implicacion = !llueve || llevoParaguas; System.out.println(implicacion); // true (verdad vacía)
📝 Ejercicios prácticos
Ejercicio 1: ¿Qué valores imprime?
Analiza el siguiente código y determina qué se imprimirá en cada línea sin ejecutarlo. Después verifica con la tabla de verdad correspondiente.
boolean x = true, y = false;
System.out.println("A: " + (x && y));
System.out.println("B: " + (x || y));
System.out.println("C: " + (!x || !y));
System.out.println("D: " + (x ^ y));
System.out.println("E: " + !(x && y));
System.out.println("F: " + (!x || y));
Ejercicio 2: Construir tabla de verdad de 3 variables
Escribe un programa Java que genere la tabla de verdad completa de la expresión: (p && q) || (!q && r). La tabla debe tener 8 filas (23 combinaciones).
Ejercicio 3: Demostrar una equivalencia
Demuestra mediante tabla de verdad que la expresión p → q (implicación) es equivalente a ¬q → ¬p (contrarecíproco). Implementa un programa Java que lo verifique automáticamente.
❓ Preguntas frecuentes sobre Tablas de verdad
Las dudas más comunes respondidas de forma clara y directa.
💬 Foro de discusión
¿Tienes dudas sobre Tablas de verdad? Comparte tu pregunta con la comunidad.
Todavía no hay mensajes. ¡Sé el primero en participar!