6. Lógica proposicional: Tautologías, contradicciones, formas normales, equivalencias e implicaciones lógicas y argumentaciones

Ejercicios resueltos

Ejercicio 1.

Dada las siguientes formas enunciativas:
	A: p ↑ (q ↔ r)
	B: (p → q) ⋀ (r ↓ (~q))
Calcular sus formas normales.

Solución:

Para calcular las formas normales de A primero introducimos la conectivas ↑ y ↔ que hemos definido en el capículo anterior

NAND[p_, q_] := ! (p && q)
Sii[a_, b_] := 
      Implies[a, b]  &&  Implies[b, a]
n = 3;
cadena = "";
cadena2 = "";
cad = "";
cad2 = "";
contradiccion = True;
tautologia = True;
p = Table[False, {t, n}];
expresion := 
        NAND[p[[1]], Sii[p[[2]], p[[3]]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
cad = ""; 
cad2 = "\
"; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True; 
If[f == n, 
              cad = StringJoin["p", ToString[f], cad], 
              cad = StringJoin["p", ToString[f], " ∧ ", cad]]; 
            If[f == n, 
              cad2 = StringJoin["(~p", ToString[f], ")", cad2], 
              cad2 = StringJoin["(~p", 
                  ToString[f], ")", " ∨ ", cad2]];, 
            p[[f]] = False; 
If[f == n, 
              cad = StringJoin["(~p", ToString[f], ")", cad], 
              cad = StringJoin["(~p", 
                  ToString[f], ")", " ∧ ", 
                  cad]]; 
If[f == n, 
              cad2 = StringJoin["p", ToString[f], cad2], 
              cad2 = StringJoin["p", ToString[f], " ∨ ", 
                  cad2]];];]; 
If[TrueQ[expresion], 
          If[cadena == "", 
            cadena = StringJoin[cadena, "(", cad, ")"], 
            cadena = 
              StringJoin[cadena, " ∨ (", 
                cad, ")"]]; 
contradiccion = False;, 
          If[cadena2 == "", 
            cadena2 = StringJoin[cadena2, "(", cad2, ")"], 
            cadena2 = 
              StringJoin[cadena2, " ∧ (", 
                cad2, ")"]]; 
tautologia = 
            False;];];
If[contradiccion, Print["Es una contradicción."], 
        Print["No es contradicción y la forma normal disyuntiva es: \
", cadena]];
If[tautologia, Print["Es una tautología."], 
        Print["No es tautología y la forma normal conmutativa es: \
", cadena2]];

Para las formas normales de B sólo hemos de definir la conectiva NOR[]:

NOR[p_, q_] := ! (p || q)
n = 3;
cadena = "";
cadena2 = "";
cad = "";
cad2 = "";
contradiccion = True;
tautologia = True;
p = Table[False, {t, n}];
expresion := 
        Implies[p[[1]], p[[2]]] && 
          NOR[p[[3]], ! p[[2]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
cad = ""; 
cad2 = "\
"; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True; 
If[f == n, 
              cad = StringJoin["p", ToString[f], cad], 
              cad = StringJoin["p", ToString[f], " ∧ ", cad]]; 
            If[f == n, 
              cad2 = StringJoin["(~p", ToString[f], ")", cad2], 
              cad2 = StringJoin["(~p", 
                  ToString[f], ")", " ∨ ", cad2]];, 
            p[[f]] = False; 
If[f == n, 
              cad = StringJoin["(~p", ToString[f], ")", cad], 
              cad = StringJoin["(~p", 
                  ToString[f], ")", " ∧ ", 
                  cad]]; 
If[f == n, 
              cad2 = StringJoin["p", ToString[f], cad2], 
              cad2 = StringJoin["p", ToString[f], " ∨ ", 
                  cad2]];];]; 
If[TrueQ[expresion], 
          If[cadena == "", 
            cadena = StringJoin[cadena, "(", cad, ")"], 
            cadena = 
              StringJoin[cadena, " ∨ (", 
                cad, ")"]]; 
contradiccion = False;, 
          If[cadena2 == "", 
            cadena2 = StringJoin[cadena2, "(", cad2, ")"], 
            cadena2 = 
              StringJoin[cadena2, " ∧ (", 
                cad2, ")"]]; 
tautologia = 
            False;];];
If[contradiccion, Print["Es una contradicción."], 
        Print["No es contradicción y la forma normal disyuntiva es: \
", cadena]];
If[tautologia, Print["Es una tautología."], 
        Print["No es tautología y la forma normal conmutativa es: \
", cadena2]];

Ejercicio 2.

Demostrar usando Mathematica que el conjunto {↑} y {↓} son conjuntos adecuados de conectivas.

Solución:

Para ver que el conjunto {↑} es un conjunto adecuado de conectivas hemos de probar que se tienen las siguientes equivalencias lógicas:
	a) (∼p) ⇔ (p ↑ p)
	b) (p ⋁ q) ⇔ (p ↑ p) ↑ (q ↑ q)
	c) (p ⋀ q) ⇔ (p ↑ q) ↑ (p ↑ q)
Veamos si lo son:

Sii[a_, b_] := Implies[a, b] && Implies[b, a];
NAND[p_, q_] := ! (p && q);
n = 1;
tautologia = True;
p = Table[False, {t, n}];
expresion = 
        Sii[! p[[1]], NAND[p[[1]], p[[1]]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

Por tanto, a) es una equivalencia lógica.

Sii[a_, b_] := Implies[a, b] && Implies[b, a];
NAND[p_, q_] := ! (p && q);
n = 2;
tautologia = True;
p = Table[False, {t, n}];
expresion = 
        Sii[p[[1]] || p[[2]], 
          NAND[NAND[p[[1]], p[[1]]], 
            NAND[p[[2]], p[[2]]]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

De esta forma deducimos que b) también es una equivalencia lógica.

Sii[a_, b_] := Implies[a, b] && Implies[b, a];
NAND[p_, q_] := ! (p && q);
n = 2;
tautologia = True;
p = Table[False, {t, n}];
expresion = 
        Sii[p[[1]] && p[[2]], 
          NAND[NAND[p[[1]], p[[2]]], 
            NAND[p[[1]], p[[2]]]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

Así c) también lo es y por tanto {↑} es un conjunto adecuado de conectivas.

De la misma forma podemos demostrar que el conjunto {↓} es un conjunto adecuado de conectivas. Para ello hemos de probar que:
	a) (∼p) ⇔ (p ↓ p)
	b) (p ⋀ q) ⇔ (p ↓ p) ↓ (q ↓ q)
	c) (p ⋁ q) ⇔ (p ↓ q) ↓ (p ↓ q)
son equivalencias lógicas. Veamoslo:

Sii[a_, b_] := Implies[a, b] && Implies[b, a];
NOR[p_, q_] := ! (p || q);
n = 1;
tautologia = True;
p = Table[False, {t, n}];
expresion = 
        Sii[! p[[1]], NOR[p[[1]], p[[1]]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

Por tanto, a) es una equivalencia lógica.

Sii[a_, b_] := Implies[a, b] && Implies[b, a];
NAND[p_, q_] := ! (p || q);
n = 2;
tautologia = True;
p = Table[False, {t, n}];
expresion = 
        Sii[p[[1]] || p[[2]], 
          NOR[NOR[p[[1]], p[[2]]], 
            NOR[p[[1]], p[[2]]]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

De esta forma deducimos que b) también es una equivalencia lógica.

Sii[a_, b_] := Implies[a, b] && Implies[b, a];
NAND[p_, q_] := ! (p || q);
n = 2;
tautologia = True;
p = Table[False, {t, n}];
expresion = 
        Sii[p[[1]] && p[[2]], 
          NOR[NOR[p[[1]], p[[1]]], 
            NOR[p[[2]], p[[2]]]]];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

Así c) también lo es y por tanto {↓} es un conjunto adecuado de conectivas.

Ejercicio 3.

Un famoso adivino fue preguntado por el número de alumnos que aprobaría la asignatura de Álgebra y dió las siguientes pistas:
	•  Si el alumno es hombre y nació en un mes par entonces aprobará el examen de teoría.
	•  Si el alumno es mujer y su DNI termina en 0, 3, 7, 8 o 9 entonces superará las prácticas.
	•  Si la edad del alumno es igual o superior a 20 años entonces superará las prácticas y no aprobará la teoría.
	•  El resto de alumnos aprobará sólo un de los dos exámenes, el de prácticas o el de teoría.
Sabiendo que para aprobar la asignatura de Álgebra hay que superar las prácticas y la teoría, ¿aprobará Álgebra un  alumno que nació en junio de 1975 y cuyo DNI termina en 9? ¿Y una alumna nacida en febrero de 1987 y con DNI 88256632?

Solución:

Primero hemos de simbolizar el enunciado anterior. Llamaremos:
	A = "El alumno es hombre"
	B = "El alumno nació en un mes par"
	C = "El alumno tiene DNI terminado en 0, 3, 7, 8 o 9"
	D = "La edad del alumno es igual o superior a 20 años"
	E = "El alumno aprobará el examen de teoría"
	F = "El alumno aprobará el examen de prácticas"
	G = "El alumno supera la asignatura de Álgebra"
Con estos nombres, lo que nos dijo el adivino se puede simbolizar mediante:
	(A ⋀ B) -> E
	((∼A) ⋀ C) -> F
	D -> (F ⋀ (∼E))
	((∼(A ⋀ B)) ⋀  (∼((∼A)⋀ C))⋀ (∼D)) -> ((E ⋁ F) ⋀ (∼(E ⋀F)))
	G ↔ (E ⋀ F)
Cada uno de estos enunciados, cambiando cada letra mayúscula por una variable de enunciado nos proporcionan las premisas de una forma argumentativa cuya conclusión vendrá dada por los datos de los alumnos para los que queremos ver si aprobarán o no la asignatura. Así para el primer alumno la forma argumentativa sería:
	A\(TraditionalForm\`\_1\):  (p ⋀ q) -> t
	A\(TraditionalForm\`\_2\):  ((∼p) ⋀ r) -> v
	A\(TraditionalForm\`\_3\):  s -> (v ⋀ (∼t))
	A\(TraditionalForm\`\_3\):  ((∼(p ⋀ q)) ⋀  (∼((∼p)⋀ r))⋀ (∼s)) -> ((t ⋁ v) ⋀ (∼(t ⋀v)))
	A\(TraditionalForm\`\_4\):  w ↔ (t ⋀ v)
       ∴  A :  (p ⋀q⋀ r ⋀ s) -> w
Para ver si esta forma argumentativa es o no valida veamos si la forma enunciativa (A\(TraditionalForm\`\_1\)⋀ A\(\(\(\(\_2\)\(⋀\)\) ... \)⋀A\)\(\(\_5\)\()\)\) -> A es una tautología

Sii[a_, b_] := 
        Implies[a, b] && Implies[b, a];
n = 7;
tautologia = True;
p = Table[False, {t, n}];
A1 := 
        Implies[p[[1]] && p[[2]], 
          p[[5]]];
A2 :=  
        Implies[(! p[[1]]) && p[[3]], 
          p[[6]]];
A3 := 
        Implies[p[[4]], 
          p[[6]] && (! p[[5]])];
A4 := 
        Implies[(! (p[[1]] && 
                    p[[2]])) && (! (! p[[1]] && 
                    p[[3]])) && (! p[[4]]), (p[[5]] || 
                p[[6]]) && (! (p[[5]] && 
                    p[[6]]))];
A5 := 
        Sii[p[[7]], 
          p[[5]] && p[[6]]];
AA := 
        Implies[p[[1]] && p[[2]] && p[[3]] && p[[4]], 
          p[[7]]];
expresion := Implies[A1 && A2 && A3 && A4 && A5, AA];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

Por tanto, este alumno si aprobará la signatura.

Razonando igual llegamos a la siguiente forma argumentativa para el segundo alumno:
	A\(TraditionalForm\`\_1\):  (p ⋀ q) -> t
	A\(TraditionalForm\`\_2\):  ((∼p) ⋀ r) -> v
	A\(TraditionalForm\`\_3\):  s -> (v ⋀ (∼t))
	A\(TraditionalForm\`\_3\):  ((∼(p ⋀ q)) ⋀  (∼((∼p)⋀ r))⋀ (∼s)) -> ((t ⋁ v) ⋀ (∼(t ⋀v)))
	A\(TraditionalForm\`\_4\):  w ↔ (t ⋀ v)
       ∴  A :  ((∼p) ⋀q⋀ (∼r) ⋀ (∼s)) -> w
Veamos si con estos datos, la agumentación es o no valida:

Sii[a_, b_] := 
        Implies[a, b] && Implies[b, a];
n = 7;
tautologia = True;
p = Table[False, {t, n}];
A1 := 
        Implies[p[[1]] && p[[2]], 
          p[[5]]];
A2 :=  
        Implies[! p[[1]] && p[[3]], 
          p[[6]]];
A3 := 
        Implies[p[[4]], 
          p[[6]] && (! p[[5]])];
A4 := 
        Implies[(! (p[[1]] && 
                    p[[2]])) && (! (! p[[1]] && 
                    p[[3]])) && (! p[[4]]), (p[[5]] || 
                p[[6]]) && (! (p[[5]] && 
                    p[[6]]))];
A5 := 
        Sii[p[[7]], 
          p[[5]] && p[[6]]];
AA := 
        Implies[(! p[[1]]) && 
            p[[2]] && (! p[[3]]) && (! p[[4]]), 
          p[[7]]];
expresion := Implies[A1 && A2 && A3 && A4 && A5, AA];
For[i = 0, i < 2^n, i++, 
        j = i; 
For[f = n, f > 0, f--, 
          resto = Mod[j, 2]; 
j = 
            Floor[j/2]; 
If[resto == 0, 
            p[[f]] = True, p[[f]] = False];]; 
If[
          TrueQ[expresion], Null, tautologia = False];];
If[tautologia, 
      Print["La forma enunciativa es una tautología"], 
      Print["La forma enunciativa no es una tautología"]]

Por tanto, esta alumna no aprobará la signatura.