Exemplo de um algoritmo que não possui uma prova de correção


18

Nós temos a lógica Hoare. Por que ainda é possível que um algoritmo esteja correto, mas não há provas de que esteja correto? Suponha que o algoritmo seja expresso em C. Em seguida, podemos argumentar passo a passo que ele está fazendo o que deveria fazer.

Então, minha pergunta é:

Dê-me um exemplo de um algoritmo correto, mas que não possui uma prova de correção.

Edição: Eu acho que um pouco de fundo pode ajudar a esclarecer onde estou indo. Deixe-me citar Scott Aaronson:

Desde a década de 1970, especula-se que P NP possa ser independente (isto é, nem provável nem refutável) dos sistemas de axioma padrão da matemática, como a teoria dos conjuntos de Zermelo-Fraenkel. Para ser claro, isso significaria que tanto

  1. não existe um algoritmo de tempo polinomial para problemas completos de NP, mas nunca podemos provar isso (pelo menos não em nossos sistemas formais usuais), ou então

  2. um algoritmo de tempo polinomial para problemas NP-completos faz existir, mas de qualquer nunca podemos provar que ele funciona, ou nunca podemos provar que ele pára em tempo polinomial.

Estou me referindo à segunda possibilidade. Como Aaronson pode listá-lo com tanta confiança como uma possibilidade, acho que deve haver um exemplo existente do tipo 2. É por isso que estou fazendo essa pergunta. Mas parece que uma resposta rápida e clara não está à vista.


17
O que significa dizer que um algoritmo está correto se não temos uma prova de correção?
David Richerby

14
Você quer dizer "a prova da correção é impossível" ou "ninguém provou que ela está correta"?
precisa saber é o seguinte

12
Os algoritmos não precisam estar corretos ... suponha que você tenha o seguinte: (1) coloque um balde vazio no parapeito da janela pela manhã. (2) derrubá-lo à noite. (3) meça o volume de água no balde. (4) repita na manhã seguinte. Esta é uma descrição de um algoritmo, mas não descreve nada que possa ser, sem alongamento, chamado "correto". Curiosamente, a maioria dos códigos de programação do mundo é escrita dessa maneira específica: ela simplesmente não se preocupa com a exatidão do que faz.
wvxvw

@wvxvw Estou confuso então, o que significa um algoritmo estar "correto" então? Se faz o que foi planejado, isso não significa que está correto? Se o objetivo do seu cenário era encontrar a quantidade média de água coletada no balde durante a chuva, para todos os dias, o algoritmo não estaria correto nesse caso?
Abdul

8
@chi você não entende ... não é que os programadores não se importem com a correção de seu código, é que para alguns algoritmos o conceito de "correção" não é aplicável. Pegue um aplicativo .NET WindowsForms, que diz algo sobre o efeito: "coloque esse botão com esse rótulo nesta posição, depois coloque esse outro botão nessa outra posição e assim por diante ..." - pode haver alguma interpretação sobre o que isso programa faz, sob o qual o que faz pode ser julgado como (in) correto (por exemplo, o designer gráfico diz que "parece feio"), mas isso é o mais longe possível.
wvxvw

Respostas:


50

Aqui está um algoritmo para a função de identidade:

  • Entrada: n
  • Verifique se o º cadeia binária codifica uma prova de 0 > 1 em ZFC, e se assim for, a saída n + 1n0>1n+1
  • Caso contrário, a saída n

A maioria das pessoas suspeita que esse algoritmo calcule a função de identidade, mas não sabemos e não podemos prová-lo na estrutura de matemática comumente aceita, o ZFC .


2
n0>1

23
Não, mas a verificação pode definitivamente ser implementada algoritmicamente (ou seja, por uma máquina de Turing). Na verdade, esse é um dos requisitos que temos para os sistemas de prova - que a validade da prova seja verificável algoritmicamente.
Yuval Filmus

6
¬(0>1)0>1

1
@ Nathaniel De jeito nenhum. Você pode facilmente provar a correção de todos os algoritmos de livros didáticos, por exemplo. Esse algoritmo difere no fato de confiar na consistência do ZFC, que é algo que o próprio ZFC não pode provar.
Yuval Filmus 02/02

1
@ Nathaniel: Se você gosta, vamos continuar essa discussão no chat .
precisa saber é o seguinte

9

A maioria dos algoritmos não foi provada correta na lógica Hoare. A principal razão é que essas provas de correção são extremamente caras a partir de janeiro de 2017, provavelmente por várias ordens de grandeza em comparação com a 'mera' programação. Há muito trabalho em andamento para reduzir esse custo pela automação, mas é uma luta árdua.

Outra razão pela qual um algoritmo pode não ter uma prova de correção, e mais relevante na prática do que os fenômenos de incompletude mencionados por Yuval e chi, é que talvez não saibamos o que é essa especificação. Este problema tem duas dimensões.

  • Os clientes não sabem o que querem. Esse é um problema bem conhecido na engenharia de software, e os engenheiros de software desenvolveram muitas abordagens para lidar com isso.

  • nvariando acima dos números naturais, e os adversários são máquinas de Turing com probabilidade probabilística polinomial. De acordo com o meu conhecimento (corrija-me se estiver errado), existe uma incompatibilidade entre teoria e prática, e algoritmos concretos como AES e SHA256 não estão completamente dentro do alcance dessas especificações teóricas. Eu não acho que exista uma especificação completa para tais algoritmos, portanto, não podemos, em princípio, verificá-los no sentido, por exemplo, da lógica Hoare.


O AES está dentro do alcance das definições de segurança criptográfica. (Você precisa usar definições de segurança concretas, em vez de definições assintótica, mas você deve estar fazendo isso de qualquer maneira, se você quer segurança na prática.)
DW

@DW Interessante. Eu não estava ciente disso. Como é evitada a natureza assintótica da criptografia teórica? Você pode me indicar um artigo sobre isso? E as funções hash criptográficas concretas?
Martin Berger

pt.wikipedia.org/wiki/Concrete_security , e as referências listadas lá. As funções de hash são um caso mais complexo, porque depende do uso delas - mas as complexidades são em grande parte ortogonais à segurança assintótica versus segurança concreta.
DW

2
Para criptografia, você precisa de dois algoritmos: um que criptografa e outro que descriptografa. Um deles não pode estar correto por si só. Eles só podem estar corretos em um par (você prova que descriptografar uma entrada criptografada produz o original). Mas para a criptografia, você quer que ela seja invencível e isso é algo que você não pode capturar com "correção".
precisa saber é o seguinte

1
@ DW Eu tenho que discordar um pouco. Embora os documentos de Rogaway e Bellare sejam grandes, isso implica que eles de alguma forma permitem provas de segurança de primitivos é enganoso. Ambos os trabalhos são essencialmente sobre protocolos (isto é, eles assumem que primitivos como AES, SHA, RSA etc.) são seguros e depois provam as coisas a partir daí. O problema essencial de provar que os primitivos são seguros permanece. Se você tiver alguma referência para provas de segurança de primitivos, eu estaria interessado. O segundo artigo, por exemplo, assume que o RSA é difícil, o que é um problema em aberto.
DRF

5

PP{P}c{Q}QQ{P}c{Q}
PP,QQ

P(n)P(0)P(1)P(2)nN. P(n)

MnP(n)Mn. P(n)Mn. P(n)


5

Problema: Imprima "Sim" se todo número par ≥ 4 for a soma de dois números primos e "Não" se houver um número par ≥ 4 que não seja a soma de dois números primos.

Algoritmo: Imprimir "Sim"

A maioria das pessoas pensa que o algoritmo está correto. Não há nenhuma prova conhecida, e é bem possível que não é nenhuma prova.


3

Qualquer algoritmo que esteja correto, mas não sabemos quanto tempo leva para executar, pode ser transformado em um algoritmo que pára em um período de tempo garantido, mas não temos certeza se está correto.

nn+10log(n)20n

P=NP

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.