Gostaria de saber se um tipo universalmente quantificado : é um subtipo ou caso especial, de um tipo quantificado existencialmente com a mesma assinatura:T a = ∀ X : { a ∈ X , f : X → { T , F } } T e T e = ∃ X : { a ∈ X , f : X → { T , F } }
Eu diria "sim": se algo é verdadeiro "para todos os X" ( ), também deve ser verdadeiro "para alguns X" ( ). Ou seja, uma declaração com ' ' é simplesmente uma versão mais restrita da mesma declaração com ' ':∃ X ∀ ∃ ∀ X , P ( X ) ?
Estou errado em algum lugar?
Antecedentes: Por que estou perguntando isso?
Estou estudando tipos existenciais para entender por que e como "Tipos abstratos de [dados] têm tipo existencial" . Não consigo entender bem esse conceito apenas com a teoria; Também preciso de exemplos concretos.
Infelizmente, é difícil encontrar bons exemplos de código, porque a maioria das linguagens de programação tem suporte limitado apenas para tipos existenciais. (Por exemplo, curingas de Haskell
forall
ou Java?
.) Por outro lado, tipos quantificados universalmente são suportados por muitas linguagens recentes via "genéricos".O que é pior, os genéricos parecem facilmente se misturar com os tipos existenciais , tornando ainda mais difícil diferenciar tipos existenciais de universais. Estou curioso para saber por que essa confusão ocorre com tanta facilidade. Uma resposta para essa pergunta pode explicar: se tipos universais são de fato apenas um caso especial de tipos existenciais, não é de admirar que tipos genéricos, como Java
List<T>
, possam ser interpretados de qualquer maneira.
forall x. P(x)
sim exists x. P(x)
. Se os sistemas de tipos levam isso em consideração ao verificar os tipos ... Não faço ideia. +1 para uma pergunta interessante.