Skip to content

Instantly share code, notes, and snippets.

@if1live
Last active May 31, 2016 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save if1live/6aa89e41950f0e33273c85b666da1cb2 to your computer and use it in GitHub Desktop.
Save if1live/6aa89e41950f0e33273c85b666da1cb2 to your computer and use it in GitHub Desktop.
맞는 말은 하나입니다. 그것을 골라주세요 - prolog version
/*
https://twitter.com/k2pa00/status/737300123332419585
execute
$ gprolog
['contradiction.pl'].
sol_a(A, B, C, D).
sol_b(A, B, C, D).
sol_c(A, B, C, D).
sol_d(A, B, C, D).
*/
/* true <-> false */
flip(true, false).
flip(false, true).
/* 1. 두 번째 선택은 거짓입니다. */
rule_a(A, B, _, _) :- A = true, B = false.
/* 2. 세 번째 선택은 참입니다. */
rule_b(_, B, C, _) :- B = true, C = true.
/* 3. 세 번째 선택은 참입니다. */
rule_c(_, _, C, D) :- C = true, D = true.
/* 4. 첫 번째 선택은 거짓입니다. */
rule_d(A, _, _, D) :- D = true, A = false.
inv_rule_a(A, B, _, _) :-
rule_a(InvA, InvB, _, _),
flip(InvA, A), flip(InvB, B).
inv_rule_b(_, B, C, _) :-
rule_b(_, InvB, InvC, _),
flip(InvB, B), flip(InvC, C).
inv_rule_c(_, _, C, D) :-
rule_c(_, _, InvC, InvD),
flip(InvC, C), flip(InvD, D).
inv_rule_d(A, _, _, D) :-
rule_d(InvA, _, _, InvD),
flip(InvA, A), flip(InvD, D).
sol_a(A, B, C, D) :-
rule_a(A, B, C, D),
inv_rule_b(A, B, C, D),
inv_rule_c(A, B, C, D),
inv_rule_d(A, B, C, D).
sol_b(A, B, C, D) :-
inv_rule_a(A, B, C, D),
rule_b(A, B, C, D),
inv_rule_c(A, B, C, D),
inv_rule_d(A, B, C, D).
sol_c(A, B, C, D) :-
inv_rule_a(A, B, C, D),
inv_rule_b(A, B, C, D),
rule_c(A, B, C, D),
inv_rule_d(A, B, C, D).
sol_d(A, B, C, D) :-
inv_rule_a(A, B, C, D),
inv_rule_b(A, B, C, D),
inv_rule_c(A, B, C, D),
rule_d(A, B, C, D).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment