Dipende esattamente da cosa intendi per "uguaglianza dell'espressione di funzione".
Queste funzioni andranno a finire come bytecode, quindi potrei ad esempio eseguire il dump del bytecode corrispondente a ogni funzione a un byte [] e quindi confrontare i due array di bytecode.
Tuttavia, ci sono molti modi diversi di scrivere metodi semanticamente equivalenti, che non avrebbero la stessa rappresentazione in bytecode.
In generale, è impossibile dire cosa fa un pezzo di codice senza eseguirlo. Quindi è impossibile dire se due bit di codice sono equivalenti senza eseguirli entrambi, su tutti i possibili input.
Questo è almeno altrettanto grave, dal punto di vista computazionale, come il problema dell'arresto, e forse anche peggiore.
Il problema di interruzione è indecidibile così com'è, quindi la risposta del caso generale qui è decisamente no (e non solo per Clojure ma per ogni linguaggio di programmazione).
Impossibile - l'equivalenza delle funzioni è indecidibile. –
Oops, mi dispiace per il formato del commento di bounty, non rendevo conto che la formattazione non avrebbe funzionato allo stesso modo. –
Ciao Omri. Se vedi la mia risposta qui sotto, vedrai che parlo di due funzioni che hanno lo stesso codice byte JVM come corpo. Questa è effettivamente l'uguaglianza intensionale. Faccio anche il punto che l'uguaglianza intensionale implica l'uguaglianza estensionale (ma che il contrario non è vero). Se il bytecode finisce per essere diverso (come potrebbe essere per alcuni degli esempi che fornisci), allora siamo tornati a cercare di raggiungere l'uguaglianza estensionale - che, come sappiamo, è indecidibile.Spero che ciò renda le cose un po 'più chiare - l'uguaglianza intensionale (più alcuni casi speciali) è probabilmente la migliore che possiamo sperare. – kittylyst