¿Qué es esta notación de estilo de "matemática discreta" similar a una fracción utilizada para reglas formales?

18

En el documento "Un tipo de datos JSON replicado libre de conflictos" , encontré esta notación para definir formalmente "reglas":

Algunas de las "reglas" que se muestran en el documento] [1

¿Cómo se llama esta notación? ¿Cómo lo leo?

Por ejemplo:

  • el DOC regla no tiene nada en su "numerador", ¿por qué no?
  • Las reglas EXECy GETparecen tener dos términos separados sobre la línea, ¿qué significa eso?
  • la VARregla también se destaca un poco, ya que si bien muchas otras reglas usan algún tipo de flecha (lo que supongo que significa "implica"), esta parece indicar que x es un elemento de algo.
  • Casi todo está salpicado de una inicial Ap,que el texto describe como "el estado de la réplica p es descrito por Ap, una función parcial finita". ¿Cómo un lector inteligente de esta notación tenderá a "ver" esa parte de cada regla?

Este sitio sugirió una pregunta relacionada que tiene una notación de aspecto muy similar, sobre la pregunta ¿Cuál es el significado de ⟨B, s⟩ -> ⟨B ', s'⟩ como la regla inicial en esta pregunta sobre pequeños pasos ¿semántica? - esto está etiquetado como semántica operacional , y eso parece ser una fuerte ventaja. ¿Es ese el marco en el que debería interpretar estas cifras? ¿Podría resumir esto fácilmente en forma de "curso intensivo" para que, incluso si no puedo verificar la exactitud de sus pruebas, al menos pudiera comprender un poco más lo que dicen en esta sección?

natevw
fuente

Respuestas:

25

Esta es una notación estándar para una regla de inferencia . Las premisas se colocan sobre una línea horizontal, y la conclusión se coloca debajo de la línea. Por lo tanto, termina pareciéndose a una "fracción", pero con una o más proposiciones lógicas sobre la línea y una sola proposición debajo de la línea. Si ve una etiqueta (por ejemplo, "LET" o "VAR" en su ejemplo) al lado, es solo un nombre legible para identificar la regla en particular.

También puede ver esto denominado deducción natural o deducción natural estilo Gentzen .

Esta es una notación común en la literatura de lenguajes de programación. Lo verás por todas partes. Es muy conveniente para los tipos de conclusiones y pruebas estructuradas recursivas que surgen en ese campo.

Verá esta notación utilizada para expresar axiomas / reglas. Puede pensar en cada axioma como una plantilla con "meta-variables" (por ejemplo, expr ); puede reemplazar cada metavariable con alguna sintaxis del lenguaje de programación (por ejemplo, cualquier expresión que sea válida en el lenguaje de programación) y obtendrá una instancia de la regla. La regla de inferencia promete que si todas las proposiciones están por encima de la línea son verdaderas (para alguna instancia de la plantilla, donde reemplaza constantemente cada metavariable con el mismo valor en toda la regla), entonces la proposición debajo de la línea también será verdadera .

DW
fuente
2
Un uso notable es la especificación del tipo de inferencia Hindley-Milner: esta respuesta a “¿Qué parte de Milner-Hindley no entiendes?” Explica cómo leer y usar ese conjunto de reglas.
DylanSp
Una pequeña corrección: las premisas y conclusiones son juicios , no proposiciones . Las proposiciones son una forma específica de juicio. En ese sentido, los juicios son evidentes , no verdaderos (porque la noción de verdad es difícil de definir y no es realmente interesante para la semántica del lenguaje de programación).
cabeza de jardín
7

Aquí hay una explicación muy informal que podría ayudar a las personas que no están familiarizadas con las anotaciones formales a poner un pie en la puerta. ¡No reemplaza una definición formal!

El Ap es el estado de su sistema o su programa en ejecución. "Estado" puede significar muchas cosas, pero en este caso parece incluir una lista de todas las variables locales definidas y sus valores. ¿Por qué es Ap una función? Porque esa es una manera conveniente de expresar asignaciones de variables: Ap (x) da el valor de la variable x .

Ahora, tomemos la regla EXEC como ejemplo. Define la semántica de ejecutar un comando cmd1 seguido de un comando cmd2 , es decir, qué sucede con el estado Ap del sistema cuando se ejecuta cmd1 seguido de cmd2 .

  • Por encima de la línea: estas son las premisas. Lo que dicen: "Deje que cmd1 sea ​​un comando. Si ejecuta el comando cmd1 cuando su sistema está en estado Ap , su sistema terminará en un nuevo estado Ap ' ".
  • Debajo de la línea: Aquí la regla describe lo que significa ejecutar dos comandos cmd1 y cmd2 secuencialmente. Lo que dice: "Suponiendo que su sistema está en estado Ap , ejecutar cmd1 y luego cmd2 significa ejecutar cmd2 cuando su sistema está en estado Ap ' " (recuerde que Ap' es el estado que obtiene después de ejecutar cmd1 , como se define en el local).

Las otras reglas describen la semántica de los comandos y expresiones individuales. Por ejemplo, la regla VAR describe lo que significa "ejecutar" una variable: si x es una variable local (por encima de la línea), entonces, ¿qué significa evaluar / ejecutar la variable x ? Está escrito debajo de la línea: cuando su programa está en estado Ap , la evaluación de x le da el valor de x , es decir, Ap (x) .

Espero que eso ayude.

baúl
fuente
¡Gracias, esta es una gran ayuda para comprender y exactamente lo que estaba buscando! Sin embargo, deja mi primera pregunta sin respuesta: ¿esta notación tiene un nombre, generalmente y / o en este contexto particular? Mi suposición era "semántica operacional", pero la otra respuesta aquí hasta ahora dice que son simplemente "reglas de inferencia". Supongo que si hago una pregunta en dos partes, merezco dividir las respuestas, pero ahora estoy dividido entre cuál aceptar: -)
natevw
1
@natevw Son reglas de inferencia. La semántica operativa es solo una de las muchas cosas que comúnmente se expresan con reglas de inferencia.
Gilles 'SO- deja de ser malvado'