⇚ Inicio

somerby.net/mack/logic

Introducción

Esta aplicación web (en lo sucesivo denominada "el software" o "la aplicación") decide la validez / satisfacibilidad / inconsistencia de ciertos tipos de expresiones de la lógica simbólica.

El software, en su parte principal, está escrito en C# y traducido a JavaScript con Saltarelle. El código fuente se encuentra en GitHub. Se utiliza Viz.js para generar los diagramas. La función que hace tablas de verdad está adaptada del código escrito por Michael Rieppel.

Agradezco a Maximiliano Paesani su ayuda en la traducción de la aplicación web al español.

Instrucciones

Para usar esta aplicación, escriba una expresión lógica en el cuadro de texto de la página principal. Luego haga clic en el botón "Decidir". Si la expresión es decidible en la aplicación, se mostrará el resultado. De lo contrario, mostrará algún tipo de mensaje explicando cuál es el error. La sección 'El lenguaje' especifica cómo escribir expresiones lógicas para la aplicación. Si está buscando ejemplos de expresiones, haga clic en cualquiera de los botones bajo el encabezado titulado "Ejemplos", y la aplicación llenará el cuadro de texto con alguna expresión a decidir.

Si hace clic en el botón "Diagramar", la aplicación mostrará un diagrama que explicita cómo la aplicación interpreta la expresión escrita en el cuadro de texto. El diagrama es una representación gráfica de la estructura de datos que la aplicación está usando efectivamente para decidir la expresión.

Si en el cuadro de texto hay una expresión sintácticamente válida perteneciente a la lógica proposicional, se habilitará el botón "Tabla de verdad". Al hacer clic allí, la aplicación generará la tabla de verdad correspondiente.

Al hacer clic en el botón "Ejemplo", la aplicación intentará encontrar un tipo de mundo en el que la expresión sea verdadera. Si tiene éxito, mostrará una descripción de ese tipo de mundo.

El botón "Contraejemplo", inicia la búsqueda de un tipo de mundo que haga falsa la expresión, y si lo encuentra m su descripción.

El botón "árbol semántico" redirigirá la expresión al generador de árboles semánticos(Tree Proof Generator) de wo. Es una aplicación web que usa tablas semánticas (árboles) para verificar la validez de una expresión, y proporciona una prueba si decide que es válida. El botón "árbol semántico" se habilitará siempre que haya una expresión sintácticamente válida en el cuadro de texto que no contenga identificaciones u operadores modales. Si desea evaluar una expresión que contiene predicados binarios (relaciones), use el Generador de árboles semánticos.

El lenguaje

Elementos del lenguaje

El lenguaje tiene estos elementos:

Operadores lógicos

Los operadores lógicos que el software reconoce son:

OperadorSímboloDescripción
negación ~ "no" lógico
conjunción & "y" lógico
disyunción | "o" lógico
condicional material -> Si … entonces …
bicondicional <=>Equivalencia lógica
negación conjunta ! "nor" lógico
disyunción excluyente^ "Xor" lógico
implicación estricta-< necesariamente si … entonces …

Todos los operadores lógicos binarios son asociativos por la izquierda y tienen las siguientes precedencias:

PrecedenciaOperadores
superior &, !
|
->, -<
inferior <=>, ^

Por ejemplo,

A|B&C->D

se interpreta como significando lo mismo que

(A|(B&C))->D

La negación es asociativa por derecha y precede a cualquier operador binario, por ello

~P & ~Q

se interpreta como significando lo mismo que

(~P) & (~Q)

Variables

Las variables son letras minúsculas únicas que representan algún objeto. Cada variable está ligada por un cuantificador. Cualquier letra minúscula que no esté ligada por un cuantificador se interpretará como una constante individual.

Constantes individuales

Las constantes individuales, como las variables, son letras minúsculas únicas. Representan algún objeto fijo. Cualquier letra minúscula que no esté limitada por un cuantificador se interpretará como una constante individual. Creo que las constantes no son completamente necesarias en la lógica simbólica. El siguiente argumento:

Hx->Mx // Todo hombre es mortal.
Hs     // Socrates es hombre.
->     // Por lo tanto
Ms     // Socrates es mortal.

podría también representarse sin constantes individuales como

Hx->Mx                                   // Todo hombre es mortal.
(3x,Sx) & ([]x,Sx->y,Sy->x=y) & x,Sx->Hx // Socrates es hombre.
->                                       // Por lo tanto
x,Sx->Mx                                 // Socrates es mortal.

lo cual, aunque más complicado, es en cierto modo mejor, porque hace explícito lo que típicamente suponemos acerca de Sócrates: que existió y que era, por definición, un individuo único. Aun así, creo que las constantes individuales son una característica demasiado útil para excluirlas del software. El uso de una constante individual implica que el objeto denotado por ella realmente existe. Esta no es la única forma de interpretar constantes individuales, pero es la más fácil de implementar en este software. Debido a esta interpretación, el software decidirá que 3x,x=g es necesariamente cierto. Los objetos posibles (aquellos que pueden o no existir) y los objetos imposibles (los que nunca podrían existir) se pueden representar con predicados unarios.

Como todavía no he encontrado una manera satisfactoria de decidir expresiones que contienen tanto operadores modales como constantes individuales, el software rechaza cualquier expresión de este tipo.

Predicados sobre cero variables

Un predicado de cero variables, que se puede considerar como una proposición verdadero/falso, se representa con una sola letra.

Predicados en una variable

Una predicación sobre una variable, que puede considerarse como la afirmación de que un objeto tiene alguna propiedad, se representa con una sola letra mayúscula (el predicado) seguida de una sola letra minúscula (la variable). Se puede usar la misma letra mayúscula como predicado sobre una variable y como predicado sobre cero variables en la misma expresión y el software las tratará como predicados distintos, por ejemplo

x,Fx->F

será interpretado de la misma manera que

x,Fx->P

porque la primera "F" se interpreta como un predicado unario y la segunda "F" se interpreta como un predicado nulo.

Predicados en dos variables

Una predicación sobre dos variables, que puede considerarse como la afirmación de que dos objetos tienen alguna relación entre sí, se representa con una sola letra mayúscula (el predicado) seguida de dos letras minúsculas (las variables). El algoritmo de decisión no admite predicados sobre dos variables y, por lo general, rechazará una expresión que las contenga. Sin embargo, las expresiones que tienen predicados en dos variables pueden evaluarse con el Generador de árboles semánticos, si no contienen también operadores modales o identificaciones.

Agrupación

Las expresiones se pueden agrupar con paréntesis. Funcionan igual que los paréntesis en álgebra o en otras lógicas simbólicas.

Generalizaciones universales

Una generalización universal es una variable seguida de una coma y seguida de la expresión a la que se aplica la generalización. De acuerdo con esto, se podría escribir

x,Ax

para decir "todo es asombroso". La generalización liga toda la expresión que sigue a la coma, hasta un paréntesis de cierre o el final de la línea de texto en la que se encuentra la generalización. Así

x,Fx & y,Jy

generaliza sobre la sub-expresión

Fx & y,Jy

en vez de ser sólo una generalización sobre Fx. Se recomienda añadir paréntesis a los fines de mayor claridad. Por ejemplo:

(x, Fx & (y,Jy))

Una variable siempre está ligada a la generalización delimitante más próxima, por ello en

x, (x,F->Px) & Jx

la x en Px está ligada por la segunda generalización universal y la x en Jx está ligada por la primera.

Cuantificación existencial

Una cuantificación existencial es un símbolo "3" seguido de una variable, seguida de una coma y, finalmente, seguida de una expresión a la cual se aplica la cuantificación. Por ejemplo,

3x, Fx & Bx

podría significar "Hay una fuente llena de sangre". Las mismas reglas de aplicabilidad y ligación de variables definidas para las generalizaciones universales se aplican también a las cuantificaciones existenciales.

Descripciones definidas

Una descripción definida es un "1" seguido de una variable, seguida de una coma, seguida de una expresión que, se supone, describe exactamente un objeto. Por ejemplo,

1x,Rx

podría significar "existe sólo un Roy Orbison".

Identidad

Una identidad entre dos objetos consiste en una letra minúscula seguida de un signo igual seguido de otra letra minúscula, por ejemplo

x,y, (Fx & x=y) -> Fy

es una afirmación donde "x=y" significa x es el mismo objeto que y.

Operadores modales

El software reconoce dos operadores modales, "[]" para necesidad y "<>" para posibilidad. Son asociativos por la derecha y tienen la misma precedencia que la negación. El tipo de modalidad representada por estos operadores es la modalidad alética.

Proposiciones de dos términos

El software reconoce proposiciones de dos términos en lo que se suele denominarse lógica "de términos", "aristotélica" o "tradicional". Trata las proposiciones de dos términos como enunciados abreviados de la lógica de predicados unarios. Son una letra mayúscula que representa el término del sujeto, seguida de una letra minúscula que representa la forma de la proposición, seguida de una letra mayúscula que representa el término predicado.

SímboloProposiciónDefinición
SaPTodo S es P (x,Sx->Px)&(3x,Sx)
SePNingún S es P x,Sx->~Px
SiPAlgún S es P 3x,Sx&Px
SoPNo todo S es P (3x,Sx&~Px)|(~3x,Sx)
SuPO bien Todo S es P o Ningún S es P(x,Sx->Px)|(x,Sx->~Px)
SyPAlgún S es P y Algún S no es P(3x,Sx&Px)&(3x,Sx&~Px)

Para hacer que el tradicional Cuadro de oposición sea verdadero, las proposiciones de tipo A se definen con significado existencial y las proposiciones de tipo O se definen sin significado existencial, siguiendo los argumentos de Terence Parsons. También reconoce la forma de U y la forma de Y del Hexágono de Oposición.

Cualquiera de los términos en una proposición se pueden negar agregando el símbolo "~" por ejemplo, "~Aa~B" se interpretará como "todo no A es no B". Un "~" al principio de la expresión se adjunta al primer término y no a la expresión completa, por lo que "~Aa~B" no se interpreta como "~(Aa~B)" sino como "(~Aa~B)".

Aserciones numéricas

El lenguaje incluye un medio para hacer algunas afirmaciones simples de número. Los agregué al idioma solo por conveniencia; a veces ayudan a codificar la lógica en ciertos acertijos lógicos. No pertenecen a ninguna lógica simbólica que yo sepa.

Un número entero no negativo n seguido de una sola letra mayúscula P es una afirmación de que exactamente n objetos tienen la propiedad P .

Un número entero no negativo n seguido de más de una letra mayúscula P, Q, … es una afirmación de que exactamente n de las proposiciones P, Q, … son verdaderas.

EjemploSignificación
0PNingún objeto es P
1PExactamente 1 objeto es P
2PExactamente 2 objetos son P
0PQRNinguna de P, Q y R son ciertas
1PQRSolo uno de P, Q y R es cierta
2PQRExactamente 2 de P, Q y R son ciertas

Reemplazos de texto

Una línea que comienza con "#replace" se interpretará como una directiva para reemplazar una cadena de letras o símbolos con otra en las líneas debajo de la directiva. Es una forma de definir sus propios símbolos de operador o dar nombres significativos a predicados y variables. Por ejemplo, cuando se le da el texto

#replace => ->
#replace hombre H
#replace mortal M
#replace socrates s
#replace porlotanto .'.

x, hombre x => mortal x
hombre socrates
porlotanto
mortal socrates

la aplicación lo convertirá en

x, H x -> M x
M s
.'.
M s

antes de analizarlo sintácticamente.

El símbolo "Por lo tanto"

El símbolo "por lo tanto", ".'." (punto, apóstrofe, punto) se puede utilizar para probar argumentos lógicos. Se evaluará de la misma manera que el material condicional, pero el resultado mostrado será diferente. En lugar de indicar si el argumento es necesariamente cierto, contingente o imposible, el software indicará si el argumento es válido (necesariamente cierto) o inválido (no necesariamente cierto). Además, si el argumento es válido, el software indicará si las premisas son inconsistentes o la conclusión es tautológica.

Expresiones válidas

En este idioma, una expresión válida es solo una declaración de verdadero/falso. Puede ser una sola línea, como

P&Q->R

o pueden ser varias líneas, como

Hx->Mx
Hs
->
Ms

Si es una sola línea, el software interpreta la línea como una afirmación y decide si es válida, consistente o contradictoria. Si son varias líneas, el software une estas líneas para formar una sola expresión y decide esta declaración. El software trata cada línea que es una declaración como si estuviera unida a las otras líneas que son declaraciones con un AND lógico. Esto le permite distribuir una declaración larga en varias líneas. Por ejemplo,

P->Q
Q->R
P

se interpreta que significa lo mismo que

(P->Q)&(Q->R)&P

Si una expresión tiene varias líneas y exactamente una de ellas es un solo operador lógico binario o el símbolo "por lo tanto", el software unirá las líneas antes del operador con un "y" lógico, unirá las líneas después del operador con un "y" lógico y luego une estos dos conjuntos con el único operador lógico. Por ejemplo,

Hx->Mx
Hs
->
Ms

se interpreta que significa lo mismo que

( (Hx->Mx) & Hs ) -> (Ms)

Esto le permite expresar un argumento lógico (varias premisas seguidas de una conclusión) de una manera familiar, o probar si un conjunto de declaraciones es equivalente a otro conjunto de declaraciones sin ponerlas todas en una sola línea.

Las declaraciones largas se pueden dividir en varias líneas. El software interpretará el texto en varias líneas como una declaración de acuerdo con las siguientes reglas: