fork(2) download
  1. %% Producer provides {peek, pull} interface to a generator
  2.  
  3. peek( prod(Curr,Next), Curr, prod(Curr,Next)).
  4. peek( prod(Next), C, prod(C,N) ):- next(Next,C,N).
  5. pull( prod(Curr,Next), Curr, prod(Next) ).
  6. pull( prod(Next), C, prod(N) ):- next(Next,C,N).
  7.  
  8. %% collect N elements produced by producer in a row
  9.  
  10. take( 0, Prod, Z-Z, Prod).
  11. take( N, Prod, [A|B]-Z, PZ):- N>0, !,
  12. pull(Prod, A, P1), N1 is N-1,
  13. take(N1,P1,B-Z,PZ).
  14.  
  15. %% Generator provides specific {next} implementation
  16.  
  17. next( hamm( A2,B,C3,D,E5,F,[H|G] ), H, hamm(X,U,Y,V,Z,W,G) ):-
  18. H is min(A2, min(C3,E5)),
  19. ( A2 =:= H -> B=[N2|U],X is N2*2 ; (X,U)=(A2,B) ),
  20. ( C3 =:= H -> D=[N3|V],Y is N3*3 ; (Y,V)=(C3,D) ),
  21. ( E5 =:= H -> F=[N5|W],Z is N5*5 ; (Z,W)=(E5,F) ).
  22.  
  23. mkHamm( prod( hamm(1,X,1,X,1,X,X)) ). % int_overflow @ 20,000 already
  24.  
  25. main(N) :-
  26. statistics(inferences,I1),
  27. ( mkHamm(P),take(20,P,A-[],_),write(A),nl,
  28. take(1691-1,P,_,P2),take(2,P2,B-[],_), write(B), nl,
  29. take( N -1,P,_,P3),take(2,P3,[C1|_]-_,_), write(C1), nl
  30. ),
  31. statistics(inferences,I2),
  32. Infs is I2 - I1, nl, write(' '), write(Infs), write(' Infs').
  33.  
  34. /*
  35. ON INTS:
  36.  
  37. [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36]
  38. [2125764000, 2147483648]
  39. 288325195312500000
  40.  
  41. 10k: 288325195312500000 70273 Infs time: 0.06s memory: 6204 kB
  42.  
  43. ON FLOATS (w/ overwhelming precision errors):
  44.  
  45. 10,000 2.56494e+17 70273 Infs time: 0.06s memory: 6204 kB
  46. 100k: 5.14728e+24 610273 Infs time: 0.54s memory: 6204 kB
  47. 500k: 1.02580e+28 3010273 Infs time: 4.60s memory: 6204 kB
  48. 1mln: 2.46193e+29 6010273 Infs time: 13.64s memory: 6204 kB
  49. */
Success #stdin #stdout 0.06s 6204KB
stdin
main(10000).
stdout
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36]
[2125764000, 2147483648]
288325195312500000

   70291 Infs