list - 根据列表中的值对列表元素进行分组

标签 list prolog tuples grouping

我有一个元素列表(元组):

tuples(
        [
            (a,b,[1,3,5,7]),
            (a,b,[9,11,13,15]),
            (a,b,[17,19,21,23]),
            (c,d,[0,2,4,6]),
            (c,d,[8,10,12,14]),
            (c,d,[16,18,20,22]),
            (e,f,[100,200,300,400]),
            (e,f,[500,600,700,800]),
            (e,f,[900,1000,1100,1200])
        ]
    ).

如何对它们进行分组,使其变为:

[
        (a,b,[1,3,5,7,9,11,13,15,17,19,21,23]),
        (c,d,[0,2,4,6,8,10,12,14,16,18,20,22]),
        (e,f,[100,200,300,400,500,600,700,800,900,1000,1100,1200])
]

如我们所见,我们将 (a,b) (c,d) (e,f) 分组并连接它们各自的列表。

谢谢你的帮助。

最佳答案

这种有点像 SQL 的方式怎么样:

定义一个谓词来访问原始深层和讨厌的数据结构中的数据(它使用连词 (_,_) 来创建看起来像 n 元组但实际上“接近”列表的内容,除了在最终位置 的 Backbone )。在回溯时,它将拉出个人 一条一条记录,并在head变量中呈现其中的信息:

some_tuple(V,W,Values) :- 
   tuples(Tuples), 
   member((V,W,Values), Tuples).

然后使用 2 级收集 bagof/3打电话。

solution(Bag) :-
   bagof((V,W,FlatBagForVW),                       % will backtrack over V,W
      SubBag^(bagof(L,some_tuple(V,W,L),BagForVW), % collect lists for a given V,W 
              flatten(BagForVW,FlatBagForVW)),     % flatten it
      Bag).                                        % what we want

完成!

如果你在 SWI-Prolog 中,首先告诉顶层打印机不要省略太多长列表:

?-
set_prolog_flag(answer_write_options,[max_depth(100)]).

然后:

?-
solution(Bag).

Bag = [(a,b,[1,3,5,7,9,11,13,15,17,19,21,23]),
       (c,d,[0,2,4,6,8,10,12,14,16,18,20,22]),
       (e,f,[100,200,300,400,500,600,700,800,900,1000,1100,1200])].

关于list - 根据列表中的值对列表元素进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65133897/

相关文章:

python - 未正确创建以元组集作为值的字典

python - 根据特定元组值删除列表中的元素

Prolog 解包列表谓词

c# - 直接设置字典元组值

data-structures - 如何识别 Prolog 术语的浪费表示

list - 解释为什么 append/3 在这些情况下会产生无限数量的解决方案

c# - 在 C# 中查找和删除元组列表中的重复项

c# - 锯齿状数组,从List <string>填充它们

html - 当计数器在 10、11、12...之后插入 0 到 9 之间的数字时如何添加 0(零)?有可能吗?

python - 计算两个文件的行差异的最有效方法是什么?