Mam odpowiedź na to pytanie, które może być nowe. W rzeczywistości zastanawiam się nad tym przez ostatnie 6 miesięcy i nie zostało to jeszcze opisane w gazetach.
Ogólna teza jest taka, że zasady rozumowania relacyjnego, takie jak „relacje logiczne”, „symulacje”, a nawet „niezmienniki”, są przejawami abstrakcji danych lub ukrywania informacji. Wszędzie tam, gdzie kryje się informacja, zasady te pojawiają się.
Pierwszymi ludźmi, którzy to odkryli, byli teoretycy automatów. Automaty mają stan ukryty. Potrzebujesz więc uzasadnienia relacyjnego, aby mówić o ich równoważności. Teoretycy automatów zmagali się z homomorfizmami przez jakiś czas, poddali się i wymyślili pojęcie zwane „relacyjnym pokryciem”, które jest formą relacji symulacyjnych.
Milner podjął ten pomysł w mało znanym, ale bardzo fundamentalnym artykule zatytułowanym „ Algebraiczne pojęcie symulacji między programami ” w 1971 r. Hoare znał go i wykorzystał przy tworzeniu „ Dowodu poprawności reprezentacji danych ” w 1972 r. (Ale wykorzystał abstrakcja funkcjonuje zamiast relacji, ponieważ uważał je za „prostsze”). Później wycofał roszczenie dotyczące prostoty i wrócił do używania relacji w „ Udoskonaleniu udoskonalania danych ”. Reynolds zastosował rozumowanie relacyjne w „ Craft of Programming", Rozdział 5 (1981). Myślał, że relacje są bardziej naturalne i ogólne niż funkcje abstrakcyjne. Jeśli wrócisz i przeczytasz ten rozdział, znajdziesz pomysły relacyjnej parametryczności czające się, czekające na odkrycie. Pewnie, dwa lata później, Reynolds opublikował „Typy, abstrakcja i polimorfizm parametryczny” (1983).
Wygląda na to, że wszystkie te pomysły nie mają nic wspólnego z typami, ale tak naprawdę mają. Stanowe języki i modele mają wbudowaną abstrakcję danych. Nie trzeba definiować „abstrakcyjnego typu danych”, aby ukryć informacje. Po prostu zadeklarujesz zmienną lokalną i ukryjesz ją. Możemy uczyć go studentów pierwszego roku na zajęciach z języka Java w ciągu pierwszych kilku tygodni. Bez potu
Z drugiej strony języki i modele funkcjonalne muszą ukrywać informacje za pomocą typów . Modele funkcjonalne nie mają wbudowanej abstrakcji danych. Musimy dodać to jawnie, używając lub . Jeśli więc przetłumaczysz język stanowy na język funkcjonalny, zauważysz, że cały stan lokalny jest tłumaczony na zmienne typu. Dokładny opis tego, jak to działa, znajduje się w moim artykule „ Obiekty i klasy w językach podobnych do Algolu ”, ale pomysły naprawdę pochodzą z Reynoldsa 1981 („Esencja Algolu”). Właśnie teraz lepiej rozumiemy te klasyczne pomysły.∃∀∃
Weź dwie maszyny i , które mają być równoważne. Milner 1971 mówi: zdefiniuj relację między stanami i i pokaż, że dwie maszyny zachowują relację. Parametryczność Reynoldsa mówi, pomyśl o stanach maszyn jako należących do typów i . Zdefiniuj relację między nimi. Jeśli maszyny są typu i , sparametryzowane według typów ich stanów, sprawdź, czy te dwie maszyny są powiązane relacją . M ′ M M ′ X X ′ R F ( X ) F ( X ′ ) F ( R )M.M.′M.M.′XX′RF(X)F(X′)F(R)
Zatem symulacje i parametryczna relacja to w zasadzie ten sam pomysł . To nie jest tylko powierzchowne podobieństwo. Pierwszy z nich jest przeznaczony dla języków stanowych, w których wbudowana jest abstrakcja danych. Ten drugi jest przeznaczony dla języków bezstanowych, w których pozyskiwanie danych odbywa się za pomocą zmiennych typu.
A co z relacjami logicznymi? Z pozoru logiczne relacje wydają się być bardziej ogólnym pomysłem. Podczas gdy parametryczność mówi o tym, jak powiązać zmienne typu w tym samym modelu, relacje logiczne wydają się odnosić typy w różnych modelach. (Dave Clarke napisał to znakomicie wcześniej). Mam jednak wrażenie (i nadal trzeba to wykazać), że jest to przypadek jakiejś formy parametryczności wyższego typu, która nie została jeszcze sformułowana. Bądź na bieżąco, aby uzyskać więcej postępów na tym froncie.
[Uwaga dodana] Związek między relacjami logicznymi a symulacjami omówiono w naszym najnowszym artykule Relacje logiczne i parametryczność: Program Reynoldsa dla teorii kategorii i języków programowania .