RosettaCodeData/Task/Parallel-calculations/Prolog/parallel-calculations.pro

32 lines
916 B
Prolog

threaded_decomp(Number,ID):-
thread_create(
(prime_decomp(Number,Y),
thread_exit((Number,Y)))
,ID,[]).
threaded_decomp_list(List,Erg):-
maplist(threaded_decomp,List,IDs),
maplist(thread_join,IDs,Results),
maplist(pack_exit_out,Results,Smallest_Factors_List),
largest_min_factor(Smallest_Factors_List,Erg).
pack_exit_out(exited(X),X).
%Note that here some error handling should happen.
largest_min_factor([(N,Facs)|A],(N2,Fs2)):-
min_list(Facs,MF),
largest_min_factor(A,(N,MF,Facs),(N2,_,Fs2)).
largest_min_factor([],Acc,Acc).
largest_min_factor([(N1,Facs1)|Rest],(N2,MF2,Facs2),Goal):-
min_list(Facs1, MF1),
(MF1 > MF2->
largest_min_factor(Rest,(N1,MF1,Facs1),Goal);
largest_min_factor(Rest,(N2,MF2,Facs2),Goal)).
format_it(List):-
threaded_decomp_list(List,(Number,Factors)),
format('Number with largest minimal Factor is ~w\nFactors are ~w\n',
[Number,Factors]).