Um sistema de tipos pode servir como assistente de prova para funções estrangeiras?

9

Dado que:

  1. Uma linguagem com sistemas do tipo muito expressivo (por exemplo, Idris ) também pode ter mecanismos de escape como interfaces de função estrangeira / unsafePerformIO.
  2. Existem assistentes de prova que podem ser usados ​​para provar algumas propriedades de um programa escrito em um idioma que não possui um sistema de tipos capaz de expressar essas propriedades.
  3. A correspondência de Curry-Howard mostra que uma implementação verificada com êxito de uma função com um determinado tipo é uma prova do que é expresso por esse tipo.

Pode-se expressar provas não triviais de alguma propriedade do código de idioma estrangeiro no sistema de tipos do idioma nativo?

Por exemplo, finja que tenho uma função C chamada stable_qsort que classifica números de uma maneira terrivelmente inteligente e eficiente, mantendo a ordem dos elementos já iguais, e um programa Idris que chama stable_qsort por meio de seu FFI, mas não confio nisso relativamente obscuro Função C. Posso provar que a função não reordena elementos iguais, para todas as entradas, no meu código Idris, em vez de usar um assistente de prova separado?

Dukereg
fonte

Respostas:

10

Para encurtar a história: não, você não pode. Uma função estrangeira é como uma caixa preta e o tipo que você atribui a ela é uma promessa que você faz: na correspondência de Curry-Howard, que corresponderia a adicionar um axioma à sua teoria.

Dito isto, existem maneiras. Em Coq, por exemplo, existem várias formalizações do padrão C (por exemplo , o trabalho de Robbert Krebbers ). Como você tem uma representação explícita dos programas C e sua semântica, você pode escrever seu código diretamente no assistente de prova e, em seguida, é possível provar algumas de suas propriedades.

Gallais
fonte