Declaratieve Talen/oplossingenTeam
LET OP Deze oplossing werkt alleen voor groepjes van 2 omdat het alle groepen genereerd die mogelijk zijn, duurt het te lang om grotere groepen te maken
Beschrijving predikaten
maakTeam geeft telkens S elementen uit de lijst terug. Stel lijst = [1,2,3,4] en we nemen S=2, dan zal de output [1,2] [1,4] [2,3] zijn.
maakTeams geeft telkens een combinatie van S elementen terug uit de lijst. Stel lijst = [1,2,3,4] en S=2, dan zal de output [[1,2],[3,4]],[[1,3],[2,4]],[[2,3],[1,4]],... zijn.
% T teams en in elk team moeten S studenten % Deel1: verdeling(T,S,Verdeling) verdeling(T,S,Verdeling):- X is T*S, numlist(1,X,List), findall(List2,(maakTeams(List,S,List2)),List3), list_to_set(List3,List4), sorteer(List4,List5), list_to_set(List5,List6), member(Verdeling,List6). maakTeams([],_,[]). maakTeams(List,S,[TeamS|Teams]):-maakTeam(List,S,Team1), sort(Team1,TeamS), findall(X,(member(X,List),\+member(X,TeamS)),Overige), maakTeams(Overige,S,Teams). maakTeam(_,0,[]). maakTeam(List,S,[A|Team]):- S>0, T is S-1, maakTeam(List,T,Team), member(A,List), \+ member(A,Team). sorteer([X],[X]). sorteer([X,Y|Xs],[[L1|L2]|List]):-sort(X,[L1|L2]), sort(Y,[M1|M2]), ( (L1==M1;(member(M,L2),(member(M,M2))))-> sorteer([[L1|L2]|Xs],List) ; sorteer([[M1|M2]|Xs],List) ). %Deel 2 groepeer(T,S,W,Schedule):- findall(Schedule2,(maak_schedule(T,S,W,[],Schedule1),sort(Schedule1,Schedule2)),Schedule3), list_to_set(Schedule3,Schedule4), member(Schedule,Schedule4). %Deel 3 maak_schedule(_,_,0,S,S). maak_schedule(T,S,W,HSchedule,[Sch|Schedule]):- verdeling(T,S,Sch), \+member(Sch,HSchedule), NewW is W-1, maak_schedule(T,S,NewW,[Sch|HSchedule],Schedule). aantalwerkjes(T,S,W):- findall(Y,(verdeling(T,S,List),length(List,X),Y is X+1),List2), list_to_set(List2,Set), member(W,Set).
--Greet