Jestem w sytuacji, w której muszę pokazać, że sprawdzanie typu ma decydujący wpływ na rachunek różniczkowy, nad którym pracuję. Do tej pory udało mi się udowodnić, że system silnie się normalizuje, a zatem równość definicyjna jest rozstrzygalna.
W wielu źródłach, które czytam, rozstrzygalność sprawdzania typów jest wymieniona jako następstwo silnej normalizacji i wierzę w to w tych przypadkach, ale zastanawiam się, jak się to faktycznie pokazuje.
W szczególności utknąłem w następujących kwestiach:
- To, że dobrze wpisane terminy silnie się normalizują, nie oznacza, że algorytm nie zapętla się w nieskończoność na niepoprawnie wpisanych wejściach
- Ponieważ relacje logiczne są zwykle używane do wykazania silnej normalizacji, nie ma wygodnej malejącej miary w miarę postępu sprawdzania typów. Więc nawet jeśli moje reguły typu są ukierunkowane na składnię, nie ma gwarancji, że stosowanie reguł ostatecznie zakończy się.
Zastanawiam się, czy ktoś ma dobre odniesienie do dowodu rozstrzygalności sprawdzania typu dla języka zależnego od typu? Jeśli jest to mały rachunek różniczkowy, nic nie szkodzi. Wszystko, co omawia techniki dowodowe do wykazania rozstrzygalności, byłoby świetne.
źródło
Odpowiedzi:
Rzeczywiście jest tu subtelność, choć w przypadku sprawdzania typu wszystko działa dobrze. Spiszę tutaj ten problem, ponieważ wydaje się, że pojawia się on w wielu powiązanych wątkach, i spróbuję wyjaśnić, dlaczego wszystko działa dobrze, gdy sprawdzanie typu w „standardowej” zależnej teorii typów (będę celowo niejasny, ponieważ problemy te pojawiają się niezależnie od tego):
Ten przyjemny fakt jest nieco trudny do udowodnienia i zrównoważony przez dość paskudny kontr-fakt:
Zależy to trochę od dokładnego sformułowania twojego systemu typów, ale większość „operacyjnych” systemów wdrożonych w praktyce spełnia fakt 2.
Oznacza to, że nie można „przejść do podokresów” podczas wnioskowania przez indukcję na podstawie pochodnych lub stwierdzić, że oświadczenie indukcyjne jest prawdziwe w odniesieniu do rodzaju terminu, w którym próbujesz coś udowodnić.
Fakt ten dość mocno cię gryzie, gdy próbujesz udowodnić pozornie niewinne stwierdzenia, np. Że systemy z konwersją typu są równoważne z systemami z konwersją bez typu.
Kluczowym przypadkiem (i jedynym przypadkiem, który naprawdę wymaga konwersji) jest aplikacja:
Każde wezwanie do normalizacji odbywało się na dobrze napisanych terminach, ponieważ jest to niezmiennik
infer
sukcesu.Nawiasem mówiąc, po wdrożeniu Coq nie ma decydującego sprawdzania typu, ponieważ normalizuje treść
fix
instrukcji przed próbą ich sprawdzenia.W każdym razie granice normalnych form dobrze sformułowanych terminów są tak astronomiczne, że twierdzenie o rozstrzygalności jest w tym momencie głównie akademickie. W praktyce uruchamiasz algorytm sprawdzania typu, dopóki masz cierpliwość, i wypróbowujesz inną trasę, jeśli do tego czasu się nie zakończyła.
źródło
infer(t u):
; aby go znaleźć, wyszukaj „tCheck r (App f a) =
”. Aby uzyskać bardziej kompletną, ale wciąż prostą implementację, możesz sprawdzić Morte'stypeWith
.