% generating primes in prolog % This grows a data base of primes - with the largest prime first... prime(3). prime(2). new_prime(I):-var(I),!, repeat,generate(I), asserta(prime(I)). new_prime(I):- % nonvariable(I) write('Usage: new_prime(Variable)'), nl, !, fail. generate(Next):- prime(Last), Plus2 is Last +2, !, scan(candidate, Plus2), candidate(Next), not has_divisor(Next),!. has_divisor(J):- prime(D), 0 is J mod D. % Scanning the integers scan the next with a property % use like this: scan(i,First),i(I), Until,abolish(i)... scan(Label,I):- V=I, (Garbage=..[Label,_], Garbage,abolish(Label); true), Count=..[Label,V], asserta(Count). scan(Label,I):-Count=..[Label,V], retract(Count,_), Next is V+2, Count2=..[Label,Next], asserta(Count2). scan(Label,I):-abolish(Label), fail. :-trace [generate, candidate, prime, scan]. :-listing. :- write('input new_prime(P)? to generate a new prime'), nl.