Introducción a la lógica
Estamos realizando un cálculo complejo siguiendo (por ejemplo)
algún método iterativo en el cual, como condición
de parada, necesitamos que sucedan varias cosas:
- No exceder de una cierta tolerancia o cota del error
- No exceder de un número máximo de iteraciones
- Tener un número mínimo de cifras exactas en el
resultado
y estas condiciones deben comprobarse A LA VEZ. ¿Cómo lo
hacemos? Bueno, espero que quede claro tras la siguiente
(necesaria y breve) introducción a la lógica.
En primer lugar, tenemos las proposiciones. Una proposición
es una afirmación de la que se puede decir sin ambigüedad
y de forma excluyente que es cierta o falsa. El valor lógico
de la verdad es 1, y el valor lógico de la mentira es 0.
Por ejemplo: ''María es una chica'' es una
proposición, puesto que afirmamos algo sin ambigüedad
alguna y, además, o es verdad, o no lo es. O es chica, o no lo
es.
Sin embargo: ''si no tienes dinero, eres pobre o gastas mucho''
no es una proposición. No es una afirmación de la que
se pueda decir sin ambigüedad y de forma excluyente que sea
verdad o mentira. No tener dinero puede ser consecuencia de
un robo, o de muchas otras cosas. Sin embargo, esto lo
podemos dividir en proposiciones más sencillas: ''no
tienes dinero'' (evidentemente, o es verdad o no lo es), ''eres
pobre'' (cierto o no) y ''gastas mucho'' (verdad o mentira).
Estas proposiciones están unidas mediante lo que se llaman
CONECTORES LOGICOS. Estos son los siguientes:
| o |
|| |
| y |
&& |
| no |
! |
| o exclusivo |
XOR |
| condicional |
-> "si... entonces..." |
| doble condicional |
<-> "... si y sólo si..." |
He usado la notación de C para los tres primeros, por no
tener disponibles los símbolos lógicos O:)
Si tenemos dos proposiciones p, q unidas por alguno de estos
conectores, el valor de verdad de la proposición compuesta,
según el valor de verdad de p y de q, viene dado en la
siguiente tabla (llamada Tabla de Verdad):
| p |
q |
!p |
p && q |
p || q |
p -> q |
p <-> q |
p XOR q |
| 1 | 1 | 0 |
1 | 1 | 1 |
1 | 0 |
| 1 | 0 | 0 |
0 | 1 | 0 |
0 | 1 |
| 0 | 1 | 1 |
0 | 1 | 1 |
0 | 1 |
| 0 | 0 | 1 |
0 | 0 | 1 |
1 | 0 |
Claramente, p && q será cierta cuando sean ciertas p y q. No
podemos decir "verdad" y "mentira" a la vez y pretender que esto sea
cierto. Sin embargo, p || q es cierta cuando es cierta una de las
dos proposiciones. Si tengo "verdad" o "mentira", está claro
que una o la otra (si no las dos) es cierto.
Para aclarar el XOR, pondré un ejemplo: O estás vivo o
estás muerto, pero ni puedes estar las dos cosas a la vez ni
puedes estar ninguna, por eso sólo es cierto cuando
únicamente una de las dos proposiciones es cierta.
Una forma proposicional que es SIEMPRE VERDAD se llama
TAUTOLOGIA. Si es SIEMPRE FALSA se llama
CONTRADICCION.
Siempre tendremos que p || (!p) es tautología, mientras
que p && (!p) es contradicción.
Cuando -> es tautología, se llama IMPLICACION. Cuando <-> es
tautología, se llama DOBLE IMPLICACION y la simbolizaré
con <|=|>
Voy a poneros las propiedades de &&, || (podeis convenceros haciendo las
tablas de verdad), que muchas veces os serán útiles:
- Leyes asociativas
- p || (q || r) <|=|> (p || q) || r
- p && (q && r) <|=|> (p && q) && r
- Leyes conmutativas
- p || q <|=|> q || p
- p && q <|=|> q && p
- Leyes distributivas
- p && (q || r) <|=|> (p && q) || (p && r)
- p || (q && r) <|=|> (p || q) && (p || r)
p && 1 <|=|> p (1 es tautología)
p || 0 <|=|> p (0 es contradicción)
p && p <|=|> p
p || p <|=|> p
p || (!p) <|=|> 1
p && (!p) <|=|> 0
p <|=|> !(!p)
Como consecuencia, se tiene (podeis comprobarlo):
!1 <|=|> 0
!0 <|=|> 1
!(p && q) <|=|> !p || !q
!(p || q) <|=|> !p && !q
Estas dos últimas se conocen como
"Leyes de De Morgan", y son muy importantes. Además,
pueden generalizarse a n proposiciones.
Espero que con esto tengais un pequeño instrumento que os ayude
a pensar en términos lógicos a la hora de evaluar una
condición. Al fin y al cabo, vosotros quereis que la
máquina haga algo si el resultado lógico es 0 o 1,
así que esto es precisamente lo que necesitais.