The list Structs is partitioned into maximal sublists of consecutive elements with identical keys. If the original list was ordered according to the KeyPos'th argument, then the sublists represent a partitioning of the original elements according to their different key values. From each of these sublists, the ValPos'th arguments are extraced to form a ValueList for the corresponding key.
The output argument Grouped is bound to a list of Key-ValueList pairs, where Key is the value of the KeyPos'th argument that all the values in ValueList have in common.
?- group_values_with_key(1, 2, [f(a,1), f(a,2), f(b,2), f(c,2), f(c,5)], Groups). Groups = [a - [1,2], b - [2], c - [2,5]] Yes (0.00s cpu) ?- group_values_with_key(2, 1, [f(a,1), f(a,2), f(b,2), f(c,2), f(c,5)], Groups). Groups = [1 - [a], 2 - [a,b,c], 5 - [c]] Yes (0.00s cpu)