从两个列表中制作元组

斯特里克班

我是Prolog的初学者,我使用递归在两个列表中有两个make元组。例如,func([1、2、3],[4、5、6])应该输出[(1,4),(1,5),(1,6),(2、4),(2 ,5),(2、6),(3、4),(3、5),(3、6)]。我有以下代码:

func([],_,[]).
func([X|T1],Y,[Z|W]):-
    match(X,Y,Z),
    func(T1,Y,W).

match(X,[Y],[(X,Y)]).
match(X,[Y|T],[(X,Y)|Z]) :-
    match(X,T,Z).

但是我对func([1,2,3],[4,5,6],X)的输出是X = [[(1,4),(1,5),(1,6)],[( 2,4),(2,5),(2,6)],[(3,4),(3,5),(3,6)]]。

如何消除输出中间的多余方括号?我尝试在两个函数中都使用括号和方括号,但是我无法弄清楚。

保罗·莫拉(Paulo Moura)

使用findall/3标准谓词和member/2事实上的标准谓词:

| ?- findall(X-Y, (member(X,[1,2,3]), member(Y,[4,5,6])), Pairs).

Pairs = [1-4,1-5,1-6,2-4,2-5,2-6,3-4,3-5,3-6]
yes

要了解该解决方案,请注意,对于的每个值X,我们通过回溯的所有值进行枚举Y即,当回溯(由findall/3谓词隐式执行以构造其第二个参数的所有解决方案的列表)时,我们先穷尽最后一个选择点(member(Y,[4,5,6])目标)的所有解决方案,然后再回溯到先前的选择点(member(X,[1,2,3])目标)。这被称为按时间顺序回溯,并且是Prolog的定义特征之一。

请注意,我使用X-Y而不是的的通常Prolog表示形式(X,Y),这不是构造n元组的推荐解决方案,因为它仅适用于成对的元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从存储在元组列表列表中的两个元素元组中制作两个列表

如何从两个列表中制作列表列表

在一个元组中添加两个列表

如何从python中的两个列表制作字典列表

交换列表中的两个动作(元组)

比较不同列表python中两个元组的项目

在Python列表中合并每两个元组

如何从用户输入中获取两个列表的元组?

从元组列表创建两个列表

从两个元组列表中取两个值并相乘

将成对的列表/元组拆成两个列表/元组

将成对的列表/元组拆成两个列表/元组

向量元组列表->两个矩阵

制作两个列表的ndarray python

合并两个元组列表。具有两个元素的所需元组列表

从两个列表创建一个元组列表

几个元组的列表,如何在大元组中提取小元组中前两个相同的元素

根据它们的值和索引从两个列表中获取元组列表

python迭代一个元组中的两个列表并比较tem之间的整数

如何从具有列表理解的元组列表的单个列表中获得两个单独的列表列表?

如何在两个不同的元组列表中与元组的第一个元素相交

如何将列表中的每个两个元素打包到scala中的元组?

遍历两个列表以在python中获取元组中的元素

如何从大量的元组中获得最佳的两个元组

F#从两个列表中制作成对列表

如何根据java中的其他两个列表制作列表

如何从Python中的两个列表制作一个json

从两个列表创建一个json以在Javascript中制作堆叠的条形图

解压缩列表/元组中的前两个元素