Por que determinar se uma função é pura é difícil?

Eu estava na convenção StackOverflow Dev Days ontem, e um dos palestrantes estava falando sobre Python. Ele mostrou uma função Memoize, e eu perguntei se havia alguma maneira de evitar que ela fosse usada em uma função não-pura. Ele disse que não, isso é basicamente impossível, e se alguém pudesse descobrir uma maneira de fazer isso, seria uma ótima tese de doutorado.

Isso meio que me confundiu, porque não parece tão difícil para um compilador / intérprete resolver recursivamente. No pseudocódigo:

function isPure(functionMetadata): boolean;
begin
   result = true;
   for each variable in functionMetadata.variablesModified
      result = result and variable.isLocalToThisFunction;
   for each dependency in functionMetadata.functionsCalled
      result = result and isPure(dependency);
end;

Essa é a ideia básica. Obviamente, você precisaria de algum tipo de verificação para impedir a recursão infinita em funções mutuamente dependentes, mas isso não é muito difícil de configurar.

Funções de ordem mais alta que tomam ponteiros de função podem ser problemáticas, já que não podem ser verificadas estaticamente, mas minha pergunta original pressupõe que o compilador tenha algum tipo de restrição de linguagem para designar que somente um ponteiro de função puro pode ser passado para um determinado parâmetro. . Se existisse, isso poderia ser usado para satisfazer a condição.

Obviamente, isso seria mais fácil em uma linguagem compilada do que interpretada, já que todo esse processamento seria feito antes que o programa fosse executado e, portanto, não atrasasse nada, mas eu realmente não vejo problemas fundamentais que tornariam isso impossível. avaliar.

Alguém com um pouco mais de conhecimento nesta área sabe o que estou perdendo?

questionAnswers(7)

yourAnswerToTheQuestion