Skip to content

Instantly share code, notes, and snippets.

@PhantomOffKanagawa
Created November 14, 2024 20:23
Show Gist options
  • Select an option

  • Save PhantomOffKanagawa/66f32694788f152e2e918cffaf6553f7 to your computer and use it in GitHub Desktop.

Select an option

Save PhantomOffKanagawa/66f32694788f152e2e918cffaf6553f7 to your computer and use it in GitHub Desktop.
Prolog Gym Schedule Generator
% Define the week
day(sunday).
day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).
day(saturday).
% Define the workouts that must be separated
split_workout(chest).
split_workout(pull).
split_workout(legs).
% Define back to back workouts
repeat_workout(run).
repeat_workout(rest).
% Collect all workouts
all_workouts(Workouts) :-
findall(W, split_workout(W), SplitWorkouts),
findall(W, repeat_workout(W), RepeatWorkouts),
append(SplitWorkouts, RepeatWorkouts, Workouts).
% Define main schedule
schedule(Schedule) :-
Schedule = [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday],
% Fixed Workouts (Scheduled w/ Gym Buddy)
Monday = chest, % Technically just shoulders & tricep
Wednesday = pull,
Friday = legs,
% Assign remaining workouts
all_workouts(AllWorkouts),
member(Sunday, AllWorkouts),
member(Tuesday, AllWorkouts),
member(Thursday, AllWorkouts),
member(Saturday, AllWorkouts),
% Ensure separation
no_repeats(Schedule),
run_constraint(Schedule).
% Ensure separation (no repeats within two elements before or after)
no_repeats(List) :-
\+ (append(_, [X,Y,Z|_], List), split_workout(Z), (X = Z; Y = Z)),
List = [First, Second | _],
append(_, [SecondLast, Last], List),
(not(split_workout(First)); First \= Second, First \= Last, First \= SecondLast),
(not(split_workout(Last)); Last \= Second).
% Ensure run is more than 2 days after legs, including wrap-around
run_constraint(List) :-
\+ (append(_, [legs, _, run|_], List)),
\+ (append(_, [legs, run|_], List)),
\+ (List = [run, _, _, _, _, _, legs]),
\+ (List = [_, run, _, _, _, _, legs]),
\+ (List = [run, _, _, _, _, legs | _]),
\+ (List = [_, run, _, _, _, legs | _]).
?- schedule(Schedule).
Schedule = [pull, chest, legs, pull, chest, legs, rest] ;
Schedule = [pull, chest, legs, pull, chest, legs, rest] ;
Schedule = [pull, chest, legs, pull, rest, legs, rest] ;
Schedule = [pull, chest, legs, pull, rest, legs, rest] ;
Schedule = [pull, chest, run, pull, chest, legs, rest] ;
Schedule = [pull, chest, run, pull, chest, legs, rest] ;
Schedule = [pull, chest, run, pull, run, legs, rest] ;
Schedule = [pull, chest, run, pull, run, legs, rest] ;
Schedule = [pull, chest, run, pull, rest, legs, rest] ;
Schedule = [pull, chest, run, pull, rest, legs, rest] ;
Schedule = [pull, chest, rest, pull, chest, legs, rest] ;
Schedule = [pull, chest, rest, pull, chest, legs, rest] ;
Schedule = [pull, chest, rest, pull, run, legs, rest] ;
Schedule = [pull, chest, rest, pull, run, legs, rest] ;
Schedule = [pull, chest, rest, pull, rest, legs, rest] ;
Schedule = [pull, chest, rest, pull, rest, legs, rest] ;
Schedule = [rest, chest, legs, pull, chest, legs, pull] ;
Schedule = [rest, chest, legs, pull, chest, legs, pull] ;
Schedule = [rest, chest, legs, pull, chest, legs, rest] ;
Schedule = [rest, chest, legs, pull, chest, legs, rest] ;
Schedule = [rest, chest, legs, pull, rest, legs, pull] ;
Schedule = [rest, chest, legs, pull, rest, legs, pull] ;
Schedule = [rest, chest, legs, pull, rest, legs, rest] ;
Schedule = [rest, chest, legs, pull, rest, legs, rest] ;
Schedule = [rest, chest, run, pull, chest, legs, pull] ;
Schedule = [rest, chest, run, pull, chest, legs, pull] ;
Schedule = [rest, chest, run, pull, chest, legs, rest] ;
Schedule = [rest, chest, run, pull, chest, legs, rest] ;
Schedule = [rest, chest, run, pull, run, legs, pull] ;
Schedule = [rest, chest, run, pull, run, legs, pull] ;
Schedule = [rest, chest, run, pull, run, legs, rest] ;
Schedule = [rest, chest, run, pull, run, legs, rest] ;
Schedule = [rest, chest, run, pull, rest, legs, pull] ;
Schedule = [rest, chest, run, pull, rest, legs, pull] ;
Schedule = [rest, chest, run, pull, rest, legs, rest] ;
Schedule = [rest, chest, run, pull, rest, legs, rest] ;
Schedule = [rest, chest, rest, pull, chest, legs, pull] ;
Schedule = [rest, chest, rest, pull, chest, legs, pull] ;
Schedule = [rest, chest, rest, pull, chest, legs, rest] ;
Schedule = [rest, chest, rest, pull, chest, legs, rest] ;
Schedule = [rest, chest, rest, pull, run, legs, pull] ;
Schedule = [rest, chest, rest, pull, run, legs, pull] ;
Schedule = [rest, chest, rest, pull, run, legs, rest] ;
Schedule = [rest, chest, rest, pull, run, legs, rest] ;
Schedule = [rest, chest, rest, pull, rest, legs, pull] ;
Schedule = [rest, chest, rest, pull, rest, legs, pull] ;
Schedule = [rest, chest, rest, pull, rest, legs, rest] ;
Schedule = [rest, chest, rest, pull, rest, legs, rest] ;
false.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment