Prolog: Find Criminal (범인을 찾아라)

6명의 용의자들이 서로를 범인이라고 지목하고 있다. 이 중 3명만 범인이라고 할 때, 다음 대화를 참고하여 범인을 가려내시오. 주의할 점은 범인은 항상 거짓말만 하고, 범인이 아닌 사람은 항상 참인 말만 한다.

2015. 12. 05.

문제

6명의 용의자들이 서로를 범인이라고 지목하고 있다. 이 중 3명만 범인이라고 할 때, 다음 대화를 참고하여 범인을 가려내시오. 주의할 점은 범인은 항상 거짓말만 하고, 범인이 아닌 사람은 항상 참인 말만 한다.

  • A : B, D중에 한 명만 범인이야.
  • B : C, E중에 한 명만 범인이야.
  • C : B가 범인이야.
  • D : A가 범인이야.
  • E : A, B는 범인이 아니야.
  • F : A, B중에 한 명만 범인이야

예시 코드

더욱 간결한 방법이 있다면 언제든지 알려주세요.

is_equal(A, B):- X is A-B, X==0.

is_not_equal(A, B):- X is A-B, not(X==0).

find_criminal(Group):-
    (member(a, Group) -> A=1; A=0),
    (member(b, Group) -> B=1; B=0),
    (member(c, Group) -> C=1; C=0),
    (member(d, Group) -> D=1; D=0),
    (member(e, Group) -> E=1; E=0),
    (member(f, Group) -> F=1; F=0),
    (member(a, Group) -> is_not_equal(B+D, 1); is_equal(B+D, 1)),
    (member(b, Group) -> is_not_equal(C+E, 1); is_equal(C+E, 1)),
    (member(c, Group) -> B=0; B=1),
    (member(d, Group) -> A=0; A=1),
    (member(e, Group) -> is_not_equal(A+B, 0); is_equal(A+B, 0)),
    (member(f, Group) -> is_not_equal(A+B, 1); is_equal(A+B, 1)),
    is_equal(A+B+C+D+E+F, 3).
크리에이티브 커먼즈 라이선스

이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2020 Do Hoerin, LYnLab