Existe uma maneira de provar o seguinte teorema em Coq?
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
EDIT : Uma tentativa de dar uma breve explicação sobre "o que é irrelevância para a prova" (corrija-me alguém se eu estiver errado ou impreciso)
A idéia básica é que, no mundo das proposições (ou do Prop
tipo Coq), o que você (e você deveria) realmente se importa é a provabilidade de uma proposição, não as provas dela, pode haver muitas (ou nenhuma). Caso você tenha várias provas, do ponto de vista da provabilidade, elas são iguais no sentido em que provam a mesma proposição . Portanto, a distinção deles é irrelevante. Isso difere do ponto de vista computacional, onde você realmente se preocupam com a distinção de dois termos, por exemplo, basicamente, você não quer que os dois habitantes do bool
tipo (ou Set
, nas palavras de Coq), ou seja, true
e false
para ser igual. Mas se você os colocar Prop
, eles serão tratados da mesma forma.
Respostas:
A irrelevância da prova em geral não está implícita na teoria por trás da Coq. Mesmo a irrelevância da prova para a igualdade não está implícita; é equivalente ao axioma K de Streicher . Ambos podem ser adicionados como axiomas .
Existem desenvolvimentos em que é útil raciocinar sobre objetos de prova, e a irrelevância da prova torna isso quase impossível. Pode-se argumentar que esses desenvolvimentos deveriam ter todos os objetos cuja estrutura é importante
Set
, mas com a teoria básica de Coq a possibilidade existe.Há uma subcasa importante da irrelevância da prova que sempre é válida. O axioma K de Streicher sempre se aplica a domínios decidíveis, ou seja, as provas de igualdade em conjuntos decidíveis são únicas. A prova geral está no
Eqdep_dec
módulo da biblioteca padrão da Coq. Aqui está o seu teorema como corolário (minha prova aqui não é necessariamente a mais elegante):Para este caso especial, aqui está uma prova direta (inspirada na prova geral em
Eqdep_dec.v
). Primeiro, defina que definimos uma prova canônicatrue=b
(como de costume no Coq, é mais fácil ter a constante primeiro). Então mostramos que qualquer prova dissotrue=b
precisa serrefl_equal true
.Se você adicionar lógica clássica ao Coq, terá irrelevância à prova. Intuitivamente falando, a lógica clássica fornece um oráculo de decisão para proposições, e isso é bom o suficiente para o axioma K. Há uma prova no módulo de biblioteca padrão da Coq
Classical_Prop
.fonte