prolog.plg 498 B

123456789101112131415161718
  1. partition([], _, [], []).
  2. partition([X|Xs], Pivot, Smalls, Bigs) :-
  3. ( X @< Pivot ->
  4. Smalls = [X|Rest],
  5. partition(Xs, Pivot, Rest, Bigs)
  6. ; Bigs = [X|Rest],
  7. partition(Xs, Pivot, Smalls, Rest)
  8. ).
  9. quicksort([]) --> [].
  10. quicksort([X|Xs]) -->
  11. { partition(Xs, X, Smaller, Bigger) },
  12. quicksort(Smaller), [X], quicksort(Bigger).
  13. perfect(N) :-
  14. between(1, inf, N), U is N // 2,
  15. findall(D, (between(1,U,D), N mod D =:= 0), Ds),
  16. sumlist(Ds, N).