En filosofía analítica y ciencias de la computación , la transparencia referencial y la opacidad referencial son propiedades de las construcciones lingüísticas, [1] y por extensión de los lenguajes. Una construcción lingüística se llama referencialmente transparente cuando para cualquier expresión construida a partir de ella, reemplazar una subexpresión por otra que denote el mismo valor [2] no cambia el valor de la expresión. [3] [4] De lo contrario, se llama referencialmente opaca . Cada expresión construida a partir de una construcción lingüística referencialmente opaca afirma algo sobre una subexpresión, mientras que cada expresión construida a partir de una construcción lingüística referencialmente transparente afirma algo que no es sobre una subexpresión, lo que significa que las subexpresiones son 'transparentes' a la expresión, actuando meramente como 'referencias' a algo más. [5] Por ejemplo, la construcción lingüística '_ era sabio' es referencialmente transparente (por ejemplo, Sócrates era sabio es equivalente a El fundador de la filosofía occidental era sabio ) pero '_ dijo _' es referencialmente opaca (por ejemplo, Jenofonte dijo 'Sócrates era sabio' no es equivalente a Jenofonte dijo 'El fundador de la filosofía occidental era sabio' ).
La transparencia referencial, en los lenguajes de programación, depende de las equivalencias semánticas entre las denotaciones de las expresiones, o de la equivalencia contextual de las expresiones mismas. Es decir, la transparencia referencial depende de la semántica del lenguaje. Así, tanto los lenguajes declarativos como los imperativos pueden tener posiciones referencialmente transparentes, posiciones referencialmente opacas, o (normalmente) ambas, según la semántica que se les dé.
La importancia de las posiciones referencialmente transparentes es que permiten al programador y al compilador razonar sobre el comportamiento del programa como un sistema de reescritura en esas posiciones. Esto puede ayudar a demostrar la corrección , simplificar un algoritmo , ayudar a modificar el código sin romperlo u optimizar el código mediante memorización , eliminación de subexpresiones comunes , evaluación diferida o paralelización .
El concepto se originó en los Principia Mathematica de Alfred North Whitehead y Bertrand Russell (1910-1913): [5]
Una proposición como vehículo de verdad o falsedad es un suceso particular, mientras que una proposición considerada fácticamente es una clase de sucesos similares. Es la proposición considerada fácticamente la que aparece en enunciados como “ A cree p ” y “ p se refiere a A ”.
Por supuesto, es posible hacer afirmaciones sobre el hecho particular de que “Sócrates es griego”. Podemos decir cuántos centímetros mide; podemos decir que es negro; y así sucesivamente. Pero estas no son las afirmaciones que un filósofo o un lógico se sienten tentados a hacer.
Cuando se produce una afirmación, se hace por medio de un hecho particular, que es una instancia de la proposición afirmada. Pero este hecho particular es, por así decirlo, “transparente”; no se dice nada sobre él, pero por medio de él se dice algo sobre otra cosa. Esta cualidad “transparente” es la que corresponde a las proposiciones tal como aparecen en funciones de verdad. Esto corresponde a p cuando se afirma p , pero no cuando decimos “ p es verdadero”.
Fue adoptado en la filosofía analítica en Palabra y objeto (1960) de Willard Van Orman Quine : [3]
Cuando se utiliza un término singular en una oración con el único fin de especificar su objeto, y la oración es verdadera respecto del objeto, entonces, con toda seguridad, la oración seguirá siendo verdadera cuando se sustituya por cualquier otro término singular que designe el mismo objeto. Aquí tenemos un criterio para lo que puede llamarse posición puramente referencial : la posición debe estar sujeta a la sustitutividad de la identidad .
[…]
La transparencia referencial tiene que ver con las construcciones (§ 11); modos de contención, más específicamente, de términos singulares u oraciones en términos singulares u oraciones. Llamo a un modo de contención φ referencialmente transparente si, siempre que una ocurrencia de un término singular t es puramente referencial en un término u oración ψ ( t ) , es puramente referencial también en el término u oración contenedora φ ( ψ ( t )) .
El término apareció en su uso contemporáneo en la ciencia informática en la discusión de variables en lenguajes de programación en el conjunto de notas de clase seminales de Christopher Strachey Conceptos fundamentales en lenguajes de programación (1967): [4]
Una de las propiedades más útiles de las expresiones es la que Quine [4] denomina transparencia referencial . En esencia, esto significa que si deseamos encontrar el valor de una expresión que contiene una subexpresión, lo único que necesitamos saber sobre la subexpresión es su valor. Cualquier otra característica de la subexpresión, como su estructura interna, el número y la naturaleza de sus componentes, el orden en que se evalúan o el color de la tinta con la que están escritos, es irrelevante para el valor de la expresión principal.
Hay tres propiedades fundamentales relativas a la sustitutividad en los lenguajes formales: transparencia referencial, definibilidad y desplegabilidad. [6]
Denotemos la equivalencia sintáctica con ≡ y la equivalencia semántica con =.
Una posición se define mediante una secuencia de números naturales. La secuencia vacía se denota por ε y el constructor de la secuencia por '.'.
Ejemplo. — La posición 2.1 en la expresión (+ (∗ e 1 e 1 ) (∗ e 2 e 2 )) es el lugar ocupado por la primera aparición de e 2 .
La expresión e con la expresión e′ insertada en la posición p se denota por e [ e′ / p ] y se define por
Ejemplo. — Si e ≡ (+ (∗ e 1 e 1 ) (∗ e 2 e 2 )) entonces e [ e 3 /2.1] ≡ (+ (∗ e 1 e 1 ) (∗ e 3 e 2 )) .
La posición p es puramente referencial en la expresión e está definida por
En otras palabras, una posición es puramente referencial en una expresión si y sólo si está sujeta a la sustitutividad de iguales. ε es puramente referencial en todas las expresiones.
El operador Ω es referencialmente transparente en el lugar i está definido por
De lo contrario, Ω es referencialmente opaco en el lugar i .
Un operador es referencialmente transparente y se define como es referencialmente transparente en todos los lugares. De lo contrario, es referencialmente opaco .
Un lenguaje formal es referencialmente transparente , lo que se define como que todos sus operadores son referencialmente transparentes. De lo contrario, es referencialmente opaco .
Ejemplo. — El operador '_ vive en _' es referencialmente transparente:
De hecho, la segunda posición es puramente referencial en la afirmación porque sustituir Londres por La capital del Reino Unido no cambia el valor de la afirmación. La primera posición también es puramente referencial por la misma razón de sustitutividad.
Ejemplo. — Los operadores '_ contiene _' y comillas son referencialmente opacos:
De hecho, la primera posición no es puramente referencial en el enunciado, ya que al sustituir The capital of the United Kingdom por London, se modifica el valor del enunciado y de la cita. Por lo tanto, en la primera posición, los operadores '_ contiene _' y de comillas destruyen la relación entre una expresión y el valor que denota.
Ejemplo. — El operador '_ se refiere a _' es referencialmente transparente, a pesar de la opacidad referencial del operador de comillas:
De hecho, la primera posición es puramente referencial en el enunciado, aunque no lo sea en la cita, porque sustituir Londres por La capital del Reino Unido no cambia el valor del enunciado. Por lo tanto, en la primera posición, el operador '_ se refiere a _' restablece la relación entre una expresión y el valor que denota. La segunda posición también es puramente referencial por la misma razón de sustitutividad.
Un lenguaje formal está definido porque todas las ocurrencias de una variable dentro de su ámbito denotan el mismo valor.
Ejemplo. — Las matemáticas son definidas:
De hecho, las dos apariciones de x denotan el mismo valor.
Un lenguaje formal es desplegable y se define porque todas las expresiones son β-reducibles .
Ejemplo. — El cálculo lambda es desdoblable:
De hecho, ((λ x . x + 1) 3) = ( x + 1)[3/ x ] .
La transparencia referencial, la definibilidad y la desdoblabilidad son independientes. La definibilidad implica desdoblabilidad solo para lenguajes deterministas. Los lenguajes no deterministas no pueden tener definibilidad y desdoblabilidad al mismo tiempo.