在序言中将两个列表映射在一起

map two lists together in prolog

我有两个事实,它们是 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个。

为什么你认为样本中应该有 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.