Tabla de enlaces
-
Introducción
-
Traduciendo al cálculo secuente
2.1 Expresiones aritméticas
2.2 Leting Bindings
2.3 Definiciones de nivel superior
2.4 Datos algebraicos y tipos de Codata
2.5 Funciones de primera clase
2.6 Operadores de management
-
Evaluación dentro de un contexto
3.1 Contextos de evaluación para la diversión
3.2 Centrarse en la evaluación en el núcleo
-
Reglas de escritura
4.1 Reglas de escritura para la diversión
4.2 Reglas de escritura para el núcleo
4.3 Tipo de solidez
-
Perspectivas
5.1 Los contextos de evaluación son de primera clase
5.2 Los datos son duales a Codata
5.3 Los vínculos de alquiler son duales para los operadores de management
5.4 La transformación del caso del caso
5.5 consumidores directos e indirectos
5.6 Llamado por valor, llamado por nombre y eta-laws
5.7 Lógica lineal y la dualidad de las excepciones
-
Trabajo relacionado
-
Conclusión, declaración de disponibilidad de datos y reconocimientos
A. La relación con el cálculo secuente
B. Reglas de escritura para la diversión
C. Semántica operativa de la etiqueta/goto
Referencias
3.2 Centrarse en la evaluación en el núcleo
Volvamos ahora al problema en el núcleo y encontremos una solución para el término atascado 𝜇𝛼. + (𝜇𝛽. ∗ (⌜2⌝, ⌜4⌝; 𝛽), ⌜5⌝; 𝛼). Sabemos que tenemos que evaluar 𝜇𝛽. ∗ (⌜2⌝, ⌜4⌝; 𝛽) a continuación y luego de alguna manera enchufe el resultado intermedio en el orificio [·] En el productor 𝜇𝛼. + ( [·]⌜5⌝; 𝛼). Si le damos al resultado intermedio el nombre 𝑥 y jugamos con cortes, 𝜇-enlaces y 𝜇˜ ataduras, podríamos descubrir que podemos recombinar todas estas partes de la siguiente manera:
𝜇𝛼.⟨𝜇𝛽. ∗ (⌜2⌝, ⌜4⌝; 𝛽) | 𝜇𝑥. ˜ + (𝑥, ⌜5⌝; 𝛼)⟩
Su término se ve un poco misterioso, pero la transformación corresponde aproximadamente a lo que sucede cuando traducimos el término, deje 𝑥 = 2 ∗ 4 en 𝑥 + 5 en lugar de (2 ∗ 4) + 5 al núcleo. Es decir, hemos levantado una subcomputación al exterior del término que estamos evaluando. Este tipo de transformación se llama enfoque [Andreoli 1992; Curien and Munch-Maccagnoni 2010] Y lo usamos para resolver el problema con los términos atascados en el núcleo. Podemos ver que funcionó en nuestro ejemplo porque el término ahora evalúa completamente su forma regular.
Ejemplo 3.1. El productor 𝜇𝛼.⟨𝜇𝛽. ∗ (⌜2⌝, ⌜4⌝; 𝛽) | 𝜇𝑥. ˜ + (𝑥, ⌜5⌝; 𝛼)⟩ se cut back de la siguiente manera:
⟨𝜇𝛽. ∗ (⌜2⌝, ⌜4⌝; 𝛽) | 𝜇𝑥. ˜ + (𝑥, ⌜5⌝; ⋆)⟩ ⊲ ∗ (⌜2⌝, ⌜4⌝; 𝜇𝑥. ˜ + (𝑥, ⌜5⌝; ⋆)))
⊲ ⟨⌜8⌝ | 𝜇𝑥. ˜ + (𝑥, ⌜5⌝; ⋆)⟩
⊲ +(⌜8⌝, ⌜5⌝; ⋆) ⊲ ⟨⌜13⌝ | ⋆⟩
Una vez que nos hemos decidido en centrarnos, tenemos otra opción que tomar: ¿queremos usar este truco durante la evaluación de una declaración o como un paso de preprocesamiento antes de comenzar con la evaluación? Estas dos alternativas se llaman enfoque dinámico y estático.
Enfoque dinámico Con enfoque dinámico [Wadler 2003] Agregamos reglas de evaluación adicionales, generalmente llamadas reglas 𝜍, para elevar las subcomputaciones al exterior de la declaración que estamos evaluando.
Enfoque estático Para el enfoque estático [Curien and Herbelin 2000] Realizamos una transformación en el código antes de comenzar a evaluarlo. Esto da como resultado una forma regular enfocada que es un subconjunto de la sintaxis de Centro que hemos descrito hasta ahora.
El enfoque dinámico es excelente para razonar sobre el significado de los programas, pero el enfoque estático es más eficiente si estamos interesados en compilar y ejecutar programas. Por esta razón, solo consideramos el enfoque estático en lo que sigue.
Las reglas completas para el enfoque estático se presentan en la definición 3.2. La mayoría de estas reglas solo se preocupan por realizar la transformación de enfoque en todas las subexpresiones, pero algunas de las cláusulas donde sucede algo interesante son las cláusulas para los operadores binarios:
Las dos primeras cláusulas buscan los argumentos del operador binario ⊙ que no son valores y usan el truco descrito anteriormente para elevarlos al exterior. El enfoque se invoca de manera recursiva hasta que el operador binario solo se aplique a los valores y la tercera cláusula entra en juego. Esta tercera cláusula aplica la transformación de enfoque a todos los argumentos del operador binario. Las cláusulas para constructores, destructores, IFZ y llamadas a definiciones de alto nivel funcionan precisamente de la misma manera que las de los operadores binarios. Es de destacar que al enfocar los argumentos de los destructores productores garantizamos que la regla de evaluación para los tipos de Codata puede disparar. Si no hubiéramos requerido que los argumentos del productor fueran valores en esa regla (pero solo que el destructor es una covalue), podríamos introducir fácilmente un término desenfocado nuevamente al sustituir un no valor por una variable.
La transformación de enfoque descrita en la definición 3.2 no es ultimate ya que crea muchos redexos administrativos. Como ejemplo, considere cómo se enfoca la declaración que outline mult ‘del ejemplo 2.7:
F (⟨𝑙 | case 𝛽⟩, cons (𝑥, 𝑥𝑠) ⇒ ifz (𝑥, ⟨0 ⟩)
= ⟨𝑙 | Caso 𝛽⟩, Cons (𝑥, 𝑥𝑠) ⇒ ifz (𝑥, ⟨0 ⟩
El enfoque ha introducido el RedEx administrativo ⟨𝜇𝛾 .mult ‘(𝑥𝑠; 𝛼, 𝛾) | 𝜇𝑧. ˜ ∗ (𝑥, 𝑧; 𝛽)⟩ En la segunda declaración del ifz. Después de reducir este redex a mult ‘(𝑥𝑠; 𝛼, 𝜇𝑧. ˜ ∗ (𝑥, 𝑧; 𝛽)), finalmente llegamos al resultado de la introducción. En la implementación, resolvemos este problema al reducir estáticamente a los redexos administrativos en un paso de simplificación, pero también es posible encontrar una definición más elaborada de enfoque que no los crea en primer lugar. Sin embargo, tal transformación de enfoque optimizado es mucho menos transparente que la que hemos descrito.
Autores:
(1) David Binder, Universidad de Tübingen, Alemania;
(2) Marco Tzschentke, Universidad de Tübingen, Alemania;
(3) Marius Muller, Universidad de Tübingen, Alemania;
(4) Klaus Ostermann, Universidad de Tübingen, Alemania.