크립키 모델

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

요약
최대 1만 개 상태를 가진 크립케 모델에서 CTL 논리식 E(x U (AG y))를 만족하는 상태 집합을 고정점 그래프 알고리즘으로 계산하는 문제입니다.
난이도

보통10점 중 7점

유형
그래프, DFS, 재귀, 구현
정답자
아직 제출이 없습니다

문제

소프트웨어 개발 과정에서 테스트와 품질 보증은 많은 시간이 드는 단계이다. 이 단계에 드는 비용과 시간을 줄이기 위해 여러 기법이 사용되는데, 그중 하나가 소프트웨어 검증이다. 모델 검사(model checking)는 크립키 모델(Kripke model)에 기반한 소프트웨어 검증 기법이다.

크립키 모델은 5-튜플 (P,S,S0,R,L)(P, S, S_0, R, L)로 정의된다. 여기서 PP는 원자 명제의 유한 집합, SS는 상태의 유한 집합, S0⊂SS_0 \subset S는 초기 상태의 집합, R⊂S×SR \subset S \times S는 전이 관계, L⊂S×PL \subset S \times P는 진리 관계이다. 이 문제에서는 초기 상태를 고려하지 않으며, RR는 반사적(reflexive) 관계이므로 모든 상태 s∈Ss \in S에 대해 R(s,s)R(s, s)가 성립한다.

상태 ss에서 시작하는 경로(path) π\pi는 s0=ss_0 = s이고 모든 i≥0i \ge 0에 대해 (si,si+1)∈R(s_i, s_{i+1}) \in R을 만족하는 무한 상태 수열 s0s1…s_0 s_1 \ldots이다.

시간 논리(temporal logic)와 그 부분집합인 계산 트리 논리(CTL)는 시간에 관한 명제를 기술한다. 크립키 모델은 CTL로 기술된 성질을 검사하는 데 자주 쓰인다.

CTL의 논리식에는 상태 논리식과 경로 논리식 두 종류가 있으며, 각각 상태와 경로에 대해 값이 평가된다.

p∈Pp \in P이면 pp는 상태 논리식이며, (s,p)∈L(s, p) \in L일 때에만 상태 ss에서 성립한다.

ff가 경로 논리식이면 Af\mathrm{\mathbf{A}} f와 Ef\mathrm{\mathbf{E}} f는 상태 논리식이다. 여기서 A\mathrm{\mathbf{A}}와 E\mathrm{\mathbf{E}}는 경로 한정사이다:

  • Af\mathrm{\mathbf{A}} f는 상태 ss에서 시작하는 모든 경로에 대해 ff가 성립할 때에만 ss에서 성립한다;
  • Ef\mathrm{\mathbf{E}} f는 상태 ss에서 시작하며 ff가 성립하는 경로 π\pi가 하나라도 존재할 때 ss에서 성립한다.

ff와 gg가 상태 논리식이면 Gf\mathrm{\mathbf{G}} f와 fUgf \mathrm{\mathbf{U}} g는 경로 논리식이다. 여기서 G\mathrm{\mathbf{G}}와 U\mathrm{\mathbf{U}}는 시간 연산자이다:

  • Gf\mathrm{\mathbf{G}} f (Globally)는 경로 π=s0s1…\pi = s_0 s_1 \ldots의 모든 i≥0i \ge 0에서 상태 sis_i에 대해 ff가 성립할 때에만 그 경로에서 성립한다;
  • fUgf \mathrm{\mathbf{U}} g (Until)는 경로 π=s0s1…\pi = s_0 s_1 \ldots에서, 상태 sis_i에서 gg가 성립하고 그 앞의 모든 상태 s0,s1,…,si−1s_0, s_1, \ldots, s_{i-1}에서 ff가 성립하는 i≥0i \ge 0이 존재할 때 성립한다.

상태 논리식 ff로 기술된 성질을 검증한다는 것은 ff가 성립하는 모든 상태를 찾는 것을 의미한다. 임의의 성질을 검증하는 것은 꽤 복잡한 문제이다. 이 문제는 더 쉽다. 원자 명제 xx, yy에 대한 시간 논리식 E(xU(AGy))\mathrm{\mathbf{E}}(x \mathrm{\mathbf{U}} (\mathrm{\mathbf{A}} \mathrm{\mathbf{G}} y))로 기술된 성질을 검증하는 프로그램을 작성하면 된다.

입력

첫 번째 줄에는 상태의 수 nn, 전이의 수 mm, 원자 명제의 수 kk가 주어진다 (1≤n≤10 0001 \le n \le 10\,000; 0≤m≤100 0000 \le m \le 100\,000; 1≤k≤261 \le k \le 26).

이어지는 nn개의 줄은 각각 하나의 상태를 기술한다. 상태 ii (1≤i≤n1 \le i \le n)는 그 상태에서 참인 원자 명제의 개수 cic_i와 그 명제들의 목록(공백으로 구분)으로 주어진다 (0≤ci≤k0 \le c_i \le k). 원자 명제는 알파벳 소문자 처음 kk개로 나타낸다.

다음 mm개의 줄은 각각 하나의 전이를 기술하며, 두 정수 ss와 tt (1≤s,t≤n1 \le s, t \le n; s≠ts \ne t)로 이루어진다 — 상태 ss에서 상태 tt로의 전이이다. 모델에는 모든 상태 ss에 대한 자기 전이 (s,s)(s, s)가 암묵적으로 포함된다(입력에는 나열되지 않는다). 같은 전이가 두 번 나열되지는 않는다.

마지막 줄에는 검증할 성질이 주어지며, 항상 E(xU(AGy)) 형태이다. 여기서 x와 y는 원자 명제이다.

출력

첫 번째 줄에 검증한 성질이 성립하는 상태의 개수를 출력한다. 이어지는 줄에는 그 상태들의 번호를 증가하는 순서로 출력한다.

예제2

  1. 예제 1

    입력
    7 8 2
    1 a
    1 a
    2 a b
    1 b
    1 b
    1 a
    1 a
    1 2
    2 3
    3 4
    4 5
    5 3
    2 6
    6 7
    7 6
    E(aU(AGb))
    
    예상 출력
    5
    1
    2
    3
    4
    5
    
  2. 예제 2

    입력
    1 0 1
    1 a
    E(aU(AGa))
    
    예상 출력
    1
    1