Por que a aritmética de Peano basta: PA consegue codificar computações
(math.stackexchange.com)- PA não consegue provar o teorema de Goodstein completo
∀n G(n), mas, para cada número natural padrãon, é possível mostrar dentro da PA a existência de uma prova em PA deG(n) - A ideia central é lidar apenas com torres finitas de potências de
ωda altura necessária paran, e construir mecanicamente a prova por indução transfinita dentro desse intervalo - A altura necessária
mcorresponde à altura da hereditary base notation dene éO(log*(n)); usando a notação abreviadaω^[m], o tamanho da prova cai para cerca deO(m log m) - Esse resultado quer dizer que “é possível construir a prova de cada caso”, não que a PA prove o teorema de Goodstein completo
- A PA consegue codificar números, pares, listas, estados de programas e provas formais de lógica em um único número natural, de modo que também é possível verificar dentro da PA se a prova gerada é de fato uma prova em PA
Forma matemática da pergunta
-
O objeto de interesse é a proposição
G(n), que afirma que a sequência de Goodstein eventualmente chega a 0 -
A distinção conhecida é a seguinte
- A PA consegue provar cada caso concreto sobre números naturais padrão, como
G(15)eG(268) - A PA não consegue provar a proposição geral
∀n ∈ N: G(n)
- A PA consegue provar cada caso concreto sobre números naturais padrão, como
-
A pergunta é se a PA consegue provar uma proposição da seguinte forma
∀n ∈ N: ∃p ∈ N: P_PA(p, ⌜G(n)⌝) -
P_PA(p, ⌜φ⌝)significa quepé o código de uma prova deφdentro da PA -
A conclusão é que, nesse nível, a PA basta
O que a PA precisa provar
- Para cada
n, a PA precisa mostrar estas três coisas- É possível calcular o tamanho da prova necessário para provar
G(n) - O procedimento que constrói essa prova termina
- A última sentença da prova construída afirma a terminação de
G(n)
- É possível calcular o tamanho da prova necessário para provar
- Para cada
G(n), é possível construir uma prova em PA de tamanhoO(log*(n) log(log*(n))) log*é o logaritmo iterado (iterated logarithm), uma função que cresce muito lentamente- À medida que
ncresce, a prova necessária também fica maior; por isso, apenas isso não permite que a PA prove o teorema de Goodstein completo
Sequências de Goodstein e notação ordinal
-
Sequências de Goodstein usam hereditary base notation, que se conecta à representação de ordinais em forma normal de Cantor
-
Na construção de John von Neumann, ordinais são construídos como conjuntos
0é o conjunto vazio- Se existe um ordinal
ord, entãoord ∪ {ord}também é um ordinal - Se existe um conjunto
Xde ordinais, então a união deXtambém é um ordinal
-
A forma normal de Cantor representa um ordinal na forma
((n1, ord1), (n2, ord2), ..., (nk, ordk))- Cada
nié um número natural positivo - Cada
ordié um ordinal ord1 > ord2 > ... > ordk
- Cada
-
Essa notação representa o seguinte ordinal
n1·ω^ord1 + n2·ω^ord2 + ... + nk·ω^ordk -
A comparação é tratada como uma comparação lexicográfica na ordem
ord1,n1,ord2,n2; se um lado terminar antes, o lado mais curto é menor
Da indução à indução transfinita
- O quinto axioma da PA fornece indução sobre os números naturais
S(0)é verdadeiro- Se
S(n)é verdadeiro, entãoS(s n)também é verdadeiro - Então
Sé verdadeiro para todos os números naturais
- A partir disso, a PA consegue definir
<recursivamente e também provar a indução forte- Se, para todo
n, mostrar queS(n)é verdadeiro sempre queSfor verdadeiro para todos os números menores quen, entãoSé verdadeiro para todos os números naturais
- Se, para todo
- Em ZFC, é possível provar a indução transfinita, que é a indução forte sobre todos os ordinais
- Para objetos escritos em forma normal de Cantor, usam-se duas propriedades
- Uma sequência decrescente escrita em forma normal de Cantor é necessariamente finita
- É possível usar indução transfinita sobre objetos em forma normal de Cantor
O alcance da indução transfinita possível dentro da PA
- A PA não consegue provar indução transfinita para todos os ordinais
- Em vez disso, certos intervalos de ordinais de altura finita podem ser tratados dentro da PA
- Como a PA prova indução forte, ela consegue tratar a indução transfinita até
ω - Pela mesma lógica, também é possível provar indução transfinita para
ω^ω - Repetindo o mesmo método, é possível fazer isso para torres de altura finita como
ω^(ω^ω),ω^(ω^(ω^ω))etc.
- Como a PA prova indução forte, ela consegue tratar a indução transfinita até
- A prova de cada etapa muda apenas a altura da torre e é gerada mecanicamente
- Se a
m-ésima torre for escrita por extenso, o tamanho total da prova seráO(m^2) - Usando uma notação abreviada como
ω^[m], escrevermexige apenas comprimentoO(log m), de modo que a prova total fica emO(m log m) - Para cada ordinal abaixo de
ε₀, existe dentro da PA uma prova de indução transfinita para ele, mas unificar tudo isso exigiria uma prova de comprimento infinito - Se a PA provasse a indução transfinita para
ε₀, ela conseguiria provar sua própria consistência, o que entraria em conflito com o segundo teorema da incompletude de Gödel
Procedimento de geração de prova para cada G(n)
- Para um
nespecífico, só é necessária a altura de torre da hereditary base notation - Essa altura é
O(log*(n))e é tratada como uma função que a PA consegue calcular facilmente - Para uma entrada
n, o programa pode produzir- Provas de fatos comuns sobre a PA
- Uma prova de que
G(n)acompanha uma sequência decrescente dentro deω^[m]para algumm - O processo de cálculo desse
me uma prova do valor dem - Uma prova de indução transfinita para
ω^[0] - Uma prova de que a indução transfinita de
ω^[i]implica a indução transfinita deω^[i+1] - Provas de indução transfinita para cada etapa de
i = 0atém-2 - Uma prova de que a indução transfinita de
ω^[m-1]implica que toda sequência decrescente dentro deω^[m]é finita - A conclusão de que
G(n)termina
- A PA consegue provar o seguinte sobre esse procedimento
- O procedimento termina
- O procedimento gera uma lista de sentenças
- A lista começa com os axiomas de Peano
- Cada sentença segue logicamente das sentenças anteriores
- Por indução, todas as sentenças são provadas
- A última sentença é “
G(n)termina”
- Portanto, para qualquer número natural
n, a PA prova o fato de que a PA prova a terminação deG(n)
Como a PA codifica computações
- “Codificação” é uma forma de estabelecer que certo número natural representa certa estrutura
- Os materiais básicos da PA são
0- A função sucessor
(s n) - Igualdade
- O predecessor
(p n)para números diferentes de0 - Definições recursivas justificadas por indução
- Condicionais que ramificam conforme
0ou1
- Dentro da PA, é possível definir recursivamente funções aritméticas básicas como
<min,max+*- Potenciação
- Resto
% - Divisão inteira
//
- As propriedades básicas dessas funções podem ser provadas dentro da PA por indução
Criando estruturas de dados com um único número natural
- Para codificar dois números naturais em um único número natural, é possível usar um método que intercala bits na representação binária
- Bits em posições ímpares são
head - Bits em posições pares são
tail
- Bits em posições ímpares são
- A partir do par assim criado, é possível extrair novamente
headetail - Se é possível criar pares, também é possível representar listas encadeadas
- Usar
0comonil - Lista vazia
- Adicionar um elemento no início
- Ler cabeça e cauda
- Calcular comprimento
- Acessar posição arbitrária
- Inserir e remover
- Usar
- Com números, pares e listas, estruturas como pilhas, filas, árvores, documentos de texto e máquinas virtuais também podem ser representadas por um único número natural
Lisp e codificação de procedimentos computacionais
- Lisp é usado como uma linguagem conveniente para explicar parsing e interpretação por causa de sua estrutura de parênteses e do formato
command and arguments - Um número natural dentro da PA pode ser interpretado como um par
(type, value)- Número
- Booleano
- Par
- Lista
- Texto etc.
- Alguns números naturais podem não ser valores válidos de um tipo específico, mas os valores válidos podem representar uma estrutura de forma única
- Sobre essa codificação, é possível construir estruturas de dados Lisp, uma máquina virtual Lisp e um interpretador Lisp
- Como Lisp é Turing complete, por esse caminho é possível codificar dentro da PA qualquer procedimento computável e o estado desse procedimento
- O estado de uma computação após um número específico de etapas também pode ser representado e rastreado dentro da PA
A PA também codifica provas da PA
- Uma prova em lógica de primeira ordem pode ser vista como uma lista de sentenças
- Cada sentença é uma etapa de inferência
- Sentenças inválidas ou inferências inválidas também podem ser escritas, mas um procedimento de verificação consegue filtrá-las
- Dentro da PA, é possível criar um tipo como
type-proofe codificar uma prova como lista de sentenças - Os seguintes procedimentos de verificação também podem ser codificados dentro da PA
- Verificar se a prova é bem formada
- Verificar se cada etapa da prova é válida
- Verificar quais axiomas são assumidos
- Verificar se a conclusão final é a sentença desejada
- Se existe uma prova de certa sentença a partir de certos axiomas, então também existe um número natural específico da PA que representa essa prova
- Como a PA consegue expressar a computação que verifica se esse número é de fato um código de prova, é possível tratar a própria “prova dentro da PA” dentro da PA
- Gödel codificou a lógica dentro da PA sem precisar codificar toda a computação, mas, da perspectiva de programadores, entender isso via codificação de computações é um caminho natural
1 comentários
Opiniões no Hacker News
É um texto que expande uma pergunta do Stack Overflow em um post de blog
Trata dos limites do que pode ser provado com os axiomas de Peano e de como começar a fazer bootstrap de Lisp dentro deles
As piadas ruins estão todas na segunda seção, e correções ou perguntas de acompanhamento são bem-vindas
(defun not (x) ...)da seção "Why Lisp?"Isso ficou bem engraçado em conjunto com a parte posterior em que ele escreve que “é realmente fácil fazer um computador encontrar parênteses balanceados”, e também foi divertida a observação na seção "Basic Number Theory" sobre “deixar de enxergar a pilha de parênteses de fechamento”
Mesmo sem mexer com Lisp há muito tempo, consegui acompanhar de novo e pegar a ideia central, então achei o texto bom
Também é estranhamente fascinante que seja possível codificar computação usando apenas os axiomas de Peano, como se surgisse mais uma camada de autorreferência
Comecei recentemente a estudar mais teoria dos conjuntos e cheguei até as sequências de Goodstein; gostaria de recomendações de livros-texto para o próximo nível em teoria dos conjuntos avançada ou de materiais que tratem a aritmética de Peano em profundidade
Vários Lisps de https://t3x.org também implementam números e o restante usando células cons e apply/eval
O avaliador metacircular de John McCarthy é o código que Alan Kay chamou de “as equações de Maxwell do software”, e no SectorLISP ele é implementado com coisas como
ASSOC EVAL EVCON APPLY EVLIS PAIRLISAlguns Forths também são parecidos, e o Zenlisp da T3X explica em torno da forma como eval/apply chamam um ao outro recursivamente: http://t3x.org/zsp/index.html
\omegaDo ponto de vista de alguém que já fez tanto matemática quanto programação, mais do que a codificação da computação em si, o mais interessante é que a independência do teorema de Goodstein possa ser contornada por esse tipo de autorreferência
Parece significar que PA + “PA é ω-consistente” consegue provar o teorema de Goodstein, e talvez indução transfinita até ε₀ também possa ser possível de modo geral
Edit: fico pensando se PA + “PA é consistente” já não seria suficiente
Em essência, “PA é consistente” por si só não basta; se houver o princípio de reflexão uniforme de que “se PA prova algo, então isso é verdadeiro”, aí é suficiente
Não tenho 100% de certeza se esse princípio é equivalente à ω-consistência, mas pelo conteúdo a seguir parece ser essa a leitura: https://en.wikipedia.org/wiki/%CE%A9-consistent_theory#Relation_to_other_consistency_principles
A Wikipedia descreve T ser ω-consistente como “T + RFN_T + o conjunto de todas as sentenças verdadeiras é consistente”, o que parece significar o mesmo que “T + RFN_T é verdadeiro”
Essencialmente, você constrói uma metaprova sobre o que PA prova e, se confia em PA, acaba confiando também nessa metaprova
Mas não entendo bem como PA + “PA é consistente” seria suficiente
Esse sistema parece permitir um modelo em que o teorema de Goodstein é verdadeiro nos naturais padrão, mas falso para algum inteiro não padrão N; e justamente esse caso parece ser excluído pela ω-consistência, mais forte
Ou seja, não é um problema específico de Con(PA), mas um fenômeno mais geral: https://math.stackexchange.com/questions/5003237/can-goodsteins-theorem-be-proven-in-mathrmpa-conpa
Em relação à primeira pergunta, fico curioso sobre como codificar a ω-consistência como uma fórmula de PA
Então parece que PA + “PA é consistente” poderia provar a indução transfinita sobre ε₀
O ChatGPT disse que PA + “PA é consistente” por si só não é suficiente e, como deve ter digerido bastante livro-texto de lógica, acho que dá para confiar nessa afirmação
Quando usei aritmética de Peano pela primeira vez, fiquei bastante surpreso com seu poder expressivo
No começo ela parece um sistema básico, mas, depois que você percebe que a própria computação pode ser codificada dentro de PA e que vários tipos de computação podem ser simulados, coisas que pareciam complicadas começam a se encaixar
Gostaria de recomendações de materiais que expliquem essas técnicas de codificação de forma amigável para iniciantes
Isto é muito parecido com a teoria de Boyer-Moore. Essa teoria também constrói a matemática a partir do nível dos axiomas de Peano.
Boyer e Moore também criaram um provador automático de teoremas adaptado a essa teoria, e há uma cópia que roda em GNU Common Lisp em https://github.com/John-Nagle/nqthm/tree/master
Segundo a explicação deles, fica fácil pensar no programa como um estudante de matemática razoavelmente bom. Se você der apenas os axiomas de Peano, é difícil esperar que ele prove ou descubra o teorema da fatoração em primos, mas, se junto com os axiomas de Peano você fornecer uma lista de teoremas como “prove a comutatividade da adição”, “prove que a multiplicação é distributiva em relação à adição”, “prove que o resultado da função GCD divide os dois argumentos”, ele consegue lidar bem com isso.
Artigo: https://www.cs.utexas.edu/~boyer/acl.pdf
O comentário feito a JoJoModding no Math StackExchange está errado.
A explicação de que “PA pode provar que ela mesma produz uma prova, mas talvez não consiga provar que essa prova tem comprimento finito” erra o ponto central.
Se PA prova “PA prova X”, então PA pode provar X.
O ponto importante não é que existam modelos não padrão, mas que o modelo padrão dos números naturais é um modelo de PA.
Portanto, se PA prova “PA prova X”, então de fato existe um número natural finito padrão que corresponde à prova codificada de “PA prova X”, e com esse número é possível construir uma prova de X dentro de PA.
O que foi mostrado não é “PA prova
Provable(forall n, G(n))”, mas sim “PA provaforall n, Provable(G(n))”.No primeiro caso, de fato se seguiria que “PA prova
forall n, G(n)”, mas o segundo é diferente.Sem fazer referência às sequências de Goodstein, eu gostaria de ver um argumento de que, para uma proposição geral
P, provarforall n, Provable(P(n))não permite provarProvable(forall n, P(n)).Dentro de PA, é possível construir uma função que pesquisa todas as provas que PA pode produzir e, com base nisso, criar uma função
will-returnque analisa se determinada função e entrada irão retornar.Isso se parece com uma tentativa de resolver o problema da parada, então nem sempre funciona, mas funciona em muitos casos.
Se então criarmos
opposite-return, ela pode ser construída para tentar retornar quando a função e a entrada dadas não retornam, e para não retornar quando retornam.Considerando
(opposite-return opposite-return opposite-return)da mesma forma que na prova padrão do problema da parada, PA pode provar que “se PA puder provar queopposite-returnretorna, então na verdade ela não retorna”, “se PA puder provar que ela não retorna, então na verdade ela retorna”, “se PA puder realmente provar tudo aquilo que prova que ela mesma prova, então deve ter uma prova de uma das duas proposições anteriores”, “portanto, nesse caso, PA é inconsistente”.Isso é uma forma do segundo teorema da incompletude de Gödel, e por isso “PA prova” e “PA prova que ela mesma prova” precisam ser distinguidos.
Portanto, a prova proposta não funciona dentro de PA, e parece que esse é justamente o ponto do comentário.
https://math.stackexchange.com/questions/4408124/what-does-the-kirby-paris-theorem-mean
Conversando com alguém sobre tipos de dados indutivos, mostrei uma definição
zero/succcomo oNatdo Lean ou do Rocq.A outra pessoa perguntou: “isso é tudo? E os axiomas de Peano? Existe algo mais primitivo que tipos de dados indutivos?”, e achei interessante.
Isso me lembrou que é melhor ver os axiomas de Peano como uma dentre várias escolhas de projeto, em vez de algo obviamente embutido.
Isso porque todo tipo de dado indutivo pode ser construído usando números naturais junto com construtores primitivos de tipos, por exemplo Π, Σ, =, Ω etc.
Apenas o cálculo lambda puro também é suficiente. Isso porque o cálculo lambda codifica a computação.
Sobre a consistência de PA, é possível provar dentro de PA: https://youtu.be/6pjLmmkZnIA
O segundo teorema da incompletude de Gödel mostra que, se PA puder provar sua própria consistência, então PA é inconsistente e, portanto, pode provar qualquer coisa, incluindo falsidades.
O trabalho linkado não mostrou uma inconsistência de PA; ele definiu um novo sentido mais fraco para a afirmação de que PA “prova sua própria consistência” e então mostrou que PA consegue fazer essa coisa mais fraca.
É um trabalho interessante, mas só faz sentido para quem já sabe bastante lógica.
Este texto recebeu 123 pontos, mas o post do SO linkado tem apenas 11 votos positivos.
Somando a reputação de que postar ali torna fácil ter o conteúdo apagado com o limite de 15 pontos, parece que muita gente não consegue votar positivamente.