Chciałbym wiedzieć, czy uniwersalnie skwantyfikowany typ : T a = ∀ X : { a ∈ X , f : X → { T , F } } jest podtypem lub przypadkiem szczególnym skwantyfikowanego egzystencjalnie wpisz T e z tym samym podpisem: T e = ∃ X : { a ∈ X , f : X → { T , F } }
Powiedziałbym „tak”: Jeśli coś jest prawdą „dla wszystkich X” ( ), to musi być również prawdziwe „dla niektórych X” ( ∃ X ). Oznacza to, że instrukcja z „ ∀ ” jest po prostu bardziej ograniczoną wersją tej samej instrukcji z „ ∃ ”: ∀ X , P ( X ) ?
Czy gdzieś się mylę?
Tło: Dlaczego o to pytam?
Studiuję typy egzystencjalne, aby zrozumieć, dlaczego i jak „typy abstrakcyjne [dane] mają typ egzystencjalny” . Nie mogę dobrze zrozumieć tej koncepcji na podstawie samej teorii; Potrzebuję też konkretnych przykładów.
Niestety trudno znaleźć dobre przykłady kodu, ponieważ większość języków programowania ma ograniczoną obsługę typów egzystencjalnych. (Na przykład symbole wieloznaczne Haskella
forall
lub Javy?
.) Z drugiej strony typy uniwersalne są obsługiwane przez wiele najnowszych języków za pomocą „ogólnych”.Co gorsza, generyczne wydają się łatwo mieszać z typami egzystencjalnymi , co jeszcze bardziej utrudnia odróżnienie typów egzystencjalnych od uniwersalnych. Jestem ciekawy, dlaczego takie pomieszanie występuje tak łatwo. Odpowiedź na to pytanie może to wyjaśnić: jeśli typy uniwersalne są rzeczywiście tylko szczególnym przypadkiem typów egzystencjalnych, nic dziwnego, że typy ogólne, np. Java
List<T>
, mogą być interpretowane w obie strony.
forall x. P(x)
tak exists x. P(x)
. Czy systemy typów uwzględniają to przy sprawdzaniu typów ... Nie mam pojęcia. +1 za interesujące pytanie.