来自不同城市的候选人名单



我需要从在同一城市比赛的每个团队中选出一名候选人。它必须与 N 个候选人一起工作,以防我需要添加更多。

我的知识库是这样的:

%candidate(Name,Team).
candidate(frank,red).
candidate(claire,red).
candidate(garret,blue).
candidate(jackie,yellow).
%runs(City,Team).
runs(buenosAires,red).
runs(buenosAires,blue).
runs(buenosAires,yellow).
runs(santaFe,red).
runs(santaFe,blue).
runs(santaFe,yellow).

我期待这样的有效查询:

set([frank,garret,jackie],buenosAires).
true.
set([claire,garret,jackie],buenosAires).
true.
set([claire,garret,jackie],santaFe).
true.
set(Candidates,City).
Candidates=[claire,garret,jackie]
City=santaFe

因此,我们希望对于每个城市或给定的城市,按团队颜色对这些人进行分组,然后从每个团队中选择一个人。

首先,为了方便起见,让我们将城市数据添加为事实,或者您可以使用带有setof/3member/2的谓词来生成它。我们还将扩展您的竞争谓词,以包括我们需要按颜色分组的颜色。

city(buenosAires).
city(santaFe).
competes(Name, Colour, City) :-
runs(City, Colour),
candidate(Name, Colour).

现在我们可以得到每个城市的团队成员集,并按颜色分组

teams(Teams, City) :-
city(City),
findall(Colour-Name, competes(Name, Colour, City), ColourNames),
pairs_group_by_key(ColourNames, ColourTeams),
pairs_values(ColourTeams, Teams).

我们有团队,但候选人是每个团队的一名成员, 因此,让我们选择它们。

set(Candidates, City) :-
teams(Teams, City),
set_candidates(Teams, Candidates).
set_candidates([], []).
set_candidates([HT|Teams], [HC|Candidates]) :-
set_candidates(Teams, Candidates),
member(HC, HT).

因此,未绑定的查询输出将是:

?- set(Cs, City).
Cs = [frank, garret, jackie],
City = buenosAires ;
Cs = [claire, garret, jackie],
City = buenosAires ;
Cs = [frank, garret, jackie],
City = santaFe ;
Cs = [claire, garret, jackie],
City = santaFe.

最新更新