/* Euler Problem 12 in SICStus Prolog Problem 12 """ The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... Let us list the factors of the first seven triangle numbers: 1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 We can see that the 7th triangle number, 28, is the first triangle number to have over five divisors. Which is the first triangle number to have over five-hundred divisors?") """ Model created by Hakan Kjellerstrand, hakank@gmail.com See also my SICStus Prolog page: http://www.hakank.org/sicstus_prolog/ */ :- ensure_loaded(hakank_utils). go :- L = [ euler12a % , % euler12b ], run_problems(L). %% %% 0.145s %% euler12a :- e12a(0,0,Num,0,_Len), writeln(Num). e12a(_N,Num,Num,Len,Len) :- Len > 500. e12a(N,Num0,Num,Len0,Len) :- Len0 < 500, Num1 is Num0+N+1, % the N'th triangle number num_divisors(Num1,Len1), N1 is N+1, e12a(N1,Num1,Num,Len1,Len). %% %% 0.165s %% euler12b :- Limit = 500, Found = _, ( for(I,1, 15000), param(Limit,Found) do p12b(I,T,Len), (var(Found), Len >= Limit) -> writeln(T), Found = true ; true ). p12b(N, T, Len) :- triangle(N,T), num_divisors(T,Len).