RosettaCodeData/Task/Harmonic-series/Prolog/harmonic-series.pro
2023-07-01 13:44:08 -04:00

53 lines
1.3 KiB
Prolog

main:-
print_harmonic_series(20),
nl,
nth_harmonic_number(100, T),
Num is numerator(T),
Denom is denominator(T),
writef('100th harmonic number: %t/%t\n', [Num, Denom]),
nl,
print_first_harmonic_greater_than(10).
print_harmonic_series(N):-
writef('First %t harmonic numbers:\n', [N]),
harmonic_first(H),
print_harmonic_series(N, H).
print_harmonic_series(N, H):-
H = h(I, T),
Num is numerator(T),
Denom is denominator(T),
writef('%3r. %t/%t\n', [I, Num, Denom]),
(I == N, ! ; harmonic_next(H, H1), print_harmonic_series(N, H1)).
print_first_harmonic_greater_than(N):-
harmonic_first(H),
print_first_harmonic_greater_than(1, N, H).
print_first_harmonic_greater_than(N, L, _):-
N > L,
!.
print_first_harmonic_greater_than(N, L, H):-
H = h(P, T),
(T > N ->
writef('Position of first term >%3r: %t\n', [N, P]),
N1 is N + 1
;
N1 = N),
harmonic_next(H, H1),
print_first_harmonic_greater_than(N1, L, H1).
harmonic_first(h(1, 1)).
harmonic_next(h(N1, T1), h(N2, T2)):-
N2 is N1 + 1,
T2 is T1 + 1 rdiv N2.
nth_harmonic_number(N, T):-
harmonic_first(H),
nth_harmonic_number(N, T, H).
nth_harmonic_number(N, T, h(N, T)):-!.
nth_harmonic_number(N, T, H1):-
harmonic_next(H1, H2),
nth_harmonic_number(N, T, H2).