【问题标题】:generate all the possible pairings of elements (a, b), where a is from set A and b is from set B in prolog生成元素(a,b)的所有可能配对,其中a来自集合A,b来自prolog中的集合B
【发布时间】: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


【解决方案1】:

假设事实上的标准select/3 谓词可用:

pairs([], [], []).
pairs([E1| R1], L2, [E1-E2| R]) :-
    select(E2, L2, R2),
    pairs(R1, R2, R).

示例调用:

| ?- pairs([1,2,3],[a,b,c],L).

L = [1-a,2-b,3-c] ? ;
L = [1-a,2-c,3-b] ? ;
L = [1-b,2-a,3-c] ? ;
L = [1-b,2-c,3-a] ? ;
L = [1-c,2-a,3-b] ? ;
L = [1-c,2-b,3-a] ? ;
no

此外,作为一般样式指南规则,更喜欢 Key-Value 作为对表示。

【讨论】:

  • 嘿,我编辑了这个问题来澄清一下,这个解决方案可以适应这种情况吗?
  • @CarlisleManson 这需要不同的解决方案。更新了我的答案。
  • 能否将其扩展为也可用作谓词。例如,如果我提供一些配对:pairs([1,2,3],[a,b,c], [2-b,1-a,3-c]) 它应该返回 true,无论顺序如何提供的配对?
  • 您可以简单地使用目标,例如sort([2-b,1-a,3-c], Sorted), pairs([1,2,3], [a,b,c], Sorted).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多