(define (count x lst) (count-hlp x lst 0)) (define (count-hlp x lst c) (if (null? lst) c (if (eq? x (car lst)) (count-hlp x (cdr lst) (+ 1 c)) (count-hlp x (cdr lst) c)))) ;; lst2 is a permutation of lst1, assuming no dupliate exists (define (isPerm lst1 lst2) (and (equal? (length lst1) (length lst2)) (subset lst1 lst2))) ;; lst1 is a subset of lst2 (define (subset lst1 lst2) (if (null? lst1) #t (and (memq (car lst1) lst2) (subset (cdr lst1) lst2)))) isPerm(L1,L2):- length(L1,N), length(L2,N), subset(L1,L2). subset([],_). subset([X|Xs],L):- member(X,L),!, subset(Xs,L). % check if N is a perfect number isPerfect(N):- M is N//2, sumDivisors(1,M,N,0,N). sumDivisors(I,Max,N,Sum0,Sum):-I>Max,!,Sum=Sum0. sumDivisors(I,Max,N,Sum0,Sum):- N mod I =:= 0,!, Sum1 is Sum0+I, I1 is I+1, sumDivisors(I1,Max,N,Sum1,Sum). sumDivisors(I,Max,N,Sum0,Sum):- I1 is I+1, sumDivisors(I1,Max,N,Sum0,Sum). % Ps is a list of perfect numbers between 1..N perfect(N,Ps):- perfect(1,N,Ps). perfect(I,N,[]):-I>N,!. perfect(I,N,[I|Ps]):- isPerfect(I),!, I1 is I+1, perfect(I1,N,Ps). perfect(I,N,Ps):- I1 is I+1, perfect(I1,N,Ps).