quickselect([H|T], K, X) :- 
  partition(H, [H|T], Smaller, Equal, Larger),
  length(Smaller, S),
  length(Equal, E),
  qs_helper(K, Smaller, S, Equal, E, Larger, X).

qs_helper(K, Smaller, S, Equal, E, Larger, X) :-
  K < S, quickselect(Smaller, K, X).
qs_helper(K, Smaller, S, Equal, E, Larger, X) :-
  K >= S, K < S+E, car(Equal,X).
qs_helper(K, Smaller, S, Equal, E, Larger, X) :-
  K >= S+E, NewK is K - (S+E), quickselect(Larger, NewK, X).

car([H|T], H).
