Skip to content

Instantly share code, notes, and snippets.

@mollerse
Last active October 31, 2018 10:27
Show Gist options
  • Save mollerse/1584d7db5703bb8edf3e99068e7e9f35 to your computer and use it in GitHub Desktop.
Save mollerse/1584d7db5703bb8edf3e99068e7e9f35 to your computer and use it in GitHub Desktop.
Prolog solution(ish) to 6th grade logic puzzle
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