Created
November 14, 2024 20:23
-
-
Save PhantomOffKanagawa/66f32694788f152e2e918cffaf6553f7 to your computer and use it in GitHub Desktop.
Prolog Gym Schedule Generator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| % 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 | _]). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ?- 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