아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

불리언 논리

시간 제한1초메모리 제한128 MB

요약
완전히 괄호로 묶인 명제식을 파싱한 뒤, 각 부분식의 값을 기호나 연산자 위치에 맞춰 진리표로 출력한다.
난이도

보통10점 중 6점

유형
구현, 재귀, 문자열, 시뮬레이션
정답자
아직 제출이 없습니다

문제

명제는 명제 기호와 연결 연산자로 이루어진 논리식이다. 명제는 다음 규칙으로 재귀적으로 정의된다.

  1. 모든 명제 기호(이 문제에서는 a, z처럼 하나의 소문자)는 명제이다.
  2. PP가 명제이면 (!PP)도 명제이며, PP는 그것의 직접 부분식이다.
  3. PP와 QQ가 명제이면 (PP&QQ), (PP|QQ), (PP-->QQ), (PP<->QQ)도 명제이며, PP와 QQ는 각각의 직접 부분식이다.
  4. 그 밖의 것은 명제가 아니다.

연산자 !, &, |, -->, <->는 각각 부정, 논리곱, 논리합, 함의, 동치를 나타낸다. 명제 PP가 명제 RR의 부분식이라는 것은 P=RP = R이거나, PP가 어떤 명제 QQ의 직접 부분식이면서 QQ가 RR의 부분식인 경우를 말한다.

이제 명제 PP를 하나 고르고, PP에 나타나는 모든 명제 기호에 불 값(00 또는 11)을 배정하자. 그러면 연산자의 표준 의미에 따라 PP의 모든 부분식에 불 값이 정해진다.

부정논리곱논리합함의동치
!0=10&0=00|0=00-->0=10<->0=1
!1=00&1=00|1=10-->1=10<->1=0
1&0=01|0=11-->0=01<->0=0
1&1=11|1=11-->1=11<->1=1

이렇게 하여 PP의 값이 계산된다. 이 값은 명제 기호에 대한 배정에 따라 달라진다. PP에 서로 다른 명제 기호가 nn개 있으면 배정은 모두 2n2^n가지이다. 가능한 모든 배정을 살펴보기 위해 진리표를 사용한다.

진리표는 배정 하나당 한 줄씩, 즉 모두 2n2^n줄로 이루어진다. 각 줄에는 해당 배정에서의 모든 부분식의 값이 적힌다. 부분식이 명제 기호이면 그 값을 해당 기호의 위치에 맞추어 적고, 그렇지 않으면 연산자의 가운데에 맞추어 적는다.

입력

입력은 여러 개의 테스트 케이스로 이루어지며, 각 테스트 케이스는 한 줄에 하나씩 주어진다. 각 줄은 하나의 명제를 나타내고, 문자 사이에 임의 개수의 공백이 들어갈 수 있다. 입력은 마지막 테스트 케이스 뒤의 개행 문자 직후에 끝난다.

출력

각 테스트 케이스마다 주어진 명제의 진리표를 출력한다. 먼저 입력 줄을 그대로 한 번 출력하여 진리표를 시작한다. 그다음 명제와 그 모든 부분식을 명제 기호에 대한 가능한 모든 불 값 배정에 대해 계산하여, 배정마다 한 줄씩 출력한다. 각 줄의 길이는 대응하는 입력 줄의 길이와 정확히 같아야 하며, 공백과 문자 0, 1만으로 이루어져야 한다. 각 부분식의 값은 위에서 설명한 위치에 적는다. 각 테스트 케이스 뒤에는 빈 줄을 하나 출력한다.

주어진 명제의 명제 기호를 알파벳 순으로 정렬한 것을 s1,…,sns_1, \ldots, s_n이라 하자. 그러면 s1s_1에 00을 배정하는 모든 경우가 s1s_1에 11을 배정하는 모든 경우보다 앞에 와야 한다. 각 블록 안에서는 다시 s2s_2에 00을 배정하는 경우가 s2s_2에 11을 배정하는 경우보다 앞에 오고, 이런 식으로 계속된다(따라서 sns_n이 가장 빠르게 바뀐다).

예제3

  1. 예제 1

    입력
    ((b --> a) <-> ((! a) --> (! b)))
      ((y &  a)   -  ->(c |c))
    
    예상 출력
    ((b --> a) <-> ((! a) --> (! b)))
      0  1  0   1    1 0   1   1 0   
      1  0  0   1    1 0   0   0 1   
      0  1  1   1    0 1   1   1 0   
      1  1  1   1    0 1   1   0 1   
    
      ((y &  a)   -  ->(c |c))
        0 0  0       1  0 00  
        1 0  0       1  0 00  
        0 0  0       1  1 11  
        1 0  0       1  1 11  
        0 0  1       1  0 00  
        1 1  1       0  0 00  
        0 0  1       1  1 11  
        1 1  1       1  1 11  
    
  2. 예제 2

    입력
    a
    
    예상 출력
    a
    0
    1
    
  3. 예제 3

    입력
    (!a)
    
    예상 출력
    (!a)
     10 
     01