/* Perfect number benchmark in Picat. From http://www.jekejeke.ch/idatab/doclet/prod/en/docs/05_run/15_stdy/06_bench/09_programs/10_perfect/01_perfect.p.html This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. main => go. /** * Prolog code for finding a perfect number. * * A solution that did not make use of findall/3 and rem/2 * was posted Dec 16, 1988 on comp.lang.prolog by Thomas * Sj|land. It was titled Christmas pleasure and contained * an invitation to further dig into Euclids theorem. */ between1(Lo,Hi,_), Lo>Hi => fail. between1(Lo,_Hi,X) ?=> X = Lo. between1(Lo,Hi,X) => Lo2 = Lo+1, between1(Lo2,Hi,X). sumlist1([],S) => S = 0. sumlist1([X|Y],R) => sumlist1(Y,H), R = X+H. perfect(Hi,X) => between1(1,Hi,X), % between(1,Hi,X), Y = X // 2, % L = findall(Z,$(between1(1,Y,Z), (X rem Z == 0))), L = [Z : Z in 1..Y, X rem Z == 0], %writeln(l=L), sumlist1(L,X). perfect => perfect(500,P), writeln(P). perfect2 => perfect(500,_P). go => perfect. go2 => perfect2.