我是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)]]。
如何消除输出中间的多余方括号?我尝试在两个函数中都使用括号和方括号,但是我无法弄清楚。
使用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] 删除。
我来说两句