Estou tentando obter uma visão geral da importância do ponto menos fixo (lfp) na análise de programas. Por exemplo, a interpretação abstrata parece usar a existência de lfp. Muitos trabalhos de pesquisa sobre análise de programas também se concentram fortemente em encontrar o ponto menos fixo.
Mais especificamente, este artigo na wikipedia: Teorema de Knaster-Tarski menciona que o lfp é usado para definir a semântica do programa.
Por que isso é importante? Qualquer exemplo simples me ajuda. (Estou tentando obter uma imagem grande).
EDITAR
Acho que minha redação está incorreta. Não questiono a importância do lfp. Minha pergunta exata (iniciante) é: Como a computação lfp ajuda na análise de programas? Por exemplo, por que / como a interpretação abstrata usa lfp? o que acontece se não houver lfp no domínio abstrato?
Espero que minha pergunta seja mais concreta agora.
Respostas:
Qualquer forma de recursão ou iteração na programação é realmente um ponto fixo. Por exemplo, um
while
loop é caracterizado pela equaçãoou seja,
while b do c done
é uma soluçãoW
da equaçãoonde
Φ(x) ≡ if b then (c ; x)
. Mas e seΦ
tiver muitos pontos fixos? Qual corresponde aowhile
loop? Uma das idéias básicas da semântica de programação é que é o ponto menos fixo.Vamos dar um exemplo simples, desta vez recursão. Vou usar Haskell. A função recursiva
f
definida poré a função indefinida em todos os lugares, porque ela é executada para sempre. Podemos reescrever essa definição de uma maneira mais incomum (mas ainda funciona em Haskell) como
Assim
f
é um ponto fixo da função de identidade:Mas toda função é um ponto fixo de
id
. Sob a ordem teórica usual do domínio, "indefinido" é o menor elemento. E, de fato, nossa funçãof
é a função indefinida em todos os lugares.while
while true do skip done
Só para você ter uma idéia de como isso funciona, a semântica do programa
e
fonte
But what if Φ has many fixed points?
Enquanto eu entendo a equação do ponto fixo, neste contexto, W \ em L? Como definimos a rede aqui? Agradeço sua elaboração adicional sobre isso.Aqui está a intuição: menos pontos fixos ajudam a analisar loops.
A análise do programa envolve a execução do programa - mas abstraindo alguns detalhes dos dados. Tudo isso é bom. A abstração ajuda a análise a ir mais rápido do que realmente executar o programa, porque permite ignorar aspectos que não lhe interessam. Por exemplo, é assim que a interpretação abstrata funciona: basicamente simula a execução do programa, mas apenas acompanha as informações parciais sobre o estado do programa.
A parte complicada é quando você chega a um loop. O loop pode ser executado muitas e muitas vezes. Normalmente, você não deseja que a análise do programa tenha que executar todas essas iterações do loop, porque a análise do programa levará muito tempo ... ou talvez nem seja finalizada. Então, é aí que você usa um ponto menos fixo. O ponto menos fixo basicamente caracteriza o que você pode dizer com certeza será verdadeiro depois que o loop terminar, se você não souber quantas vezes o loop irá iterar.
É para isso que serve o ponto menos fixo. Como os loops estão presentes nos programas, menos pontos fixos são usados na análise do programa. Os pontos menos fixos são importantes porque os loops estão em toda parte e é importante poder analisar loops.
Aliás, recursão e recursão mútua são apenas outra forma de loop - então elas também tendem a ser tratadas com um ponto menos fixo.
fonte