ℓ 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:ℓkkkℓP r o p
- "para todos existe " nos dará um mapa que leva listas para listas,kℓk
sort
- "tal que seja ordenado" fornecerá uma função que percorre e verifica se está classificada, ekk
verify
k
- " é uma permutação de " dará uma permutação que leva a . Observe que não é apenas um mapeamento, mas também o mapeamento inverso, juntamente com programas que verificam se os dois mapas são realmente inversos.ℓ ℓ kkℓ
pi
ℓkpi
Embora o material extra não seja totalmente inútil, em muitos aplicativos queremos nos livrar dele e ficar justos sort
. Isso pode ser feito se usarmos para declarar " está ordenado" e " é uma permutação de ", mas não "para todos há ". k k ℓ ℓ kP r o pkkℓℓk
Em 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)xyϕ ( x , y)yUMABϕ ( ℓ , k )kkℓϕP r o pf: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.ϕSetgg(x)x ∈ A P r o pϕ(x,f(x))x∈AProp
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 : NPropPropΣType∃Propn b k Π N : N Σ b : { 0 , 1 } ∃ K : N
Πn:NΣb:{0,1}Σk:Nn=2⋅k+b
obteremos um programa que decompõe em seu bit mais baixo os bits restantes , ou seja, ele calcula tudo. Se extrairmos de
, o programa calculará apenas o bit mais baixo . A máquina não sabe qual é a correta, o usuário precisa dizer o que deseja.
nbkbΠn:NΣb:{0,1}∃k:Nn=2⋅k+b
b