¿Cuáles son las aplicaciones de la lógica modal?

La lógica temporal, un tipo particular de lógica modal, se utiliza en informática en algunos lugares sorprendentemente diferentes: robótica, verificación formal e incluso semántica. En general, la lógica temporal resulta útil cuando se trata de sistemas reactivos .

La lógica temporal tiene dos modalidades: □ y ◇. □ φ significa “φ siempre se mantiene” y ◇ φ significa “φ eventualmente se mantendrá”. Tienen la relación habitual para la lógica modal: □ φ ⇔ ¬ ◇ ¬φ y ◇ φ ⇔ ¬ □ ¬φ. A veces, la lógica temporal se extiende con algunos operadores adicionales como ∘ para “siguiente” y ▹ para “entonces” (x▹y significa “x será verdadero, entonces y será verdadero”).

En la verificación formal, la lógica temporal puede usarse para establecer invariantes sobre el código, especialmente útil para sistemas distribuidos. Por ejemplo, puede representar fácilmente las propiedades de seguridad (“no sucederá nada malo”) y de vida (“algo bueno sucederá eventualmente”) mediante la lógica temporal. Una propiedad de seguridad se vería como □ ¬φ donde φ es “algo malo”; una propiedad vital sería ◇ φ donde φ es “algo bueno”. Su programa puede verificarse según las especificaciones temporales utilizando un verificador de modelos como Spin.

La robótica heredó el uso de la lógica temporal de la verificación formal de sistemas concurrentes. En robótica, podemos usar la lógica temporal para especificar los requisitos sobre el plan de un robot. Por ejemplo, podríamos especificar evitar obstáculos como: [math] \ lnot (o_1 \ lor o_2 \ lor \ ldots \ lor o_n) \ triangleright \ pi) [/ math]. Aquí el objetivo del robot es π; Esta declaración dice que tiene que evitar todos los obstáculos hasta que alcance π. Otro ejemplo son los objetivos de secuencia: [matemáticas] \ Diamond (\ pi_1 \ land \ Diamond (\ pi_2 \ land \ Diamond \ pi_3)) [/ math]; esto asegura que el robot primero visite π₁ luego π₂ luego π₃ en ese orden. Estas propiedades también se pueden verificar utilizando herramientas como Spin. Para obtener más detalles, eche un vistazo a esta descripción general del laboratorio UPenn’s Grasp: http://repository.upenn.edu/cgi/…

Un uso ligeramente diferente de la lógica temporal es dar semántica a la programación reactiva funcional. La programación funcional reactiva presenta al programador dos tipos de datos “primitivos”: flujos de eventos y comportamientos. Una secuencia representa eventos discretos como las pulsaciones de teclas; puedes modelar un teclado como un Event Char que te daría un personaje cada vez que alguien presiona una tecla. Un comportamiento representa un valor que siempre existe pero que puede cambiar continuamente con el tiempo; Esto es bueno para cosas como la posición del cursor, que sería un Behavior (Int, Int) . Para una introducción más detallada, consulte: ¿Qué es la programación funcional reactiva?

Siguiendo a Curry-Howard, los eventos y comportamientos de FRP corresponden a la lógica temporal. En particular, los eventos son ◇ y los comportamientos son □. Esto es útil para razonar sobre programas reactivos funcionales, y también se utiliza para definir tipos dependientes para FRP. La idea básica es simple: primero, expresamos □ y ◇ usando el tiempo explícitamente:
[matemáticas]
\ begin {align}
\ square x & \ equiv \ forall t ‘\ in [t, \ infty). x_ {t ‘} \\
\ diamond x & \ equiv \ exist t ‘\ in [t, \ infty). x_ {t ‘}
\ end {alinear}
[/matemáticas]
Aquí [math] [t, \ infty) [/ math] es el dominio del tiempo, que puede ser cualquier conjunto totalmente ordenado y generalmente es continuo. El truco es que ◇ y □ ahora tienen un “tiempo de inicio” [matemático] t [/ matemático], que usaremos en nuestros tipos para asegurarnos de que solo combinemos flujos y comportamientos compatibles. Dada esta idea, podemos transcribirla fácilmente a tipos dependientes:
[matemáticas]
\ begin {align}
\ text {comportamiento} \ \ alpha & \ equiv \ Pi t ‘: \ mathbf {time}. \ alpha_ {t ‘} \\
\ text {stream} \ \ alpha & \ equiv \ Sigma t ‘: \ mathbf {time}. \ alpha_ {t ‘} \\
\ end {alinear}
[/matemáticas]

Esto nos permite hacer cumplir la “consistencia de la hora de inicio” utilizando nuestro sistema de tipos, lo que solo asegura que todos los valores reactivos sean válidos en el momento en que se usan, ya que los eventos y comportamientos pueden tener diferentes horas de inicio.

Entonces: la lógica temporal se usa para verificación formal, sistemas concurrentes, robótica e incluso tipos para programación funcional reactiva. Estoy seguro de que aún hay más cosas que me perdí.

La lógica modal se puede aplicar al estudio de la demostrabilidad en sistemas formales. Es posible interpretar el cuadro como el predicado “demostrable” en la aritmética de Peano. Entonces el diamante significa “No es refutable”, es decir, “es consistente”.

Solovay demostró que el sistema GL de lógica modal axiomatiza completamente la lógica de demostrabilidad de la aritmética. GL es el sistema de Kripke más los siguientes esquemas de axioma:

□ A => □□ A

(que corresponde al hecho de que PA prueba Bew (‘A’) => Bew (‘Bew (‘ A ‘)’) para cualquier oración A)

□ (□ A => A) => □ A
(que corresponde al hecho de que PA prueba el teorema de Lob sobre sí mismo para todas las oraciones A. Ver el teorema de Löb).

Luego, digamos, el segundo teorema de incompletitud de Godel formalizado,

◇ T => ◇ □ F

se deduce de la semántica simple de Kripke a través de este diccionario.

Muchas modalidades. Aquí está una lista parcial:

Lo normal. Cosas que son verdaderas o falsas.
Cosas que posiblemente sean ciertas y cosas que son necesariamente verdaderas. Esto último es más fuerte que simplemente ser cierto, lo que podría ser una casualidad.

Modalidad Deóntica. Cosas que son requeridas, prohibidas u opcionales

Modalidad temporal Las cosas que siempre son verdaderas, a veces verdaderas, eventualmente serán verdaderas o nunca serán verdaderas.

Hay muchas otras modalidades, pero esta lista parcial es un buen lugar para comenzar.