如何在prolog中找到两个列表的排列

时间:2018-03-25 14:20:33

标签: list prolog permutation

如果我在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

1 个答案:

答案 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); };