如果我在Prolog中有两个列表,如
people([a, b, c]).
cols([green, red, yellow]).
我想像这样列出这些列表的所有排列。
?- all triplets(X)
X = [ ((a,green),(b,red),(c,yellow)), ((a,green),(b,yellow),(c,red)), ((a,green),(c,red),(b,yellow)), ((a,green),(c,yellow),(b,red)), ((a,red),(b,green),(c,yellow)), ((a,red),(b,yellow),(c,green)), ((a,red),(c,green),(b,yellow)), ((a,red),(c,yellow),(b,green)), ((a,yellow),(b,green),(c,red)), ((a,yellow),(b,red),(c,green)), ((a,yellow),(c,green),(b,red)), ((a,yellow),(c,red),(b,green)), ((b,green),(a,red),(c,yellow)), ((b,green),(a,yellow),(c,red)), ((b,green),(c,red),(a,yellow)), ((b,green),(c,yellow),(a,red)), ((b,red),(a,green),(c,yellow)), ((b,red),(a,yellow),(c,green)), ((b,red),(c,green),(a,yellow)), ((b,red),(c,yellow),(a,green)), ((b,yellow),(a,green),(c,red)), ((b,yellow),(a,red),(c,green)),((b,yellow),(c,green),(a,red)), ((b,yellow),(c,red),(a,green)), ((c,green),(a,red),(b,yellow)), ((c,green),(a,yellow),(b,red)), ((c,green),(b,red),(a,yellow)), ((c,green),(b,yellow),(a,red)), ((c,red),(a,green),(b,yellow)), ((c,red),(a,yellow),(b,green)), ((c,red),(b,green),(a,yellow)), (p(c,red),(b,yellow),(a,green)), ((c,yellow),(a,green),(b,red)), ((c,yellow),(a,red),(b,green)), ((c,yellow),(b,green),(a,red)), ((c,yellow),(b,red),(a,green))],
我到目前为止所尝试的是这个
list_pairs(Pairs) :-setof(p(X,Y),((people(Q),member(X,Q)),(cols(F),member(Y,F))),Pairs).
它为我提供了这两个列表的对列表。
?- list_pairs(M),length2(M,L).
M = [p(a, green), p(a, red), p(a, yellow), p(b, green), p(b, red), p(b, yellow), p(c, green), p(c, red), p(..., ...)],
L = 9
答案 0 :(得分:1)
如果你真的在寻找一个匹配的,每个列表排列的元素到元素,那么你不需要给出一个完整的答案,那么你需要的东西是:
permutation
zip
是Prolog库中已有的谓词。您需要编写一个带有两个列表的谓词zip([a,b,c], [1,2,3], MatchUp)
,并将相应的元素配对。 MatchUp = [(a,1),(b,2),(c,3)]
会产生((a,1),(b,2),(c,3))
。如果你真的想要(...)
,那就更多了,因为match_perm
不是Prolog中的列表表单。
获得findall
后,您就可以使用class GridModel {
public:
GridModel();
void PrintGrid(bool);
};
。