The list Structs is partitioned into maximal sublists of consecutive elements with identical keys. Concatenating all these sublists will yield the original list. If the original list was ordered according to the Key'th argument, then the sublists represent a partitioning of the original elements according to their different key values.
?- group_by_key(1, [f(a,1),f(a,2),f(b,2),f(c,2),f(c,5)], Groups). Groups = [[f(a,1),f(a,2)], [f(b,2)], [f(c,2),f(c,5)]] Yes (0.00s cpu) ?- group_by_key(2, [f(a,1),f(a,2),f(b,2),f(c,2),f(c,5)], Groups). Groups = [[f(a,1)], [f(a,2),f(b,2),f(c,2)], [f(c,5)]] Yes (0.00s cpu) ?- group_by_key(1, [a-1,a-2,b-2,c-2,c-5], Groups). Groups = [[a-1,a-2], [b-2], [c-2,c-5]] Yes (0.00s cpu)