Este submit foi inspirado por algumas discussões recentes com o Bjoern Bringmann.
Os pacotes simbólicos de software program de matemática são altamente desenvolvidos para muitas tarefas matemáticas em áreas como álgebra, cálculo e análise numérica. No entanto, até onde eu sei, não temos ferramentas igualmente sofisticadas para verificar as estimativas assintóticas – desigualdades que deveriam manter para parâmetros arbitrariamente grandes, com perdas constantes. Particularmente importantes são estimativas funcionais, onde os parâmetros envolvem uma função ou sequência desconhecida (vivendo em algum espaço de função adequado, como um espaço); Mas, para esta discussão, focarei na situação mais simples de estimativas assintóticas que envolvem um número finito de números reais positivos, combinados usando operações aritméticas, como adição, multiplicação, divisão, exponenciação e mínimo e máximo (mas sem subtração). Uma desigualdade típica aqui pode ser a fraca desigualdade média aritmética-geométrica
onde são números reais positivos arbitrários e os Aqui indica que estamos dispostos a perder uma constante não especificada nas estimativas.
Eu desejei no passado (por exemplo, Nesta resposta MathOverflow) para uma ferramenta que poderia determinar automaticamente se essa estimativa period verdadeira ou não (e fornecer uma prova se for verdade ou um contra -exemplo assintótico se false). Em princípio, as desigualdades simples dessa forma podem ser resolvidas automaticamente pela divisão de casos de força bruta. Por exemplo, com (1)um primeiro observa que é comparável a até constantes, por isso basta determinar se
Em seguida, para resolver o máximo, pode -se dividir em três casos: ; ; e . Suponha que, por exemplo, que . Então a estimativa para provar simplifica para
e este é (depois de tomar logaritmos) uma combinação linear positiva das hipóteses Assim, . A tarefa de determinar essa combinação linear é uma tarefa de programação linear padrão, para a qual existem muitos pacotes de software program de computador.
Qualquer desigualdade não é muito difícil de resolver manualmente, mas há aplicações nas quais é preciso verificar um grande número dessas desigualdades ou dividir em um grande número de casos. Vou dar um exemplo aleatoriamente de um Papel antigo meu (adaptado da equação após (51) e ignorando alguns termos de epsilon para simplificar): eu queria estabelecer a estimativa
para qualquer
onde Assim, e são o máximo, mediano e o mínimo de respectivamente, e da mesma forma Assim, e e . Esse limite em specific pode ser despachado em três ou quatro linhas de algumas desigualdades mais simples; Mas levou algum tempo para criar essas desigualdades, e eu tive que fazer uma dúzia de desigualdades adicionais desse tipo. Esta é uma tarefa que parece extremamente madura para a automação, principalmente com a tecnologia moderna.
Recentemente, tenho feito muito mais codificação (em Python, principalmente) do que no passado, auxiliado pela notável instalação de grandes modelos de idiomas para gerar amostras iniciais de código para muitas tarefas diferentes ou para preenchimento automático de código parcialmente escrito. Na maioria das vezes, me restringi a tarefas de codificação bastante simples, como calcular e, em seguida, plotar algumas funções matemáticas levemente complicadas ou fazer alguma análise de dados rudimentares em algum conjunto de dados. Mas decidi me dar a tarefa mais desafiadora de codificar um verificador que poderia lidar com as desigualdades da forma acima. Após cerca de quatro horas de codificação, com assistência frequente de um LLMPude produzir uma ferramenta de prova de conceito para isso, que pode ser encontrada em Este repositório do GitHub. Por exemplo, para verificar (1)o código Python relevante é
a = Variable("a")
b = Variable("b")
c = Variable("c")
assumptions = Assumptions()
assumptions.can_bound((a * b * c) ** (1 / 3), max(a, b, c))
e a saída (um tanto detalhada) verificando a desigualdade é
Checking if we will sure (((a * b) * c) ** 0.3333333333333333) by max(a, b, c) from the given axioms.
We are going to cut up into the next instances:
((b <~ a, c <~ a), (a <~ b, c <~ b), (a <~ c, b <~ c))
Attempting case: ((b <~ a, c <~ a),)
Simplify to proving (((a ** 0.6666666666666667) * (b ** -0.3333333333333333)) * (c ** -0.3333333333333333)) >= 1.
Certain was confirmed true by multiplying the next hypotheses :
b <~ a raised to energy 0.33333333
c <~ a raised to energy 0.33333333
Attempting case: ((a <~ b, c <~ b),)
Simplify to proving (((b ** 0.6666666666666667) * (a ** -0.3333333333333333)) * (c ** -0.3333333333333333)) >= 1.
Certain was confirmed true by multiplying the next hypotheses :
a <~ b raised to energy 0.33333333
c <~ b raised to energy 0.33333333
Attempting case: ((a <~ c, b <~ c),)
Simplify to proving (((c ** 0.6666666666666667) * (a ** -0.3333333
333333333)) * (b ** -0.3333333333333333)) >= 1.
Certain was confirmed true by multiplying the next hypotheses :
a <~ c raised to energy 0.33333333
b <~ c raised to energy 0.33333333
Certain was confirmed true in all instances!
É claro que isso é uma prova extremamente deselegante, mas a elegância não é o ponto aqui; Pelo contrário, é automatizado. (Veja também isso Artigo recente de Heather Macbeth Para como os estilos de redação de prova mudam na presença de ferramentas automatizadas, como assistentes formais de prova.)
O código está próximo de também ser capaz de lidar com estimativas mais complicadas, como (3); No momento, não escrevi código para lidar adequadamente com hipóteses como que envolvem expressões complexas, como em oposição a hipóteses que envolvem apenas variáveis atômicas, como Assim, mas posso pelo menos lidar com expressões tão complexas nos lados esquerdo e direito da estimativa que estou tentando verificar.
De qualquer forma, o código, sendo uma mistura de código gerado por LLM e minhas próprias habilidades rudimentares do Python, dificilmente é um exemplo de codificação eficiente ou elegante, e tenho certeza de que existem muitos programadores especializados que podem fazer um trabalho muito melhor. Mas acho que isso é prova de conceito de que uma ferramenta mais sofisticada desse formulário poderia ser prontamente criada para realizar tarefas mais avançadas. Uma tarefa de exemplo foi a que eu dei na questão acima do MathOverflow, ou seja, capaz de verificar automaticamente uma reivindicação como