¿Un lenguaje de programación que solo puede implementar funciones biyectivas computables?

10

¿Existen lenguajes de programación (o lógica) que puedan implementar (o expresar) una función si y solo si es una función biyectiva computable? ff:NNf

Chao Xu
fuente
Alguien me demostró que es imposible crear un lenguaje que solo acepte terminar programas. Como tu pregunta es bastante similar, supongo que no.
FUZxxl
1
Parece poco probable que haya un lenguaje de programación así, supongo que podrías tratar de aplicarlo, pero entonces no serías capaz de hacer cosas simples como ordenar, al menos no sin que se vuelva terriblemente complejo y doloroso.
Luke Mathieson
@FUZxxl Esto no captura muchos programas de terminación, de hecho, incluso la función f (x) = 1 es imposible de expresar en este lenguaje. También tengo la sensación de que este tipo de funciones son capturadas por la programación funcional total ya que cada función es una función total.
Chao Xu
@FUZxxl, no creo que sea correcto, pero ese lenguaje tendría que ser limitado. Por ejemplo, se garantizaría que un lenguaje que fuera equivalente a autómatas deterministas finitos terminara, pero sería extremadamente limitado en lo que podría calcular.
jmite el
@FUZxxl, los detalles de tal declaración son importantes. Es fácil diseñar un lenguaje de programación en el que finalice cada programa. Diseñar un lenguaje diferente es el que podemos expresar cada función computable.
Vijay D el

Respuestas:

9

No hay tal lenguaje.

Sin embargo, eche un vistazo a Boomerang . Es un lenguaje para escribir biyecciones entre cadenas. No sé qué tan amplia es una clase de mapas que se puede expresar en él, pero estoy seguro de que puedes averiguar si buscas un poco.

Es razonable exigir a un lenguaje de programación que el conjunto de programas válidos sea reconocible por un intérprete o un compilador, es decir, que sea un conjunto computablemente enumerable. Supongamos entonces que tenía un lenguaje de programación cuyo conjunto de programas válidos fueron computablemente numerable y el que se desarrolla con precisión todos los bijections computables . Eso implicaría que podemos enumerar de manera computacional todas las biyecciones computables (simplemente enumerar todos los programas válidos en este lenguaje de programación), pero esto es imposible según el siguiente teorema.NN

Teorema: supongamos que es una secuencia computable de biyecciones computables. Luego hay una biyección computable que no está en la secuencia.f0,f1,f2,

Prueba. Construimos una biyección siguiente manera. Para definir los valores g ( 2 k ) y g ( 2 k + 1 ) , observamos f k ( 2 k ) :g:NNg(2k)g(2k+1)fk(2k)

  • si entonces el conjunto de g ( 2 k ) = 2 k + 1 y g ( 2 k + 1 ) = 2 k ,fk(2k)=2kg(2k)=2k+1g(2k+1)=2k
  • si , establezca g ( 2 k ) = 2 k y g ( 2 k + 1 ) = 2 k + 1 .fk(2k)2kg(2k)=2kg(2k+1)=2k+1

Claramente, para cada , g es diferente de f k porque g ( 2 k ) f k ( 2 k ) . Además, g es computable y es una biyección porque es su propio inverso. QEDkNgfkg(2k)fk(2k)g

Andrej Bauer
fuente
¿Por qué necesitas este truco y 2 k + 1 ? Usar g ( k ) = f k ( k ) + 1 debería ser suficiente. 2k2k+1g(k)=fk(k)+1
FUZxxl
@FUZxxl: si usa la función resultante no es sobreyectivafk(k)+1
Vor
Debes asegurarte de que sea ​​biyectiva. g
Andrej Bauer el
La afirmación inicial es incorrecta, hay muchos de esos lenguajes en la literatura.
Nathaniel
Por otro lado, su prueba parece legítima. Quizás estoy confundido de alguna manera. Necesito leer el artículo de Axelsen y Glück (ver mi respuesta) cuidadosamente para descubrir qué está pasando aquí.
Nathaniel