我会选择Max Ostrowskis的答案。
其中一个困难是处理匹配谓词的属性顺序:这是一个元组,如果您的值出现在第一或第二位置,则会有所不同。添加规则以使谓词可交换应该可以解决问题,因为您不需要区分值位于第一位置还是第二位置。此方法不使用约束(乍一看),但它会复制生成的值,因此输出与您所需的解决方案不同。它还在代码中添加了一行。
person(a;b;c;d).
{match(X,Y): person(Y), X!=Y}1 :- person(X).
match(Y,X) :- match(X,Y).
#show match/2.
输出
Answer: 1
Answer: 2
match(c,a) match(a,c)
Answer: 3
match(b,a) match(a,b)
Answer: 4
match(c,d) match(d,c)
Answer: 5
match(b,a) match(a,b) match(c,d) match(d,c)
Answer: 6
match(b,d) match(d,b)
Answer: 7
match(c,a) match(a,c) match(b,d) match(d,b)
Answer: 8
match(b,c) match(c,b)
Answer: 9
match(d,a) match(a,d)
Answer: 10
match(d,a) match(a,d) match(b,c) match(c,b)
SATISFIABLE