53 lines
1.3 KiB
Prolog
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).
|