gpt4 book ai didi

prolog - 生成所有可能的元素对 (a, b),其中 a 来自集合 A,b 来自 prolog 中的集合 B

转载 作者:行者123 更新时间:2023-12-04 10:20:31 25 4
gpt4 key购买 nike

目前我正在尝试生成所有可能的元素配对 (a, b),其中 a 来自集合 A,b 来自序言中的集合 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) 中的某个成员和一组 Employers (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.

最佳答案

假设事实上的标准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作为对表示。

关于prolog - 生成所有可能的元素对 (a, b),其中 a 来自集合 A,b 来自 prolog 中的集合 B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60878154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com