Articulo de referencia

Aplicación de funciones

En matemáticas , la aplicación (o evaluación ) de una función es el acto de tomar una función y una entrada de su dominio para obtener el valor correspondiente de su rango . En ...

En matemáticas , la aplicación (o evaluación ) de una función es el acto de tomar una función y una entrada de su dominio para obtener el valor correspondiente de su rango . En este sentido, la aplicación de una función puede considerarse como lo opuesto a la abstracción de una función . [ 1 ]

Es fundamental para los lenguajes de programación derivados del cálculo lambda , como LISP y Scheme , y también para los lenguajes funcionales . Desempeña un papel importante en el estudio de la semántica denotacional de los programas informáticos, ya que es una función continua en órdenes parciales completos . La aplicación de funciones también es una función continua en la teoría de la homotopía y, de hecho, sustenta toda la teoría: permite que una deformación homotópica se vea como una trayectoria continua en el espacio de funciones. Del mismo modo, las mutaciones válidas (refactorizaciones) de programas informáticos pueden considerarse como aquellas que son "continuas" en la topología de Scott .

Representación

La aplicación de una función se suele representar yuxtaponiendo la variable que representa la función con su argumento entre paréntesis . Por ejemplo, la siguiente expresión representa la aplicación de la función ƒ a su argumento x .

F(incógnita){\displaystyle f(x)}

En algunos casos, se utiliza una notación diferente donde no se requieren paréntesis, y la aplicación de la función puede expresarse simplemente por yuxtaposición . Por ejemplo, la siguiente expresión puede considerarse igual que la anterior:

Fincógnita{\displaystyle f\;x}

Esta última notación es especialmente útil en combinación con el isomorfismo de currificación . Dada una funciónF:(incógnita×Y)Z{\displaystyle f:(X\times Y)\to Z}, su aplicación se representa comoF(incógnita,y){\displaystyle f(x,y)}por la notación anterior yF(incógnita,y){\displaystyle f\;(x,y)}(oFincógnita,y{\displaystyle f\;\langle x,y\rangle }con el argumentoincógnita,yincógnita×Y{\displaystyle \langle x,y\rangle \in X\times Y}escrito con los corchetes angulares menos comunes) por este último. Sin embargo, las funciones en forma currificadaF:incógnita(YZ){\displaystyle f:X\to (Y\to Z)}pueden representarse yuxtaponiendo sus argumentos:Fincógnitay{\displaystyle f\;x\;y}, en vez deF(incógnita)(y){\displaystyle f(x)(y)}Esto depende de que la aplicación de la función sea asociativa por la izquierda .

Cuando la notación matemática se representa en un documento digital, los caracteres Unicode invisibles de ancho cero U+2061 FUNCTION APPLICATION y U+2062 INVISIBLE TIMES se pueden utilizar para distinguir la concatenación que significa aplicación de función de la concatenación que significa multiplicación.

Como operador

La aplicación de funciones se puede definir como un operador , llamado aplicar o${\displaystyle \$}, según la siguiente definición:

F$incógnita=F(incógnita){\displaystyle f\mathop {\,\$\,} x=f(x)}

El operador también puede denotarse mediante una comilla invertida (`).

Si se entiende que el operador tiene baja precedencia y es asociativo por la derecha , el operador de aplicación se puede utilizar para reducir la cantidad de paréntesis necesarios en una expresión. Por ejemplo;

F(gramo(h(j(incógnita)))){\displaystyle f(g(h(j(x))))}

se puede reescribir como:

F$gramo$h$j$incógnita{\displaystyle f\mathop {\,\$\,} g\mathop {\,\$\,} h\mathop {\,\$\,} j\mathop {\,\$\,} x}

Esto puede expresarse de forma equivalente utilizando la composición de funciones como:

(Fgramohj)(incógnita){\displaystyle (f\circ g\circ h\circ j)(x)}

o incluso:

(Fgramohjincógnita)(){\displaystyle (f\circ g\circ h\circ j\circ x)()}

si uno consideraincógnita{\displaystyle x}ser una función constante que devuelveincógnita{\displaystyle x}.

teoría de conjuntos

En la teoría axiomática de conjuntos , especialmente en la teoría de conjuntos de Zermelo-Fraenkel , una funciónF:DR{\displaystyle f:D\mapsto R}a menudo se define como una relación (FD×R{\displaystyle f\subsetequ D\times R}) teniendo la propiedad de que, para cualquierincógnitaD{\displaystyle x\in D}hay una únicayR{\displaystyle y\in R}de tal manera que(incógnita,y)F{\displaystyle (x,y)\in f}.

Normalmente uno no se conforma con escribir "(incógnita,y)F{\displaystyle (x,y)\in f}"para especificar quey{\displaystyle y}y normalmente desea la notación de función más común "F(incógnita)=y{\displaystyle f(x)=y}" . Aplicación de la función, o más específicamente, la notación "F(incógnita){\displaystyle f(x)}", no está presente en la signatura habitual de la teoría de conjuntos, pero puede agregarse a la teoría como un símbolo de función binaria.(){\displaystyle \bullet (\bullet )}si se desea sin ninguna pérdida de expresividad definiendo: [ 2 ]

incógnita(Y)={zsi incógnita es una función, y (Y,z)incógnitade lo contrario{\displaystyle X(Y)=\left\{{\begin{array}{lll}z&{\text{si }}X{\text{ es una función, y }}(Y,z)\in X\\\varnothing &{\text{en otro caso}}\\\end{array}}\right.}

O, más formalmente: [ 3 ] [ 4 ]

incógnita(Y)=z(D,R(incógnitaRD((Y,z)incógnita)))(D,R(incógnitaRD(Y,z)incógnita)z=),{\displaystyle X(Y)=z\iff (\exists D,R(X\in R^{D}\land ((Y,z)\in X)))\lor (\forall D,R(X\notin R^{D}\lor (Y,z)\notin X)\land z=\varnothing ),}

dóndeRD{\displaystyle R^{D}}denota la exponenciación de conjuntos : el conjunto de todas las funciones deD{\displaystyle D}aR{\displaystyle R}.

En prosa:incógnita(Y)=z{\displaystyle X(Y)=z}si existe un dominioD{\displaystyle D}y gamaR{\displaystyle R}de tal manera queincógnita{\displaystyle X}es una función deD{\displaystyle D}aR{\displaystyle R}y(Y,z)incógnita{\displaystyle (Y,z)\in X}; o (la negación de lo anterior) yz=.{\displaystyle z=\varnada.}La elección de utilizar el conjunto vacío{\displaystyle \varnothing }cuandoincógnita(Y){\displaystyle X(Y)}no está definido es arbitrario para asegurar que la notación definida para todo el dominio del discurso . [ 5 ]

SiΨ(incógnita,Y,z){\displaystyle \Psi (X,Y,z)}denota la fórmula del lado derecho de la bicondicional anterior, para cualesquiera dos conjuntos,incógnita,Y{\displaystyle X,Y}la fórmulaΨ{\displaystyle \Psi }asocia un objeto únicoz{\displaystyle z}:incógnita,Y¡zΨ(incógnita,Y,z){\displaystyle \forall X,Y\,\exists !z\,\Psi (X,Y,z)}Por lo tanto, el lenguaje de la teoría de conjuntos puede utilizar una extensión por definición para incluir la operación de aplicación de funciones.(){\displaystyle \bullet (\bullet )}conservadoramente .

Programación

En programación informática, la aplicación de funciones a menudo se refiere a la llamada o ejecución de un procedimiento, en lugar de una verdadera función matemática (véase funciones en programación informática ), con reglas similares para su comportamiento.

La aplicación de funciones corresponde a la reducción beta en el cálculo lambda .

Aplicar función

En relación con el operador apply, la función apply aplica una función a una lista variable de argumentos. Eval y apply son los dos componentes interdependientes del ciclo eval-apply en Lisp, descrito en SICP . [ 6 ] Esto es compatible con lenguajes que utilizan funciones variádicas , ya que es la única forma de llamar a una función con un número indeterminado (en tiempo de compilación) de argumentos.

Common Lisp y Scheme

En Common Lisp, apply es una función que aplica una función a una lista de argumentos (nótese aquí que "+" es una función variádica que acepta cualquier número de argumentos):

( aplicar #' + ( lista 1 2 ))

De forma similar en Scheme:

( aplicar + ( lista 1 2 ))

C++

En C++ , Bind [ 7 ] se utiliza ya sea a través del espacio de nombres std o a través del espacio de nombres boost.

C# y Java

En C# y Java , los argumentos variádicos se agrupan en un array. El llamador puede pasar explícitamente un array en lugar de los argumentos variádicos. Esto solo es posible para un parámetro variádico. No es posible aplicar un array de argumentos a un parámetro no variádico sin usar reflexión . Surge una ambigüedad si el llamador quiere pasar el array como uno de los argumentos en lugar de usarlo como una lista de argumentos. En este caso, el llamador debe convertir el array a Objectpara evitar que el compilador use la interpretación apply .

variadicFunc ( arrayOfArgs );

Con la versión 8 se introdujeron las expresiones lambda. Las funciones se implementan como objetos con una interfaz funcional, una interfaz con un solo método no estático. La interfaz estándar

Función < T , R >

Consta del método (más algunas funciones de utilidad estáticas):

R aplicar ( T para )

Ir

En Go , los argumentos variádicos tipados se agrupan en una porción. El llamador puede pasar explícitamente una porción en lugar de los argumentos variádicos, agregando un ...argumento a la porción. Esto solo es posible para un parámetro variádico. El llamador no puede aplicar una matriz de argumentos a parámetros no variádicos sin usar reflexión.

s := [] cadena { "foo" , "bar" } variadicFunc ( s ... )

JavaScript

En JavaScript , los objetos de función tienen un applymétodo, el primer argumento es el valor de la thispalabra clave dentro de la función; el segundo es la lista de argumentos:

func.apply ( null , args ) ;

ES6 agrega el operador de propagación func(...args)[ 8 ] que puede usarse en lugar de apply.

Lua

En Lua , apply se puede escribir de esta manera:

función aplicar ( f ,...) devolver f (...) fin

Perl

En Perl , los arrays, hashes y expresiones se "aplanan" automáticamente en una sola lista cuando se evalúan en un contexto de lista, como en la lista de argumentos de una función.

# Llamadas a subrutinas equivalentes: @args = ( @some_args , @more_args ); func ( @args );func ( @some_args , @more_args );

PHP

En PHP , applyse llama call_user_func_array:

call_user_func_array ( 'func_name' , $args );

Python y Ruby

En Python y Ruby , la misma notación de asteriscos que se usa para definir funciones variádicas se usa para llamar a una función en una secuencia y en un array, respectivamente:

función ( * argumentos )

Python originalmente tenía una función apply, pero esta fue descontinuada en favor del asterisco en la versión 2.3 y eliminada en la versión 3.0. [ 9 ]

R

En R , do.callconstruye y ejecuta una llamada a función a partir de un nombre o una función y una lista de argumentos que se le pasarán:

f ( x1 , x2 ) # también se puede realizar a través de do.call ( what = f , args = list ( x1 , x2 ))

Charla informal

En Smalltalk , los objetos de bloque (función) tienen un valueWithArguments:método que toma un array de argumentos:

unBlock valorConArgumentos: args

Tcl

Desde Tcl 8.5, [ 10 ] se puede aplicar una función a los argumentos con el applycomando

¿Aplicar función ? arg1 arg2 ... ?

donde la función es una lista de dos elementos {args body} o una lista de tres elementos {args body namespace}.

Propiedad universal

Consideremos una funcióngramo:(incógnita×Y)Z{\displaystyle g:(X\times Y)\to Z}, eso es,gramo[(incógnita×Y)Z]{\displaystyle g\in [(X\times Y)\to Z]}donde la notación de corchetes[AB]{\displaystyle [A\to B]}denota el espacio de funciones de A a B. Mediante la currificación , existe una única funcióncurry(gramo):incógnita[YZ]{\displaystyle {\mbox{curry}}(g):X\to [Y\to Z]}. Luego, Apply proporciona el morfismo universal

Aplicar:([YZ]×Y)Z{\displaystyle {\mbox{Aplicar}}:([Y\to Z]\times Y)\to Z},

de modo que

Aplicar(F,y)=F(y){\displaystyle {\mbox{Aplicar}}(f,y)=f(y)}

o, equivalentemente, se tiene el diagrama de conmutación

Aplicar(curry(gramo)×identificaciónY)=gramo{\displaystyle {\mbox{Aplicar}}\circ \left({\mbox{curry}}(g)\times {\mbox{id}}_{Y}\right)=g}

Más precisamente, curry y apply son functores adjuntos .

La notación[AB]{\displaystyle [A\to B]}para el espacio de funciones de A a B ocurre más comúnmente en ciencias de la computación. Sin embargo, en teoría de categorías ,[AB]{\displaystyle [A\to B]}se conoce como el objeto exponencial y se escribe comoBA{\displaystyle B^{A}}También existen otras diferencias de notación comunes; por ejemplo, Apply a menudo se denomina Eval , [ 11 ] aunque en ciencias de la computación, no son lo mismo, distinguiéndose eval de Apply , ya que es la evaluación de la forma de cadena entre comillas de una función con sus argumentos, en lugar de la aplicación de una función a algunos argumentos.

Además, en la teoría de categorías, el curry se suele denotar porλ{\displaystyle \lambda }, de modo queλgramo{\displaystyle \lambda g}está escrito para curry ( g ). Esta notación está en conflicto con el uso deλ{\displaystyle \lambda }en el cálculo lambda , donde lambda se usa para denotar variables ligadas. Con todos estos cambios de notación considerados, la adjunción de Apply y curry se expresa entonces en el diagrama conmutativo

Propiedad universal del objeto exponencial
Propiedad universal del objeto exponencial

Los artículos sobre objetos exponenciales y categorías cartesianas cerradas ofrecen una discusión más precisa de la formulación categórica de esta idea. Por lo tanto, el uso de lambda aquí no es accidental; el lenguaje interno de las categorías cartesianas cerradas es simplemente cálculo lambda tipado . El entorno más general posible para Apply son las categorías monoidales cerradas , de las cuales las categorías cartesianas cerradas son un ejemplo. En álgebra homológica , la adjunción de curry y apply se conoce como adjunción tensorial-hom .

Propiedades topológicas

En la teoría del orden , en la categoría de órdenes parciales completos dotados de la topología de Scott , tanto `curry` como `apply` son funciones continuas (es decir, son continuas de Scott ). [ 12 ] Esta propiedad ayuda a establecer la validez fundamental del estudio de la semántica denotacional de los programas informáticos.

En geometría algebraica y teoría de homotopía , curry y apply son funciones continuas cuando el espacioYincógnita{\displaystyle Y^{X}}de funciones continuas deincógnita{\displaystyle X}aY{\displaystyle Y}se le da la topología abierta compacta yincógnita{\displaystyle X}es localmente compacto de Hausdorff . Este resultado es muy importante, ya que sustenta la teoría de la homotopía, permitiendo que las deformaciones homotópicas se entiendan como trayectorias continuas en el espacio de funciones.

Otros casos

La correspondencia Curry-Howard relaciona la aplicación de funciones con la regla lógica del modus ponens .

Véase también

Referencias

  1. Alama, Jesse; Korbmacher, Johannes (2023), "El cálculo lambda" , en Zalta, Edward N.; Nodelman, Uri (eds.), La enciclopedia de filosofía de Stanford (  edición de invierno de 2023), Laboratorio de Investigación en Metafísica, Universidad de Stanford , consultado el 29 de febrero de 2024.
  2. Mendelson, Elliott (2015). Introducción a la lógica matemática (6.ª ed.). CRC Press . págs. 102–103 , 231, 235, 245–246 . ISBN   978-1-4822-3778-8.
  3. Suppes, Patrick (1972). Teoría axiomática de conjuntos . Archivo de Internet. Nueva York, Dover Publications. pág. 87. ISBN  978-0-486-61630-8.
  4. ^ Levy, Azriel (1979). Teoría básica de conjuntos . Berlina; Nueva York: Springer-Verlag. pag. 27.ISBN  978-0-387-08417-6.
  5. ^ Levy, Azriel (1979). Teoría básica de conjuntos . Berlina; Nueva York: Springer-Verlag. pag. 15.ISBN  978-0-387-08417-6.
  6. Harold Abelson, Gerald Jay Sussman, Julie Sussman, Estructura e interpretación de programas informáticos , (1996) MIT Press, ISBN 0-262-01153-0Véase la Sección 4.1, El Evaluador Metacircular .
  7. "Boost: Documentación de Bind.HPP - 1.49.0" .
  8. "Sintaxis de propagación - JavaScript | MDN" . Consultado el 20 de abril de 2017 .
  9. "Funciones integradas no esenciales" . Referencia de la biblioteca de Python . 8 de febrero de 2005. Consultado el 19 de mayo de 2013 .
  10. "aplicar" . Documentación de Tcl . 2006. Consultado el 23 de junio de 2014 .
  11. Saunders Mac Lane , Teoría de categorías
  12. HP Barendregt, The Lambda Calculus , (1984) ISBN de Holanda Septentrional 0-444-87508-5