Estou tentando provar algumas declarações sobre a execução em programas Java sob algumas restrições pesadas (basicamente tenho uma conjectura de que, se dois métodos satisfazem um conjunto de restrições para uma determinada entrada, então eles são equivalentes - ou seja, que retornam valor e estado após execução são idênticas). Para provar isso, estou procurando algum tipo de formalismo que me permita falar sobre isso.
Eu estou familiarizado com a semântica operacional das linguagens funcionais e eu poderia traduzir loops / while loops para funções recursivas ... Prefiro não fazer isso e seria bom ter algumas máquinas para que eu pudesse permanecer em um território imperativo .
Mais especificamente, eu quero raciocinar sobre o estado de um método no k º passo da execução. Isso inclui o estado global:
- Chamadas como
this.field = 2
atualizar nosso estado de classe - Chamadas que modificam parâmetros atualizam o estado fora do nosso método:
myParam.setFoo(...)
myParam.x = y
- Chamadas para métodos estáticos
Blah.static_side_effects()
Estou assumindo que tudo isso é determinístico . Ou seja, quero formalizar a suposição de que, se alguma dessas atualizações globais do estado ocorrer em dois métodos, cujos estados de execução global e local são idênticos, o novo estado também será idêntico - que cada etapa da computação é determinada precisamente por estado global e estado local. Obviamente, isso impede RNGs e paralelismo (mas eu posso lidar com isso mais tarde ...).
Alguma idéia ou fonte de como eu poderia abordar isso? Meu único pensamento é tratar os métodos como uma lista de declarações e tentar descrever formalmente a semântica de uma declaração.
Se possível, eu adoraria fazer isso no nível da linguagem Java, e não no nível da JVM. Isso pode não ser viável, mas meu objetivo, no momento, é fazer algumas suposições razoáveis sobre minha semântica operacional e, a partir daí, levá-la a partir daí.
Oh, uma observação final - todas as sugestões sobre como melhorar essa questão serão muito apreciadas. Estou meio que tentando encontrar o idioma certo para fazer a pergunta e se estou abusando da terminologia (como estado de execução local / global ...) adoraria corrigir isso.