From 237c855f1097f6ffbcfe2d3f9032f8696bb82b65 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 14 Apr 2020 00:10:33 +0200 Subject: [PATCH] ADDED: group_pairs_by_key/2 Pairs must be keysorted and may also contain variables as keys. Examples: ?- group_pairs_by_key([1-a,1-b,2-c], Ps). Ps = [1-[a,b],2-[c]]. ?- group_pairs_by_key([X-a,X-b,2-c], Ps). Ps = [X-[a,b],2-[c]]. --- src/prolog/lib/pairs.pl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/prolog/lib/pairs.pl b/src/prolog/lib/pairs.pl index f3b00108..adcfb138 100644 --- a/src/prolog/lib/pairs.pl +++ b/src/prolog/lib/pairs.pl @@ -1,6 +1,7 @@ :- module(pairs, [pairs_keys_values/3, pairs_keys/2, pairs_values/2, + group_pairs_by_key/2, map_list_to_pairs/3]). @@ -19,3 +20,14 @@ map_list_to_pairs2([], _, []). map_list_to_pairs2([H|T0], Pred, [K-H|T]) :- call(Pred, H, K), map_list_to_pairs2(T0, Pred, T). + + +group_pairs_by_key([], []). +group_pairs_by_key([K-V|KVs0], [K-[V|Vs]|KVs]) :- + same_key(K, KVs0, Vs, KVs1), + group_pairs_by_key(KVs1, KVs). + +same_key(K0, [K1-V|KVs0], [V|Vs], KVs) :- + K0 == K1, !, + same_key(K0, KVs0, Vs, KVs). +same_key(_, KVs, [], KVs). -- 2.54.0