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 P. 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.
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?
fuente
Respuestas:
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.
fuente
Eche un vistazo al artículo de Guillaume Bonfante que propuso dos caracterizaciones para Logspace y el tiempo polinómico usando lenguajes de programación.
Guillaume Bonfante, Algunos lenguajes de programación para Logspace y Ptime, AMAST 2006, LNCS 4019, pp. 66-80, 2006
fuente
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 :
fuente
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.
fuente
Vea también Pola, un lenguaje para programación PTIME y trabajos de Japaridze en aritmética PTIME, por ejemplo, http://arxiv.org/abs/0902.2969
fuente