Last active
October 31, 2018 10:27
-
-
Save mollerse/1584d7db5703bb8edf3e99068e7e9f35 to your computer and use it in GitHub Desktop.
Prolog solution(ish) to 6th grade logic puzzle
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
diff_known(X, Diff, Y):- Y is X + Diff. | |
abs_diff(X, Diff, Y):- Y is X + Diff ; Y is X - Diff. | |
older(X, Y):- X > Y. | |
drop_lie(Facts, Index, Truths):- nth0(Index, Facts, _, Truths). | |
% Prints program dropping a configuration of lies | |
print_program(L1, L2, L3):- | |
% Valid program: | |
drop_lie([ | |
"Synnove is 22", | |
"diff_known(Synnove, 2, Lindis)", | |
"diff_known(Synnove, -1, Kristine)" | |
], L1, Synnove_truths), | |
drop_lie([ | |
"Kristine is 25", | |
"(older(Lindis, Synnove); older(Lindis, Kristine))", | |
"abs_diff(Kristine, 3, Lindis)" | |
], L2, Lindis_truths), | |
drop_lie([ | |
"Synnove is 23", | |
"older(Synnove, Kristine)", | |
"diff_known(Lindis, 3, Synnove)" | |
], L3, Kristine_truths), | |
append(Synnove_truths, Lindis_truths, X), | |
append(X, Kristine_truths, Truths), | |
atomic_list_concat(Truths, ',\n\t', Y), | |
atom_string(Y, Z), | |
format('solve(Synnove, Lindis, Kristine):-\n\t~w .', [Z]). | |
% print_program(0, 0, 2). | |
% This prints the program which omits the lies we know are lies: | |
% solve(Synnove, Lindis, Kristine):- | |
% diff_known(Synnove, 2, Lindis), | |
% diff_known(Synnove, -1, Kristine), | |
% (older(Lindis, Synnove); older(Lindis, Kristine)), | |
% abs_diff(Kristine, 3, Lindis), | |
% Synnove is 23, | |
% older(Synnove, Kristine) . | |
% However, we need to reorder the facts so that the initialization of Synnove to 23 | |
% is at the top, in order for Prolog to be able to figure out the rest of the | |
% clauses. | |
solve(Synnove, Lindis, Kristine):- | |
Synnove is 23, | |
diff_known(Synnove, 2, Lindis), | |
diff_known(Synnove, -1, Kristine), | |
(older(Lindis, Synnove); older(Lindis, Kristine)), | |
abs_diff(Kristine, 3, Lindis), | |
older(Synnove, Kristine) . |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment