A Coq tem um tipo Prop de proposições irrelevantes à prova que são descartadas durante a extração. Quais são as razões para isso, se usarmos o Coq apenas para provas. Prop é impredicativo, portanto Prop: Prop, no entanto, Coq infere automaticamente os índices do universo e podemos usar o Tipo (i) em qualquer lugar. Parece que Prop complica muito tudo.
Eu li que existem razões filosóficas para separar Set e Prop no livro de Luo, no entanto, não as encontrei no livro. O que eles são?
coq
dependent-type
Konstantin Solomatov
fonte
fonte
Respostas:
ℓ k k k ℓ P r o pP r o p é muito útil para a extração de programas, pois permite excluir partes do código que são inúteis. Por exemplo, para extrair um algoritmo de classificação, provaríamos a afirmação "para cada lista existe uma lista tal que é ordenado e é uma permutação de ". Se escrevermos isso em Coq e extraímos sem usar , obteremos:ℓ k k k ℓ P r o p
sort
verify
pi
pi
Embora o material extra não seja totalmente inútil, em muitos aplicativos queremos nos livrar dele e ficar justosP r o p k k ℓ ℓ k
sort
. Isso pode ser feito se usarmos para declarar " está ordenado" e " é uma permutação de ", mas não "para todos há ". k k ℓ ℓ kEm geral, uma maneira comum de extrair código é considerar uma declaração no formato que é inserido, é saída e explica o que significa para ser uma saída correta. (No exemplo acima, e são os tipos de lista e é " é ordenado e é uma permutação de .") Se estiver em então extração dá um mapa tal que vale para todosx y ϕ ( x , y ) y A B ϕ ( ℓ , k ) k k ℓ ϕ P r o p f : A → B ϕ ( x , f ( x ) ) x ∈ A ϕ S e t g g ( x ) ϕ ( x ,∀ x : A.∃ y: B.ϕ ( x , y) x y ϕ ( x , y) y UMA B ϕ ( ℓ , k ) k k ℓ ϕ P r o p f:A→B ϕ(x,f(x)) x∈A . Se é em então nós também terá uma função tal que é a prova de que detém, para todos . Muitas vezes, a prova é computacionalmente inútil e preferimos nos livrar dela, especialmente quando está aninhada profundamente em alguma outra declaração. nos dá a possibilidade de fazer isso.ϕ Set g g(x) x ∈ A P r o pϕ(x,f(x)) x∈A Prop
Adicionado em 29/07/2015: Há uma dúvida sobre se poderíamos evitar ao otimizar automaticamente "código inútil extraído". Até certo ponto, podemos fazer isso, por exemplo, todo o código extraído do fragmento negativo da lógica (coisas criadas a partir do tipo vazio, tipo de unidade, produtos) é inútil, pois apenas embaralha a unidade. Mas existem decisões de design genuínas que você precisa tomar ao usar . Aqui está um exemplo simpe, onde significa que estamos em e significa que estamos em . Se extrairmos de P r o p Σ T y p e ∃ P r o p Π n : N Σ b : { 0 , 1 } Σ k : NProp Prop Σ Type ∃ Prop n b k Π N : N Σ b : { 0 , 1 } ∃ K : N
fonte
é inconsistente. Normalmente, você deseja manter a possibilidade de adicionar o meio excluído, portanto, uma solução é manter uma grande eliminação e tornar o Prop predicativo. O outro é suprimir grande eliminação.
Coq fez os dois! Eles renomearam o predicativo Prop to Set e desativaram grande eliminação no Prop.
A expressividade obtida pela impredicatividade é "tranquilizadora", no sentido em que 99% da matemática "razoável" pode ser formalizada com ela, e sabe-se que ela é consistente em relação à teoria dos conjuntos. Isso torna provável que eles não o enfraquecem para algo como o Agda, que possui apenas universos predicativos.
fonte
Prop : Prop
, isso seria inconsistente. Em vez disso, quantificações sobre todas as proposições são novamente uma proposição.Mesmo que você não esteja interessado em extrair programas, o fato de
Prop
ser impredicativo permite criar alguns modelos que não podem ser construídos usando uma torre predicativa de universos. O IIRC Thorsten Altenkirch tem um modelo do Sistema F usando a impredicatividade da Coq.fonte