Há pouco tempo, alguém primeiro me disse que call / cc podia permitir objetos de prova para provas clássicas, implementando a lei de Peirce. Eu pensei um pouco sobre o assunto recentemente e não consigo encontrar uma falha nele. No entanto, eu realmente não consigo ver mais ninguém falando sobre isso. Parece vazio de discussão. O que da?
Parece-me que se você tem uma construção como em algum contexto, então uma das duas coisas é verdadeira. Você tem acesso a uma instância alguma forma no contexto atual, caso em que o fluxo de controle nunca chegaria aqui e estamos seguros de assumir qualquer OR, considerando que significa a única maneira pela qual pode retornar é construindo uma instância de e aplicando-a em dois argumentos (uma instância de . Nesse caso, já havia ALGUM modo de construir uma instância de ; parece razoável que o call / cc retire essa construção para mim. Meu raciocínio aqui parece um pouco suspeito para mim, mas minha confusão ainda permanece. Se call / cc não estiver apenas criando uma instância de P do nada (não vejo como é), então qual é o problema?
Alguns termos bem digitados que não contêm chamada / cc não têm formas normais? Existe alguma outra propriedade dessas expressões que as faça suspeitar? Existe alguma razão para que um construtivista não goste de call / cc?
Respostas:
A matemática construtiva não é apenas um sistema formal, mas uma compreensão do que é a matemática. Ou, em outras palavras, nem todo tipo de semântica é aceito por um matemático construtivo.
Para um matemático construtivo,p ∨ ¬ p
call/cc
parece trapaça. Considere como testemunhamos usando :call/cc
call/cc
O entendimento construtivo da disjunção é a decidibilidade algorítmica , mas o acima exposto dificilmente toma decisões. Como teste, um matemático construtivo pode perguntar como
call/cc
ajuda a provar que toda máquina de Turing para ou diverge. E qual é o programa que testemunha esse fato? (Deve ser o Oracle Halting.)fonte
Como você observa, existe uma possível interpretação construtiva da lógica clássica nesse sentido. O fato de a lógica clássica ser equiconsistente à lógica intuicionista (por exemplo, Heyting Aritmética) já é conhecido há algum tempo (já em 1933, por exemplo, Godel ) usando uma tradução em dupla negação.
Por um argumento mais sofisticado, pode ser demonstrado que o Peano Arithmetic é conservador sobre o HA para declarações de . A essência do resultado é que as provas clássicas de Π 0 2 envolvendo c uma l l / c c têm o mesmo conteúdo computacional como uma indicação sem que construo (por um CPS transformação).Π02 Π02 call/cc
No entanto, isto é não é verdade para as demonstrações acima : declarações em Σ 0 3 , demonstráveis em PA, não pode ter uma forma passível normal a extração de uma testemunha! Os cientistas da computação podem não se importar com a computação com provas nesse nível, mas é um pouco inconveniente para considerações filosóficas : provamos a existência de alguma coisa ou não?Π02 Σ03
Eu acho que isso resume por que "fixação" lógica não-construtiva através da adição de pode ser insatisfatória.call/cc
Dito isto, há muito trabalho explorando os aspectos computacionais da computação dentro da estrutura "clássica de Curry-Howard", por exemplo, a Krivine Machine, o cálculo Parigot ( ) e muitos outros. Veja aqui uma visão geral.λμ¯¯¯μ~
Edit: Uma pergunta muito relevante sobre mathoverflow aparece aqui: /mathpro/29577/solved-sequent-calculus-as-programming-language
fonte
inr (fun x -> callcc(...))
mesmoConcordo com a resposta de Andrej e Cody. No entanto, acho que também vale a pena mencionar por que os construtivistas devem se preocupar com os operadores de controle (call / cc).
Esses operadores geralmente estão conectados à lógica clássica porque, quando as pessoas observam suas regras de digitação (Felleisen, Griffin), elas percebem que os tipos têm a forma da Lei de Peirce ou a eliminação da dupla negação (¬ ¬ P⊢ P ) No entanto, os operadores de controle foram inventados na configuração não tipada da linguagem de programação Scheme. Seu objetivo era poder enriquecer a linguagem de programação: em vez de escrever programas no estilo de passagem de continuação, seria possível escrever programas no estilo direto usando operadores de controle.
Um ganho no uso de operadores de controle na Teoria da Prova é o metodológico: em vez de usar uma tradução com negação dupla e A para extrair programas de provas deΠ0 02 - Teoremas da aritmética clássica, usaria-se um operador de controle e realizaria a normalização de reescrita direta na prova.
Outro ganho que um construtivista deve se preocupar é que os operadores de controle mostram uma maneira de construir uma extensão da lógica intuicionista de Curry-Howard que ainda é construtiva. Por exemplo, limitando oP da lei de eliminação da dupla negação à Σ0 01 -classe de fórmulas, permite ter um operador de controle digitado que pode provar, por exemplo, o princípio de Markov ou o deslocamento de dupla negação . Esses princípios geralmente não são aceitos pelos construtivistas, mas apenas por uma boa razão, pois é sabido que eles não destroem as propriedades Disjunção e Existência quando adicionadas à lógica intuicionista.
fonte