Depende de lo que quiere decir con "igualdad de expresión de la función".
Estas funciones van a terminar como bytecode, por lo que podría, por ejemplo, volcar el bytecode correspondiente a cada función en un byte [] y luego comparar las dos matrices de bytecode.
Sin embargo, hay muchas maneras diferentes de escribir métodos semánticamente equivalentes, que no tendrían la misma representación en bytecode.
En general, es imposible decir qué código hace sin ejecutarlo. Por lo tanto, es imposible determinar si dos bits de código son equivalentes sin ejecutar ambos, en todas las entradas posibles.
Esto es al menos tan malo, desde un punto de vista computacional, como el problema de detención, y posiblemente peor.
El problema de detención es indecidible tal como está, por lo que la respuesta en este caso es definitivamente no (y no solo para Clojure sino para cada lenguaje de programación).
Imposible: la equivalencia de funciones es indecidible. –
Vaya, disculpe el formato de comentario de recompensa: no me di cuenta de que el formato no funcionaría de la misma manera. –
Hola Omri. Si ve mi respuesta a continuación, verá que hablo de dos funciones que tienen el mismo código de byte JVM que su cuerpo. Eso es efectivamente igualdad intensional. También afirmo que la igualdad intensional implica la igualdad extensional (pero que lo contrario no es cierto). Si el bytecode termina siendo diferente (como podría suceder con algunos de los ejemplos que usted brinda), entonces estamos de vuelta tratando de lograr la igualdad extensional, que como sabemos es indecidible.Espero que las cosas sean un poco más claras: la igualdad intensional (más algunos casos especiales) es probablemente lo mejor que podemos esperar. – kittylyst