| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | :- object(primes(_Threads)). | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	:- info([ | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 		version is 1.2, | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 		author is 'Paulo Moura', | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 		date is 2007/3/24, | 
					
						
							|  |  |  | 		comment is 'Simple example for comparing single and multi-threading calculation of prime numbers.', | 
					
						
							|  |  |  | 		parameters is ['Threads'- 'Number of threads to use. Valid values are 1, 2, and 4.']]). | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	:- threaded. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 	:- public(primes/3). | 
					
						
							|  |  |  | 	:- mode(primes(+integer, +integer, -list), one). | 
					
						
							|  |  |  | 	:- info(primes/3, [ | 
					
						
							|  |  |  | 		comment is 'Returns a list of all prime numbers in the given interval.', | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 		argnames is ['Inf', 'Sup', 'Primes']]). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 	primes(N, M, Primes) :- | 
					
						
							|  |  |  | 		parameter(1, Threads), | 
					
						
							|  |  |  | 		primes(Threads, N, M, Primes). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	primes(1, N, M, Primes) :- | 
					
						
							|  |  |  | 		st_primes(N, M, Primes). | 
					
						
							|  |  |  | 	primes(2, N, M, Primes) :- | 
					
						
							|  |  |  | 		mt_primes_2(N, M, Primes). | 
					
						
							|  |  |  | 	primes(4, N, M, Primes) :- | 
					
						
							|  |  |  | 		mt_primes_4(N, M, Primes). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	st_primes(N, M, Primes) :- | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 		M > N, | 
					
						
							|  |  |  | 		prime_numbers(N, M, [], Primes). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 	mt_primes_2(N, M, Primes) :- | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 		M > N, | 
					
						
							|  |  |  | 		N1 is N + (M - N) // 2, | 
					
						
							|  |  |  | 		N2 is N1 + 1, | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 		threaded(( | 
					
						
							|  |  |  | 			prime_numbers(N2, M, [], Acc), | 
					
						
							|  |  |  | 			prime_numbers(N, N1, Acc, Primes))). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mt_primes_4(N, M, Primes) :- | 
					
						
							|  |  |  | 		M > N, | 
					
						
							|  |  |  | 		N3 is N + (M - N) // 2, | 
					
						
							|  |  |  | 		N4 is N3 + 1, | 
					
						
							|  |  |  | 		N1 is N + (N3 - N) // 2, | 
					
						
							|  |  |  | 		N2 is N1 + 1, | 
					
						
							|  |  |  | 		N5 is N4 + (M - N4) // 2, | 
					
						
							|  |  |  | 		N6 is N5 + 1, | 
					
						
							|  |  |  | 		threaded(( | 
					
						
							|  |  |  | 			prime_numbers(N6, M, [], Acc1), | 
					
						
							|  |  |  | 			prime_numbers(N4, N5, Acc1, Acc2), | 
					
						
							|  |  |  | 			prime_numbers(N2, N3, Acc2, Acc3), | 
					
						
							|  |  |  | 			prime_numbers(N, N1, Acc3, Primes))). | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	prime_numbers(N, M, Primes, Primes) :- | 
					
						
							|  |  |  | 		N > M, | 
					
						
							|  |  |  | 		!. | 
					
						
							|  |  |  | 	prime_numbers(N, M, Acc, Primes) :- | 
					
						
							|  |  |  | 		(	is_prime(N) -> | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 			Primes = [N| Primes2] | 
					
						
							|  |  |  | 		;	Primes = Primes2), | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 	    N2 is N + 1, | 
					
						
							| 
									
										
										
										
											2007-03-28 22:44:31 +00:00
										 |  |  | 		prime_numbers(N2, M, Acc, Primes2). | 
					
						
							| 
									
										
										
										
											2006-11-07 18:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	is_prime(2) :- !. | 
					
						
							|  |  |  | 	is_prime(Prime):- | 
					
						
							|  |  |  | 		Prime > 2, | 
					
						
							|  |  |  | 		Prime mod 2 =:= 1, | 
					
						
							|  |  |  | 		Sqrt is sqrt(Prime), | 
					
						
							|  |  |  | 		is_prime(3, Sqrt, Prime). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	is_prime(N, Sqrt, Prime):- | 
					
						
							|  |  |  | 		(	N > Sqrt -> | 
					
						
							|  |  |  | 			true | 
					
						
							|  |  |  | 		;	Prime mod N > 0, | 
					
						
							|  |  |  |  			N2 is N + 2, | 
					
						
							|  |  |  | 			is_prime(N2, Sqrt, Prime) | 
					
						
							|  |  |  | 		). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- end_object. |