Zaczynam od patrzenia na język Mercury, co wydaje się bardzo interesujące. Jestem nowy w programowaniu logiki, ale dość doświadczony w programowaniu funkcjonalnym w Scali i Haskell. Jedną z rzeczy, nad którą się zastanawiałem, jest to, dlaczego potrzebujesz typów w programowaniu logicznym, gdy masz już predykaty, które powinny być co najmniej tak ekspresyjne jak typy.Jakie korzyści przynoszą typy w logicznych językach programowania, takich jak Mercury?
Na przykład, jakie korzyści ma do korzystania z typów w następującym fragmencie (zaczerpnięte z tutorialu rtęć):
:- type list(T) ---> [] ; [T | list(T)].
:- pred fib(int::in, int::out) is det.
fib(N, X) :-
(if N =< 2
then X = 1
else fib(N - 1, A), fib(N - 2, B), X = A + B
).
porównaniu do pisania przy użyciu tylko predykaty:
list(T, []).
list(T, [H | X]) :- T(H), list(T, X).
int(X) :- .... (builtin predicate)
fib(N, X) :-
int(N),
int(X),
(if N =< 2
then X = 1
else fib(N - 1, A), fib(N - 2, B), X = A + B
).
Zapraszam wskazać materiał wprowadzający, który obejmuje ten temat.
Edycja: Prawdopodobnie nie było jasne w formułowaniu pytania. Właściwie zacząłem spoglądać na Merkurego po zapoznaniu się z zależnymi językami pisania, takimi jak Idris, i tym samym sposobem, w jaki wartości mogą być używane w typach w zależnym typowaniu, w ten sam sposób, w jaki sposób predykaty mogą być używane w czasie kompilacji do sprawdzenia poprawności programów logicznych. Widzę korzyści wynikające z używania typów dla celów związanych z wydajnością w czasie kompilacji, jeśli ocena zajmuje dużo czasu (ale tylko wtedy, gdy typy są mniej złożone niż "implementacja", co niekoniecznie musi się zdarzyć, gdy mówimy o pisaniu zależnym). Moje pytanie brzmi, czy istnieją inne korzyści z używania typów oprócz czasu kompilacji.
Czy mówisz, że asercje typu run-time w logicznym języku programowania są w jakiś sposób lepszym zamiennikiem dla typów statycznych niż twierdzenia typu wykonawczego w językach funkcjonalnych lub proceduralnych? – wolfgang
Nie, byłem nieco niejasny, zobacz moją edycję pytania. –
Myślę, że to, czego szukam, to język z zautomatyzowanym twierdzeniem dowodzącym, jak Why3 lub Astrée. Minusem jest to, że te rozwiązania (takie jak rozwiązania SMT) są ograniczone i/lub nieprzewidywalne, podczas gdy systemy typu są solidne (ale również ograniczone). Wydaje się, że jest to aktywny obszar badań, a istnieją nawet projekty, które rozszerzają Haskella o rozwiązania SMT. –