Lenguajes de programación para computación eficiente


32

Es imposible escribir un lenguaje de programación que permita todas las máquinas que se detienen en todas las entradas y no en otras. Sin embargo, parece fácil definir dicho lenguaje de programación para cualquier clase de complejidad estándar. En particular, podemos definir un lenguaje en el que podamos expresar todos los cálculos eficientes y solo los cálculos eficientes.

Por ejemplo, para algo como : tome su lenguaje de programación favorito, y después de escribir su programa (correspondiente a Turing Machine ), agregue tres valores al encabezado: un entero , y un entero , y una salida predeterminada . Cuando se compila el programa, genera una máquina Turing que, dada la entrada de tamaño ejecuta en para pasos. Si no se detiene antes de que los pasos estén arriba, envíe la salida predeterminadaM c k d M x n M x c n k M c n k d PPMckdMxnMxcnkMcnkd. A menos que me equivoque, estos lenguajes de programación nos permitirán expresar todos los cálculos en y nada más. Sin embargo, este lenguaje propuesto es intrínsecamente no interesante.P

Mi pregunta: ¿existen lenguajes de programación que capturen subconjuntos de funciones computables (como todas las funciones computables eficientemente) de una manera no trivial? Si no hay, ¿hay alguna razón para esto?


77
Algunos ejemplos simples de lenguajes de programación que capturan subconjuntos de funciones computables: expresiones regulares y gramáticas libres de contexto.
Jukka Suomela

2
En realidad, los lenguajes que capturan la clase de complejidad como (que se define de manera similar a las funciones recursivas primitivas con recursión reemplazada por recursión limitada) son bastante interesantes (al menos desde el punto de vista teórico). :)P VPPV
Kaveh

La programación lineal y entera capturan interesantes subconjuntos de funciones computables.
Diego de Estrada

Datalog solo puede expresar algoritmos de tiempo polinomiales, pero no sé si puede expresar todos los algoritmos de tiempo polinomiales.
Julio

El conocido documento "Programación funcional total" hace el argumento de que los lenguajes de programación que no tienen un problema indeciso de detención son realmente prácticos y útiles. jucs.org/jucs_10_7/total_functional_programming
ninguno

Respuestas:


32

Un lenguaje que intenta expresar solo cálculos de tiempo polinomiales es el cálculo lambda suave . Su sistema de tipos tiene sus raíces en la lógica lineal. Una tesis reciente aborda los cálculos de tiempo polinomiales y proporciona un buen resumen de los desarrollos recientes basados ​​en este enfoque. Martin Hofmann ha estado trabajando en el tema durante bastante tiempo. Puede encontrar una lista anterior de documentos relevantes aquí ; Muchos de sus documentos continúan en esta dirección.

Otro trabajo adopta el enfoque de verificar que el programa utiliza una cierta cantidad de recursos, utilizando Tipos dependientes o Lenguaje ensamblador mecanografiado .

Sin embargo, otros enfoques se basan en cálculos formales limitados por los recursos , como las variantes del cálculo ambiental.

Estos enfoques tienen la propiedad de que los programas bien escritos satisfacen algunos límites de recursos previamente especificados. El límite de recursos puede ser tiempo o espacio, y generalmente puede depender del tamaño de las entradas.

El trabajo inicial en esta área consiste en normalizar fuertemente los cálculos, lo que significa que todos los programas bien escritos se detienen. El sistema F , también conocido como cálculo lambda polimórfico, se está normalizando fuertemente. No tiene operador de punto fijo, pero es bastante expresivo, aunque no creo que se sepa a qué clase de complejidad corresponde. Por definición, cualquier cálculo fuertemente normalizador expresa alguna clase de cálculos de terminación.

El lenguaje de programación Charity es un lenguaje funcional bastante expresivo que se detiene en todas las entradas. No sé qué clase de complejidad puede expresar, pero la función de Ackermann se puede escribir en Charity.


¿Qué quieres decir con "al menos" aquí?
nponeccop

'Al menos' aquí significa 'algunos'. Cambiaré mi respuesta para hacerlo un poco más preciso.
Dave Clarke

Estoy bastante seguro de que la complejidad de las funciones definibles en el sistema F es la clase de funciones que terminan en el tiempo "alguna función comprobablemente total de aritmética de segundo orden" de la entrada. No es una clase de complejidad muy convencional, pero aún así ...
cody

cody: de acuerdo con "Theorems for free" de Wadler, el Sistema F puede expresar "todas las funciones recursivas que pueden demostrarse como totales en la aritmética de Peano de segundo orden", y que "incluye la función [...] de Ackermann". No estoy seguro de si eso es lo mismo que estás describiendo. La característica principal de Charity es su compatibilidad con los datos de codata, mientras que creo que la verificación de terminación de Agda permite más expresividad que Coq y System F al tiempo que garantiza la terminación.
Blaisorblade


8

También me gustaría mencionar la teoría de la complejidad implícita como un enfoque para esto, ya que lo he visto surgir en varias preguntas algo relacionadas. Para citar esta respuesta de Neel Krishnaswami :

La técnica básica es relacionar las clases de complejidad con los subsistemas de lógica lineal (las llamadas "lógicas lineales ligeras"), con la idea de que la eliminación de cortes para el sistema lógico debe completarse para la clase de complejidad dada (como LOGSPACE, TIEMPO, etc). Luego, a través de Curry-Howard, obtienes un lenguaje de programación en el que precisamente los programas en la clase dada son expresables.


5

Me sorprende que nadie haya mencionado la recursividad primitiva. Al restringir a los bucles delimitados (es decir, el número de iteraciones para cada bucle debe calcularse antes de que comience el bucle), el programa resultante es primitivo recursivo y, por lo tanto, total. Douglas Hofstadter propuso un lenguaje de programación, BLOOP, que permitía todas y solo funciones recursivas primitivas.


1
Es una subclase adecuada de todas las funciones, pero llamarla una clase de funciones "eficientes" podría ser un poco exagerado.
Raphael el

Supongo que puede modificarlo para capturar utilizando la caracterización de Cobham de como recursión polinómicamente limitada. PPP
Kaveh

Otros mencionaron el Sistema F y otros lenguajes fuertemente normalizadores, que en cierto sentido solo admiten la "recursividad primitiva". Sin embargo, dado que admiten funciones de primera clase, permiten escribir más programas (como la función Ackermann).
Blaisorblade

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.