Por que a Agda e a Coq discordam da estrita positividade?

24

Eu me deparei com um desacordo confuso entre Agda e Coq que não está obviamente relacionado às distinções mais conhecidas entre suas teorias de tipos (por exemplo, (im) predicatividade, indução-recursão etc.).

Em particular, a seguinte definição é aceita pela Agda:

  data Ty : Set0 -> Set0 where
    c1 : Ty ℕ
    c2 : Ty (Ty ℕ)

enquanto a definição equivalente de Coq é rejeitada porque a aparência de [Ty _] como um índice em si mesmo em c2 é considerada uma violação de estrita positividade.

  Inductive Ty : Set -> Set :=
    | c1 : Ty nat
    | c2 : Ty (Ty nat).

De fato, este caso é quase literalmente um exemplo da Seção 14.1.2.1 de Coq'Art de violar uma estrita positividade:

  Inductive T : Set -> Set := c : (T (T nat)).

Mas não vejo as razões dessa diferença entre as teorias de tipos. O exemplo clássico de provar False usando uma ocorrência negativa de um tipo em um argumento construtor é claro para mim, mas não consigo ver como alguém pode derivar uma contradição desse estilo de indexação (independentemente de argumentos construtores estritamente positivos).

Examinando a literatura, o trabalho inicial de Dybjer Inductive Families faz um comentário imediato sobre a solução de Paulin-Mohring no artigo do CID com restrições um pouco diferentes e sugere vagamente que as diferenças podem estar relacionadas à impredicatividade, mas não é mais elaborada. O artigo de Dybjer parece permitir isso, enquanto o de Paulin-Mohring o proíbe claramente.

Aparentemente, não sou o primeiro a perceber essa diferença de opinião, e alguns acreditam que essa definição não deve ser permitida em nenhum dos sistemas ( https://lists.chalmers.se/pipermail/agda/2012/004249.html ), mas Não encontrei explicações sobre por que isso é válido em um sistema, mas não no outro, ou apenas uma diferença de opinião.

Então, suponho que tenho várias perguntas:

  1. Este é um exemplo de um tipo monótono, mas não estritamente positivo? (Na Coq; claramente a Agda considera estritamente positivo)
  2. Por que a Agda permite isso, enquanto a Coq o rejeita? É simplesmente uma diferença idiossincrática na interpretação de "estritamente positivo"; existe uma diferença sutil entre Coq e Agda que faz soar em Agda e não ser sólido em Coq, ou é uma questão de gosto impulsionada por preferências teóricas específicas?
  3. Existe uma diferença significativa entre a primeira definição acima e a definição indutiva-recursiva equivalente abaixo?

Definição indutivo-recursiva:

  mutual
    data U : Set0 -> Set0 where
      c : (i : Fin 2) -> U (T i)
    T : Fin 2 -> Set0
    T zero = ℕ
    T (suc zero) = U ℕ

Estou feliz por ter indicações para a literatura relevante.

Desde já, obrigado.

Colin Gordon
fonte
11
Até onde eu sei, Coq é mais rigoroso do que o permitido pela teoria subjacente, porque era mais fácil de implementar e útil o suficiente na prática. Essa resposta sobre um caso diferente, mas relacionado, é tão abrangente quanto o meu entendimento.
Gilles 'SO- stop be evil'
11
Esta definição não é aceita pela versão atual do desenvolvedor do Agda:Ty is not strictly positive, because it occurs in an index of the target type of the constructor c2 in the definition of Ty.
gallais
2
Sim, você está certo, alguém me apontou isso ontem à noite. Eu estava usando o pacote 2.3.0.1 do Debian, mas o 2.3.2.1 do Cabal rejeita as definições diretas e de IR. Parece que um bug aparentemente não relacionado tornou a verificação de positividade em índices mais rigorosa: code.google.com/p/agda/issues/detail?id=690 Como foi discutida na lista sem ser explicitamente marcada como um problema de solidez, ainda estou perguntando se o tipo em si é som.
Colin Gordon

Respostas:

10

A questão parece ser confusão resultante de uma confluência de dois fatores:

  1. Eu estava usando uma versão antiga do Agda (2.3.0.1). Parece que antes da 2.3.2, a Agda simplesmente não estava verificando estritamente positividade dos índices dos resultados do construtor (veja o bug que eu vinculei em outro lugar no segmento).
  2. Uma leitura mais atenta do artigo sobre Famílias Indutivas de Dybjer sugere que ele pode ter pretendido que o tipo indutivo definido não seja vinculado ao digitar os índices de um resultado de construtor . A Seção 3.2.1 fornece o esquema para construtores indutivos em prosa e, aparentemente, eu interpretei mal a linguagem que descreve os ambientes de ligação de cada parte do esquema.

É claro que essa leitura mais próxima é consistente com a verificação que a Coq e (versões recentes) da Agda executam, que proíbem qualquer aparência de T em seus próprios índices.

Colin Gordon
fonte
4

Uma possível razão para a diferença, como sugerem seus próprios comentários, é a impredicatividade. Coq historicamente tinha um conjunto impredicativo (ainda disponível como uma bandeira, acredito!)

Citando o livro de Adam Chlipala http://adam.chlipala.net/cpdt/html/Universes.html

As ferramentas Coq suportam um sinalizador de linha de comando -impredicative-set, que modifica Gallina de uma maneira mais fundamental, tornando Set impredicativo. Um termo como forall T: Set, T possui o tipo Set, e as definições indutivas em Set podem ter construtores que quantificam argumentos de qualquer tipo. Para manter a consistência, uma restrição de eliminação deve ser imposta, de forma semelhante à restrição para Prop. A restrição se aplica apenas a tipos indutivos grandes, nos quais algum construtor quantifica sobre um tipo de tipo Type. Nesses casos, um valor nesse tipo indutivo só pode ser correspondido por padrão para gerar um tipo de resultado cujo tipo é Set ou Prop. Esta regra contrasta com a regra para Prop, em que a restrição se aplica mesmo a tipos indutivos não grandes, e onde o tipo de resultado pode ter apenas o tipo Prop. Nas versões antigas do Coq, Set era impredicativo por padrão. Versões posteriores tornam Set predicativo para evitar inconsistência com alguns axiomas clássicos. Em particular, deve-se tomar cuidado ao usar um conjunto impredicativo com axiomas de escolha. Em combinação com a extensionalidade excluída do meio ou do predicado, pode resultar inconsistência. O conjunto impredicativo pode ser útil para modelar conceitos matemáticos inerentemente impredicativos, mas quase todos os desenvolvimentos da Coq ficam bem sem ele.

Carter Tazio Schonwald
fonte
Pelo som da correção que encontrei acima, parece que a Agda simplesmente não estava verificando a positividade dos índices para obter resultados de construtores. O que na verdade não indica se meu tipo proposto é monótono, mas sugere que não está relacionado à impredicatividade.
Colin Gordon
2
E sim, -impredicative-set torna Set impredicative em Coq.
Colin Gordon