在prolog中将两个列表映射在一起

问题描述 投票:1回答:1

我有两个事实是x(a,b,c)和g(x,y,z)。

我想创建一个规则来打印所有可能的答案,这样如果我从第一个事实中选择一个成员并将其与第二个事实中的成员匹配,那么我就无法将第一个事实中的另一个成员与该成员中的同一成员相匹配之前匹配的第二个事实,例如[a,x],[b,x]是不可接受的。

... X = [[a,x],[b,y],[c,z]]

... X = [[a,y],[b,z],[c,x]]

... X = [[a,z],[b,x],[c,y]]

.
.
.

你得到了我希望的观点,我认为应该有9个。

list prolog permutation
1个回答
2
投票

为什么你认为样品中应该有9个?应该有6个:

:- use_module(library(lambda)).

?- maplist(\K^V^KV^(KV = K-V), [a,b,c], Rs, LRs), permutation([x,y,z], Rs).
   Rs = [x,y,z], LRs = [a-x,b-y,c-z]
;  Rs = [x,z,y], LRs = [a-x,b-z,c-y]
;  Rs = [y,x,z], LRs = [a-y,b-x,c-z]
;  Rs = [y,z,x], LRs = [a-y,b-z,c-x]
;  Rs = [z,x,y], LRs = [a-z,b-x,c-y]
;  Rs = [z,y,x], LRs = [a-z,b-y,c-x]
;  false.
© www.soinside.com 2019 - 2024. All rights reserved.