Si supone que el cálculo es un buen modelo de lenguajes de programación funcionales, entonces uno puede pensar: el cálculo λ tiene una noción aparentemente simple de complejidad temporal: solo cuente el número de pasos de reducción β ( λ x . M ) N → M [ N / x ] .λλβ( λ x . M) N→ M[ N/ x]
¿Pero es esta una buena medida de complejidad?
Para responder a esta pregunta, debemos aclarar qué entendemos por medida de complejidad en primer lugar. La tesis de Slot y van Emde Boas da una buena respuesta : cualquier buena medida de complejidad debe tener una relación polinómica con la noción canónica de complejidad temporal definida con las máquinas de Turing. En otras palabras, debe haber un 'razonable' que codifica A partir de lambda términos -calculus a las máquinas de Turing, como para algunas polinomio p , es el caso de que para cada término M de tamaño | M | : M se reduce a un valor en p ( | M |t r ( . )λpagsMETROEl | METROEl |METRO pasos de reducción β exactamente cuando t r ( M ) se reduce a un valor en p ( | t r ( M ) | ) pasos de una máquina Turing.p ( | MEl | ) βt r ( M)p ( | t r ( M) | )
Durante mucho tiempo, no estaba claro si esto se puede lograr en el cálculo λ. Los principales problemas son los siguientes.
- Hay términos que producen formas normales (en un número polinómico de pasos) que son de tamaño exponencial. Incluso escribir las formas normales lleva tiempo exponencial.
- La estrategia de reducción elegida juega un papel importante. Por ejemplo, existe una familia de términos que se reduce en un número polinómico de β-pasos paralelos (en el sentido de una reducción λ óptima ), pero cuya complejidad es no elemental (es decir, peor que exponencial).
β
No estoy seguro de cuál es la situación para otras estrategias de evaluación. No soy consciente de que se haya llevado a cabo un programa similar para la complejidad del espacio.