【发布时间】:2020-03-27 18:14:11
【问题描述】:
目前我正在尝试生成元素(a,b)的所有可能配对,其中a来自集合A,b来自prolog中的集合B。例如给出:
A = {1 ,2, 3} B = {a, b, c}
一组可能的配对是 {(1,a), (2,b), (3,c)}
我想找到 a 和 b 的所有唯一配对集。我认为可能的配对数应该是 n!。
这是我的尝试。 (在我的例子中,集合 A 是雇主姓名列表,集合 B 是学生姓名列表)。
generateMatching(Matching, [], [], Matching).
generateMatching(Matches, Employers(A), Students(B), Result) :- member(S, Students), member(E, Employers),
delete(Students, S, Students1), delete(Employers, E, Employers1),
generateMatching([(E, S)|Matches], Employers1, Students1, Result).
我这样称呼它
generateMatching([], Employers, Students, Matching)
基本上在每次通话中,我都会选择一组学生 (S) 中的一些成员和一组雇主 (E) 中的一些成员,然后将它们添加到当前匹配集(配对)中。然后我从它们被选中的集合中删除它们,这样它们就不能被再次选中。我一直这样做,直到我有 2 个空列表并且我知道我找到了一组可能的配对。
我的问题是我的解决方案将考虑 {(1,a), (2,b), (3,c)} 和 {(1,a), (3,c), (2, b)} 是不同的配对,因此计算非常慢。
我该如何改进?
编辑:查询后我真正想要得到的是这个。更清楚地说,解决方案是一组配对,其中 A 中的每个元素都与 B 中的 1 正好配对,反之亦然
Matching = [(1,a), (2, b), (3, c)] ;
Matching = [(1,a), (2, c), (3, b)] ;
Matching = [(1,b), (2, c), (3, a)] ;
Matching = [(1,b), (2, a), (3, c)] ;
Matching = [(1,c), (2, b), (3, a)] ;
Matching = [(1,c), (2, a), (3, b)] ;
False.
【问题讨论】:
-
这能回答你的问题吗? Combinations of multiple lists - Prolog
-
您描述的是
foo(A,B,C) :- permutation(B, P), maplist(p, A, P, C).,并为p提供了合适的定义,例如p(X, Y, X-Y)..
标签: prolog