Naprawdę podoba mi się to pytanie. Nie wiem zbyt wiele, ale mam kilka rzeczy (wspomaga artykuł w Wikipedii , który ma kilka zgrabnych tabel i takie samo):
Myślę, że typy sum / typy związków ( np. data Either a b = Left a | Right b
) Są równoważne rozłączeniu włączającemu . I chociaż nie jestem zbyt dobrze zaznajomiony z Curry-Howardem, myślę, że to pokazuje. Rozważ następującą funkcję:
andImpliesOr :: (a,b) -> Either a b
andImpliesOr (a,_) = Left a
Jeśli dobrze rozumiem, typ mówi, że ( a ∧ b ) → ( a ★ b ), a definicja mówi, że to prawda, gdzie ★ jest albo włączające, albo wyłączające, albo, w zależności od tego, co Either
reprezentuje. Masz Either
wyłączne reprezentowanie lub, ⊕; jednak ( a ∧ b ) ↛ ( a ⊕ b ). Na przykład ⊤ ∧ ⊤ ≡ ⊤, ale ⊤ ⊕ ⊥ ≡ ⊥ i ⊤ ↛ ⊥. Innymi słowy, jeśli zarówno a, jak i b są prawdziwe, to hipoteza jest prawdziwa, ale wniosek jest fałszywy, a więc implikacja ta musi być fałszywa. Jednak wyraźnie ( a ∧ b ) → ( a ∨ b ), ponieważ jeśli oba a i b są prawdziwe, to przynajmniej jedno jest prawdziwe. Tak więc, jeśli dyskryminowane związki są jakąś formą dysjunkcji, muszą być różnorodne. Myślę, że jest to dowód, ale nie wahaj się wyrzucić mnie z tego pojęcia.
Podobnie, twoje definicje tautologii i absurdu jako, odpowiednio, funkcji tożsamości i funkcji nie kończących się, są nieco dziwne. Prawdziwa formuła jest reprezentowana przez typ jednostki , który jest typem, który ma tylko jeden element ( data ⊤ = ⊤
; często pisany ()
i / lub Unit
w funkcjonalnych językach programowania). Ma to sens: skoro ten typ jest gwarantowana do zamieszkania, a ponieważ istnieje tylko jeden możliwy mieszkaniec, to musi być prawda. Funkcja tożsamości reprezentuje po prostu szczególną tautologię, którą a → a .
Twój komentarz na temat funkcji nie kończących się jest, w zależności od tego, co dokładnie miałeś na myśli, mniejszy. Curry-Howard działa w systemie typów, ale brak zakończenia nie jest tam kodowany. Według Wikipedii , do czynienia z braku rozwiązania jest problem, jak dodawanie produkuje sprzeczne logiki ( np mogę określić wrong :: a -> b
przez wrong x = wrong x
, a tym samym „udowodnić”, że → b dla dowolnego A i B ). Jeśli to właśnie miałeś na myśli mówiąc o „absurdzie”, to masz całkowitą rację. Jeśli zamiast tego miałeś na myśli fałszywe stwierdzenie, to zamiast tego potrzebujesz dowolnego niezamieszkanego typu, np. Czegoś zdefiniowanego przezdata ⊥
- to jest typ danych bez możliwości jego skonstruowania. Gwarantuje to, że nie ma żadnych wartości, więc musi być niezamieszkany, co jest równoważne z fałszem. Myślę, że prawdopodobnie mógłbyś również użyć a -> b
, ponieważ jeśli zabronimy funkcji niezakończonych, to również jest niezamieszkany, ale nie jestem w 100% pewien.
Wikipedia podaje, że aksjomaty są kodowane na dwa różne sposoby, w zależności od tego, jak interpretujesz Curry-Howard: albo w kombinatorach, albo w zmiennych. Myślę, że widok kombinatora oznacza, że podstawowe funkcje, które otrzymujemy, kodują rzeczy, które możemy powiedzieć domyślnie (podobnie do sposobu, w jaki modus ponens jest aksjomatem, ponieważ zastosowanie funkcji jest prymitywne). Myślę , że widok zmiennych może w rzeczywistości oznaczać to samo - w końcu kombinatory to tylko zmienne globalne, które są określonymi funkcjami. Jeśli chodzi o typy pierwotne: jeśli myślę o tym poprawnie, to myślę, że typy pierwotne to byty - obiekty prymitywne, o których próbujemy udowodnić.
Zgodnie z moją klasą logiki i semantyki fakt, że ( a ∧ b ) → c ≡ a → ( b → c ) (a także, że b → ( a → c )) nazywa się prawem równoważności eksportu, przynajmniej w naturalnej dedukcji dowody. Nie zauważyłem wtedy, że to po prostu curry - szkoda, że nie, bo to super!
Choć teraz mamy drogę do reprezentowania integracyjnego alternatywę, nie mamy sposobu reprezentowania wyłączne różnorodność. Powinniśmy umieć posłużyć się definicją wyłącznej dysjunkcji, aby ją przedstawić: a ⊕ b ≡ ( a ∨ b ) ∧ ¬ ( a ∧ b ). Nie wiem, jak napisać negację, ale wiem, że ¬ p ≡ p → ⊥ i zarówno implikacja, jak i fałsz są łatwe. Powinniśmy zatem być w stanie przedstawić wyłączną dysjunkcję poprzez:
data ⊥
data Xor a b = Xor (Either a b) ((a,b) -> ⊥)
To definiuje ⊥
pusty typ bez wartości, co odpowiada fałszowi; Xor
Następnie określono, że zawiera oba ( a ) lub b ( i ) i funkcja ( WPŁYW NA ) z (a, b) ( i ) do dna typu ( fałszywego ). Nie mam jednak pojęcia, co to oznacza . ( Edycja 1: Teraz rozumiem, zobacz następny akapit!) Ponieważ nie ma wartości typu (czy istnieją?), Nie mogę pojąć, co to oznaczałoby w programie. Czy ktoś zna lepszy sposób myślenia o tej lub innej definicji?Either
(a,b) -> ⊥
( Edycja 1: tak, camccann .)
Edycja 1: Dzięki odpowiedzi Camccanna (a dokładniej komentarzom, które zostawił, aby mi pomóc), myślę, że rozumiem, co się tutaj dzieje. Aby skonstruować wartość typu Xor a b
, musisz podać dwie rzeczy. Po pierwsze, świadek istnienia elementu albo a
albo b
jako pierwszego argumentu; to znaczy a Left a
lub a Right b
. Po drugie, dowód, że nie ma elementów obu typów a
i b
- innymi słowy, (a,b)
niezamieszkany dowód - jako drugi argument. Skoro będziesz mógł napisać funkcję tylko (a,b) -> ⊥
wtedy, gdy (a,b)
jest niezamieszkana, co to oznacza, że tak jest? Oznaczałoby to, że jakaś część obiektu typu(a,b)
nie można było zbudować; innymi słowy, że co najmniej jeden, a ewentualnie oba, a
i b
są niezamieszkanej, jak dobrze! W tym przypadku, jeśli myślimy o dopasowywaniu wzorców, nie byłoby możliwe dopasowanie do wzorca takiej krotki: zakładając, że b
jest to niezamieszkane, co byśmy napisali, co mogłoby pasować do drugiej części tej krotki? W związku z tym nie możemy dopasować do niego wzorców, co może pomóc ci zrozumieć, dlaczego powoduje to, że jest niezamieszkany. Otóż jedynym sposobem na uzyskanie funkcji całkowitej, która nie przyjmuje żadnych argumentów (tak jak ta musi, ponieważ (a,b)
jest niezamieszkana) jest uzyskanie wyniku również typu niezamieszkanego - jeśli myślimy o tym z perspektywy dopasowania wzorców, oznacza to, że nawet jeśli funkcja nie ma przypadków, nie ma możliwej treści może mieć jedno i drugie, więc wszystko jest w porządku.
Wiele z tego sprawia, że myślę na głos / udowadniam (miejmy nadzieję) rzeczy w locie, ale mam nadzieję, że jest to przydatne. Naprawdę polecam artykuł w Wikipedii ; Nie przeczytałem tego szczegółowo, ale zawarte w nim tabele są naprawdę fajnym podsumowaniem i jest bardzo dokładne.