首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在prolog中找到两个表的排列

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

Stack Overflow用户
提问于 2018-03-25 22:20:33
回答 1查看 408关注 0票数 2

如果我在Prolog中有两个列表,比如

代码语言:javascript
复制
people([a, b, c]).
cols([green, red, yellow]).

我希望所有这些排列都像这样列出。

代码语言:javascript
复制
?- 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))], 

到目前为止,我尝试的是这样的

代码语言:javascript
复制
list_pairs(Pairs) :-setof(p(X,Y),((people(Q),member(X,Q)),(cols(F),member(Y,F))),Pairs).

它给了我一个配对的列表,这两个列表是这样的。

代码语言:javascript
复制
?- 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
EN

回答 1

Stack Overflow用户

发布于 2018-03-26 08:32:41

不需要给出完整的答案,如果你真的在寻找每个列表的元素对元素排列的匹配,那么你会想要这样的东西:

代码语言:javascript
复制
match_perm(List1, List2, MatchUp) :-
    permutation(List1, PList1),
    permutation(List2, PList2),
    zip(Plist1, PList2, MatchUp).

permutation是Prolog库中已经存在的谓词。您需要编写一个谓词zip,它接受两个列表并将相应的元素配对。zip([a,b,c], [1,2,3], MatchUp)将生成MatchUp = [(a,1),(b,2),(c,3)]。如果你真的想要((a,1),(b,2),(c,3)),那就需要做更多的工作,因为(...)不是Prolog中的列表形式。

一旦你有了match_perm,你就可以在上面使用findall

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49476857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档