<div class="notebook open-fullscreen"> <div class="nb-cell program" data-background="true" name="p4"> % Headers :- use_rendering(table). :- discontiguous set/3. :- discontiguous song/2. :- discontiguous song/3. :- discontiguous absent/2. </div> <div class="nb-cell program" data-background="true" name="p1"> % Main Logic schedule(Solved-Rest) :- findall(N-M-P, (song(N, M, P), \+ set(_, _, N)), Songs), findall(S-P, (slot(S), place(P), \+ set(S, P, _)), TimeSlots), findall(T-(S, N), (set(T, S, N)), Sets), solve(Songs, TimeSlots, Sets, Solved-Rest). solve([], _, Acc, Acc-[]) :- !. solve(Rest, [], Acc, Acc-Rest) :- !. solve(Songs, [Slot-Place | Slots], Acc, R) :- % Pick a slot that is not yet taken \+ member(Slot-(Place,_), Acc), % Pick a song from the list of songs that have no slot yet member(Name-Members-Place, Songs), % Make sure no member is absent at that slot include(absent(Slot), Members, []), % Make sure no band members are used in two sets on the same timeslot forall( member(Slot-(_, Name2), Acc), (song(Name2, Members2), !, intersection(Members, Members2, [])) ), % Delete that set from the list of those pending for a slot delete(Songs, Name-Members-Place, Rest), % Repeat for the rest solve(Rest, Slots, [Slot-(Place, Name) | Acc], R). solve(Songs, [_ | Slots], Acc, R) :- solve(Songs, Slots, Acc, R). </div> <div class="nb-cell program" data-background="true" name="p2"> % Example slot('13:00'). slot('14:00'). slot('15:00'). place(duza). place(mala). place(kanciapa). % Songs are prioritized based on their order song(one, [wende, ziela, wera]). song(two, [miska, emi]). song(three, [wende]). % Some songs require specific place. Pass it as 3rd argument song(four, [wende], duza). % Hard-set songs or anyhow occupied slots set('14:00', duza, three). % Inexistent songs have no members by default set('15:00', mala, jamsession). absent('14:00', miska). </div> <div class="nb-cell program" data-background="true" name="p3"> % Convenience functions for pretty printing schedule_table(SortedGrouped-Rest) :- schedule(Solved-Rest), sort(Solved, Sorted), group_pairs_by_key(Sorted, SortedGrouped). </div> <div class="nb-cell program" data-background="true" data-singleline="true" name="p5"> % Fallbacks set(_, _, _) :- fail. song(_, []). song(Name, Members, _Place) :- song(Name, Members). </div> <div class="nb-cell markdown" name="md1"> ### Click Run to see the results </div> <div class="nb-cell query" data-run="onload" name="q1"> schedule_table(Solution-Rest). </div> </div>