Jako nowicjusz w Prologu, dowiedziałem się, że rekurencja ogon jest zoptymalizowana. Dlatego staram się przekonwertować następujący program do ogon-rekurencyjnych. suma ([], 0). suma ([h | t], n): - suma (t, x), n to x ...

1
Woden 20 marzec 2021, 09:23

1 odpowiedź

Najlepsza odpowiedź

Problem polega na tym, że zapisałeś program błędnie. Byłoby to poprawne:

sum(List, Sum) :-
    sum_1(List, 0, Sum).

sum_1([], Sum, Sum).
sum_1([H|T], Sum0, Sum) :-
    Sum1 is Sum0 + H,
    sum_1(T, Sum1, Sum).

Ale możesz go zakazać niektórych wersji tego tutaj na stackoverflow.

Jest to również trywialnie fałd na liście:

sum([H|T], Sum) :-
    foldl(add, T, H, Sum).

add(X, Y, Z) :- Z is X + Y.
1
TA_intern 20 marzec 2021, 06:39