- 결정적 유한 자동자(DFA)의 정의
- DFA는 5개의 요소(Q, Σ, δ, q₀, F)로 구성된 수학적 시스템이다:
- Q (상태 집합): 자동자가 가질 수 있는 모든 상태.
- Σ (입력 알파벳): 허용되는 입력 기호 집합.
- δ (전이 함수): 현재 상태와 입력 기호에 따라 다음 상태를 결정.
- q₀ (초기 상태): 시작 상태.
- F (수락 상태): 입력을 수락하는 상태 집합.
- DFA는 5개의 요소(Q, Σ, δ, q₀, F)로 구성된 수학적 시스템이다:
- DFA의 동작 원리
- 초기 상태(q₀)에서 시작하여, 입력 문자열의 각 기호를 δ에 따라 처리하면서 상태를 전이.
- 모든 입력을 처리한 후, 최종 상태가 F에 포함되면 문자열을 수락.
- 전이 함수의 특징
- DFA에서 모든 상태(Q)와 모든 입력 심볼(Σ)에 대해 정확히 하나의 전이가 정의되어야 함.
- 이는 DFA가 결정적임을 보장하며, 모든 입력에 대해 정확히 한 경로만 따름.
- 예제
- DFA를 사용해 이진수 입력 문자열이 짝수 개의
1
을 포함하는지 판단:- Q = {q₀, q₁}, q₀: 짝수 개의
1
, q₁: 홀수 개의1
. - Σ = {0, 1}.
- δ:
- q₀에서
1
을 읽으면 q₁으로 전이. - q₁에서
1
을 읽으면 q₀으로 전이. 0
은 현재 상태 유지.
- q₀에서
- q₀ = 초기 상태, F = {q₀} (수락 상태).
- Q = {q₀, q₁}, q₀: 짝수 개의
- DFA를 사용해 이진수 입력 문자열이 짝수 개의
- 결정적과 비결정적 차이
- DFA (결정적): 모든 입력에 대해 전이가 고정.
- NFA (비결정적): 하나의 입력에 대해 여러 전이가 가능.
DFA는 형식 언어와 자동화기의 기초를 이루는 중요한 모델로, 입력을 체계적으로 처리하여 언어에 속하는지를 판별하는 데 사용됩니다. 이해의 핵심은 상태 전이와 결정적 특성입니다.
- DFA(Deterministic Finite Automata)의 언어
- DFA의 언어는 DFA가 수락하는 문자열들의 집합으로 정의됨.
- DFA는 초기 상태에서 시작하여 입력 문자열을 읽으며 상태를 전이하고, 최종 상태(수락 상태)에 도달하면 해당 문자열을 수락.
- 언어의 정의: DFA가 수락하는 모든 문자열의 집합은 해당 DFA의 언어임.
- 수학적 정의
- DFA의 언어는 다음과 같이 정의 가능:
- L(DFA): DFA가 수락하는 문자열들의 집합.
- L(DFA) = {w ∈ Σ* | δ(q₀, w) ∈ F}
- 여기서,
q₀
는 초기 상태,w
는 문자열,F
는 수락 상태 집합.
- 여기서,
- DFA의 언어는 다음과 같이 정의 가능:
- DFA의 상태 전이
- DFA는 전이 함수(δ)를 사용해 상태를 전이하며 입력 문자열을 처리.
- 상태 전이는 현재 상태와 입력 심볼에 의해 결정됨.
- 입력 문자열이 끝날 때 DFA가 수락 상태에 도달하면 문자열을 수락.
- Epsilon Closure (ε-클로저)
- ε-클로저: DFA의 모든 입력 심볼로 구성된 가능한 문자열 조합의 집합.
- ε-클로저를 통해 DFA가 처리할 수 있는 모든 문자열의 조합을 정의할 수 있음.
- 예제 설명
- DFA 구성:
- 상태: Q = {q₀, q₁, q₂}
- 입력 알파벳: Σ = {0, 1}
- 초기 상태: q₀
- 수락 상태: q₂
- 전이 함수:
- q₀에서
0
을 읽으면 q₀로 이동. - q₀에서
1
을 읽으면 q₁로 이동. - q₁에서
0
을 읽으면 q₁로 이동. - q₁에서
1
을 읽으면 q₂로 이동. - q₂에서
0
을 읽으면 q₁로 이동. - q₂에서
1
을 읽으면 q₂로 이동.
- q₀에서
- DFA 구성:
- 문자열 처리 예제
- 문자열
101
:- q₀에서 시작,
1
을 읽고 q₁로 이동. - q₁에서
0
을 읽고 q₁에 머무름. - q₁에서
1
을 읽고 q₂로 이동. - 문자열이 끝났고 q₂는 수락 상태 →
101
은 DFA에 의해 수락됨.
- q₀에서 시작,
- 문자열
1010
:- q₀에서 시작,
1
을 읽고 q₁로 이동. - q₁에서
0
을 읽고 q₁에 머무름. - q₁에서
1
을 읽고 q₂로 이동. - q₂에서
0
을 읽고 q₁로 이동. - 문자열이 끝났고 q₁은 수락 상태가 아님 →
1010
은 DFA에 의해 거부됨.
- q₀에서 시작,
- 문자열
- DFA 언어 소속 여부 판별
- 문자열이 DFA의 초기 상태에서 수락 상태로 도달한다면 해당 문자열은 DFA 언어에 속함.
- 문자열 처리 중 수락 상태에 도달하지 못하면 해당 문자열은 DFA 언어에 속하지 않음.
- 문제 정의
- DFA(Deterministic Finite Automata)를 구성하는 두 가지 문제를 다룸:
- 모든 이진 문자열(0, 1 포함), ε(빈 문자열) 포함하여 수락하는 DFA
- 모든 이진 문자열 중 ε(빈 문자열)을 제외하고 수락하는 DFA
- DFA(Deterministic Finite Automata)를 구성하는 두 가지 문제를 다룸:
1. 모든 이진 문자열 포함 (ε 포함)
요구사항
- 입력 기호: Σ = {0, 1}
- DFA는 ε 및 모든 가능한 이진 문자열(0, 1) 조합을 수락해야 함.
- ε을 수락하려면 DFA의 초기 상태가 곧 수락 상태여야 함.
DFA 설계
- 상태:
q₀
: 초기 상태이자 수락 상태 (ε 및 모든 문자열 수락).
- 전이:
q₀
에서 입력이0
또는1
일 때, 상태는 그대로 유지 (q₀
).
- 결론:
- DFA는 하나의 상태(q₀)만으로 구성되며, 모든 문자열을 수락.
결과
- 언어: {ε, 0, 1, 00, 01, 10, 11, ...} (무한 집합).
- DFA는 상태 하나만으로도 모든 이진 문자열을 처리할 수 있음.
2. 모든 이진 문자열 포함 (ε 제외)
요구사항
- 입력 기호: Σ = {0, 1}
- DFA는 ε을 제외한 모든 이진 문자열을 수락해야 함.
- ε을 제외하려면 초기 상태(q₀)는 수락 상태가 아니어야 하며, 최소 한 개 이상의 입력을 받아야 수락 상태로 전이.
DFA 설계
- 상태:
q₀
: 초기 상태 (ε 포함 불가).q₁
: 수락 상태 (최소 하나의 입력 후).
- 전이:
q₀
에서:- 입력이
0
또는1
일 때,q₁
로 전이.
- 입력이
q₁
에서:- 입력이
0
또는1
일 때, 상태는 그대로 유지 (q₁
).
- 입력이
- 결론:
- DFA는 두 개의 상태(q₀, q₁)로 구성되며, ε을 제외한 모든 이진 문자열을 수락.
결과
- 언어: {0, 1, 00, 01, 10, 11, ...} (ε 제외).
- DFA는 초기 상태에서 최소 하나의 입력을 처리한 후 수락 상태로 전이.
- DFA에서 문자열을 입력받다가 수락 상태에 도달하면, 입력받은 문자열이 DFA의 언어(L)에 속한다고 판단합니다.
- 그런데 초기 상태가 수락 상태라면, DFA는 입력 없이도(즉, ε 상태에서) 이미 수락 상태에 머물러 있기 때문에 빈 문자열(ε)을 수락한다고 판단하게 됩니다.
다시 정리하자면:
- DFA의 동작 원리
- DFA는 입력 문자열을 하나씩 처리하며 상태를 전이합니다.
- 문자열 처리가 끝난 뒤 현재 상태가 수락 상태라면, 해당 문자열은 DFA의 언어에 속한다고 판단합니다.
- 초기 상태가 수락 상태라면?
- 입력을 전혀 받지 않은 상태, 즉 ε 상태에서 DFA가 초기 상태에 머뭅니다.
- 초기 상태가 수락 상태에 포함되어 있다면, DFA는 빈 문자열(ε)을 언어에 포함시킵니다.
문제 1: 모든 문자열이 0으로 시작
요구사항
- 언어: 모든 문자열이 "0"으로 시작하고, 그 뒤에 어떤 문자열이 와도 수락.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태 (시작 상태)
- ( q_1 ): "0"으로 시작했음을 확인한 수락 상태
- ( q_{\text{dead}} ): "1"로 시작한 문자열을 처리하는 죽음 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )로 전이
- 입력 "1" → ( q_{\text{dead}} )로 전이
- ( q_1 ):
- 입력 "0" 또는 "1" → ( q_1 )에 머무름
- ( q_{\text{dead}} ):
- 입력 "0" 또는 "1" → ( q_{\text{dead}} )에 머무름
- ( q_0 ):
- 최종 상태: ( F = {q_1} )
동작
- 입력이 "0"으로 시작하면 ( q_1 )에 도달 → 수락.
- 입력이 "1"으로 시작하면 ( q_{\text{dead}} )에 도달 → 거부.
문제 2: 모든 문자열이 "10"으로 시작
요구사항
- 언어: 모든 문자열이 "10"으로 시작하고, 그 뒤에 어떤 문자열이 와도 수락.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태
- ( q_1 ): 첫 번째 "1"을 읽은 상태
- ( q_2 ): "10"으로 시작했음을 확인한 수락 상태
- ( q_{\text{dead}} ): 조건을 만족하지 못하는 문자열을 처리하는 죽음 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "1" → ( q_1 )로 전이
- 입력 "0" → ( q_{\text{dead}} )로 전이
- ( q_1 ):
- 입력 "0" → ( q_2 )로 전이
- 입력 "1" → ( q_{\text{dead}} )로 전이
- ( q_2 ):
- 입력 "0" 또는 "1" → ( q_2 )에 머무름
- ( q_{\text{dead}} ):
- 입력 "0" 또는 "1" → ( q_{\text{dead}} )에 머무름
- ( q_0 ):
- 최종 상태: ( F = {q_2} )
동작
- 입력이 "10"으로 시작하면 ( q_2 )에 도달 → 수락.
- "10"으로 시작하지 않으면 ( q_{\text{dead}} )에 도달 → 거부.
문제 3: 모든 문자열이 "011"로 시작
요구사항
- 언어: 모든 문자열이 "011"로 시작하고, 그 뒤에 어떤 문자열이 와도 수락.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태
- ( q_1 ): 첫 번째 "0"을 읽은 상태
- ( q_2 ): "01"을 읽은 상태
- ( q_3 ): "011"을 읽고 수락한 상태
- ( q_{\text{dead}} ): 조건을 만족하지 못하는 문자열을 처리하는 죽음 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )로 전이
- 입력 "1" → ( q_{\text{dead}} )로 전이
- ( q_1 ):
- 입력 "1" → ( q_2 )로 전이
- 입력 "0" → ( q_{\text{dead}} )로 전이
- ( q_2 ):
- 입력 "1" → ( q_3 )로 전이
- 입력 "0" → ( q_{\text{dead}} )로 전이
- ( q_3 ):
- 입력 "0" 또는 "1" → ( q_3 )에 머무름
- ( q_{\text{dead}} ):
- 입력 "0" 또는 "1" → ( q_{\text{dead}} )에 머무름
- ( q_0 ):
- 최종 상태: ( F = {q_3} )
동작
- 입력이 "011"로 시작하면 ( q_3 )에 도달 → 수락.
- "011"로 시작하지 않으면 ( q_{\text{dead}} )에 도달 → 거부.
문제 1: 모든 문자열이 "0"으로 끝나야 함
요구사항
- 언어: 모든 문자열이 "0"으로 끝나야 함. 문자열의 앞부분은 자유로우나 마지막 문자는 반드시 "0"이어야 함.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태 (문자열이 아직 "0"으로 끝나지 않음)
- ( q_1 ): 수락 상태 ("0"으로 끝나는 문자열)
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_0 )
- ( q_1 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_0 )
- ( q_0 ):
- 최종 상태: ( F = {q_1} )
동작
- 문자열이 마지막에 "0"으로 끝나면 ( q_1 )에 도달 → 수락.
- 문자열이 마지막에 "1"으로 끝나면 ( q_0 )에 도달 → 거부.
문제 2: 모든 문자열이 "10"으로 끝나야 함
요구사항
- 언어: 모든 문자열이 "10"으로 끝나야 함. 문자열의 앞부분은 자유로우나 마지막 두 문자는 반드시 "10"이어야 함.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태
- ( q_1 ): "1"을 읽은 상태
- ( q_2 ): "10"을 읽고 수락한 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "1" → ( q_1 )
- 입력 "0" → ( q_0 )
- ( q_1 ):
- 입력 "0" → ( q_2 )
- 입력 "1" → ( q_1 )
- ( q_2 ):
- 입력 "0" → ( q_0 )
- 입력 "1" → ( q_1 )
- ( q_0 ):
- 최종 상태: ( F = {q_2} )
동작
- 문자열이 마지막 두 문자로 "10"을 포함하면 ( q_2 )에 도달 → 수락.
- 그렇지 않으면 ( q_0 ) 또는 ( q_1 )에 머물러 거부.
문제 3: 모든 문자열이 "011"로 끝나야 함
요구사항
- 언어: 모든 문자열이 "011"로 끝나야 함. 문자열의 앞부분은 자유로우나 마지막 세 문자는 반드시 "011"이어야 함.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태
- ( q_1 ): "0"을 읽은 상태
- ( q_2 ): "01"을 읽은 상태
- ( q_3 ): "011"을 읽고 수락한 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_0 )
- ( q_1 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_2 )
- ( q_2 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_3 )
- ( q_3 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_2 )
- ( q_0 ):
- 최종 상태: ( F = {q_3} )
동작
- 문자열이 마지막 세 문자로 "011"을 포함하면 ( q_3 )에 도달 → 수락.
- 그렇지 않으면 ( q_0 ), ( q_1 ), 또는 ( q_2 )에 머물러 거부.
문제 1: 문자열에 "01"이 서브스트링으로 포함되어야 함
요구사항
- 언어: 문자열의 어느 위치에든 "01"이 반드시 포함되어야 함.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태
- ( q_1 ): "0"을 읽은 상태
- ( q_2 ): "01"을 읽고 서브스트링 조건을 충족한 수락 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_0 )
- ( q_1 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_2 )
- ( q_2 ):
- 입력 "0" 또는 "1" → ( q_2 )
- ( q_0 ):
- 최종 상태: ( F = {q_2} )
동작
- 입력 문자열이 "01"을 포함하면 ( q_2 )에 도달 → 수락.
- "01"을 포함하지 않으면 ( q_2 )에 도달하지 못함 → 거부.
문제 2: 문자열에 "100"이 서브스트링으로 포함되어야 함
요구사항
- 언어: 문자열의 어느 위치에든 "100"이 반드시 포함되어야 함.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태
- ( q_1 ): "1"을 읽은 상태
- ( q_2 ): "10"을 읽은 상태
- ( q_3 ): "100"을 읽고 서브스트링 조건을 충족한 수락 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "1" → ( q_1 )
- 입력 "0" → ( q_0 )
- ( q_1 ):
- 입력 "0" → ( q_2 )
- 입력 "1" → ( q_1 )
- ( q_2 ):
- 입력 "0" → ( q_3 )
- 입력 "1" → ( q_1 )
- ( q_3 ):
- 입력 "0" 또는 "1" → ( q_3 )
- ( q_0 ):
- 최종 상태: ( F = {q_3} )
동작
- 입력 문자열이 "100"을 포함하면 ( q_3 )에 도달 → 수락.
- "100"을 포함하지 않으면 ( q_3 )에 도달하지 못함 → 거부.
문제 3: 문자열에 "0110"이 서브스트링으로 포함되어야 함
요구사항
- 언어: 문자열의 어느 위치에든 "0110"이 반드시 포함되어야 함.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
- 상태:
- ( q_0 ): 초기 상태
- ( q_1 ): "0"을 읽은 상태
- ( q_2 ): "01"을 읽은 상태
- ( q_3 ): "011"을 읽은 상태
- ( q_4 ): "0110"을 읽고 서브스트링 조건을 충족한 수락 상태
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_0 )
- ( q_1 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_2 )
- ( q_2 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_3 )
- ( q_3 ):
- 입력 "0" → ( q_4 )
- 입력 "1" → ( q_0 )
- ( q_4 ):
- 입력 "0" 또는 "1" → ( q_4 )
- ( q_0 ):
- 최종 상태: ( F = {q_4} )
동작
- 입력 문자열이 "0110"을 포함하면 ( q_4 )에 도달 → 수락.
- "0110"을 포함하지 않으면 ( q_4 )에 도달하지 못함 → 거부.
1. DFA의 조건별 정의
- Prefix (접두사): 문자열이 특정 문자열로 시작해야 함.
- 예: "101"로 시작하는 문자열.
- DFA는 반드시 시작 상태에서 정해진 접두사를 읽고, 이후 어떤 문자열도 수락해야 함.
- Suffix (접미사): 문자열이 특정 문자열로 끝나야 함.
- 예: "110"으로 끝나는 문자열.
- DFA는 마지막 문자열을 확인한 후 수락 상태로 전이.
- Substring (부분 문자열): 문자열의 어디에든 특정 문자열이 포함되어야 함.
- 예: "011"이 포함된 문자열.
- DFA는 서브스트링이 확인된 이후 어떤 문자열도 수락해야 함.
2. 상태 수 계산
1) Prefix (접두사)
- 상태 수: 접두사의 길이를 ( n )이라 하면, ( n + 2 )개의 상태가 필요.
- 이유:
- 접두사를 읽는 데 ( n )개의 상태.
- 접두사가 완료된 후의 상태.
- Dead State (죽음 상태): 접두사가 아닌 문자열을 처리.
- 이유:
- 예: 문자열이 "101"로 시작 → 상태 수 ( 3(길이) + 2 = 5 ).
2) Suffix (접미사)
- 상태 수: 접미사의 길이를 ( n )이라 하면, ( n + 1 )개의 상태가 필요.
- 이유:
- 접미사를 읽는 데 ( n )개의 상태.
- 접미사가 확인된 후의 상태.
- Dead State가 필요하지 않음.
- 이유:
- 예: 문자열이 "110"으로 끝남 → 상태 수 ( 3(길이) + 1 = 4 ).
3) Substring (부분 문자열)
- 상태 수: 서브스트링의 길이를 ( n )이라 하면, ( n + 1 )개의 상태가 필요.
- 이유:
- 서브스트링을 읽는 데 ( n )개의 상태.
- 서브스트링이 확인된 후의 상태.
- Dead State가 필요하지 않음.
- 이유:
- 예: 문자열에 "011" 포함 → 상태 수 ( 3(길이) + 1 = 4 ).
3. 문제 예시
(1) 서브스트링이 "100"인 문자열의 상태 수
- 서브스트링 길이 = 3
- 상태 수: ( 3 + 1 = 4 ).
(2) 문자열이 "99개의 0"으로 끝나는 경우의 상태 수
- 접미사 길이 = 99
- 상태 수: ( 99 + 1 = 100 ).
(3) 문자열이 "111110"으로 시작하는 경우의 상태 수
- 접두사 길이 = 6
- 상태 수: ( 6 + 2 = 8 ) (Dead State 포함).
4. 요약
- Prefix (접두사): ( n + 2 )개의 상태 필요 (Dead State 포함).
- Suffix (접미사): ( n + 1 )개의 상태 필요 (Dead State 없음).
- Substring (부분 문자열): ( n + 1 )개의 상태 필요 (Dead State 없음).
문제 정의
- 언어 조건: 모든 이진 문자열에서 마지막 두 비트가 반드시 동일해야 함.
- ( \text{Accept: } 00, 11 )
- 예: "00", "1100", "1011", "01100", 등.
- 마지막 두 비트가 같지 않은 경우 문자열을 거부.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
1. DFA의 상태 정의
- 상태 설명:
- ( q_0 ): 초기 상태 (시작점, 아직 마지막 두 비트를 알 수 없음).
- ( q_1 ): 마지막 비트가 "0".
- ( q_2 ): 마지막 두 비트가 "00" (수락 상태).
- ( q_3 ): 마지막 비트가 "1".
- ( q_4 ): 마지막 두 비트가 "11" (수락 상태).
2. 상태 전이
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_3 )
- ( q_1 ):
- 입력 "0" → ( q_2 ) (마지막 두 비트: "00")
- 입력 "1" → ( q_3 )
- ( q_2 ):
- 입력 "0" → ( q_2 ) (마지막 두 비트 유지: "00")
- 입력 "1" → ( q_3 )
- ( q_3 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_4 ) (마지막 두 비트: "11")
- ( q_4 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_4 ) (마지막 두 비트 유지: "11")
- ( q_0 ):
3. DFA의 수락 상태
- 수락 상태: ( F = {q_2, q_4} )
- ( q_2 ): 마지막 두 비트가 "00".
- ( q_4 ): 마지막 두 비트가 "11".
DFA 동작
예제 1: 입력 "1011"
- ( q_0 ): 초기 상태에서 "1" 입력 → ( q_3 ).
- ( q_3 ): "0" 입력 → ( q_1 ).
- ( q_1 ): "1" 입력 → ( q_3 ).
- ( q_3 ): "1" 입력 → ( q_4 ) (수락 상태, 마지막 두 비트 "11").
- 결과: 문자열 수락.
예제 2: 입력 "10010"
- ( q_0 ): 초기 상태에서 "1" 입력 → ( q_3 ).
- ( q_3 ): "0" 입력 → ( q_1 ).
- ( q_1 ): "0" 입력 → ( q_2 ).
- ( q_2 ): "1" 입력 → ( q_3 ).
- ( q_3 ): "0" 입력 → ( q_1 ) (마지막 두 비트가 "10").
- 결과: 문자열 거부.
DFA 시각화
- 상태와 전이 요약:
q0 --0--> q1 --0--> q2 | | | v v v q3 --1--> q4 <------ q3
- ( q_0 ): 시작 상태.
- ( q_2, q_4 ): 수락 상태.
문제 정의
- 언어 조건: 이진 문자열의 처음 두 비트가 반드시 동일해야 함.
- ( \text{Accept: } 00, 11 )로 시작하는 문자열.
- 예: "00", "11", "001", "1101", "0000", 등.
- 처음 두 비트가 같지 않으면 문자열을 거부.
- 입력 알파벳: Σ = {0, 1}
DFA 설계
1. DFA의 상태 정의
- 상태 설명:
- ( q_0 ): 초기 상태 (시작점).
- ( q_1 ): 첫 번째 비트가 "0".
- ( q_2 ): 처음 두 비트가 "00" (수락 상태).
- ( q_3 ): 첫 번째 비트가 "1".
- ( q_4 ): 처음 두 비트가 "11" (수락 상태).
- ( q_{\text{dead}} ): 처음 두 비트가 같지 않을 때로 이동하는 죽음 상태.
2. 상태 전이
- 전이 규칙:
- ( q_0 ):
- 입력 "0" → ( q_1 )
- 입력 "1" → ( q_3 )
- ( q_1 ):
- 입력 "0" → ( q_2 ) (처음 두 비트가 "00").
- 입력 "1" → ( q_{\text{dead}} ) (처음 두 비트가 "01").
- ( q_2 ):
- 입력 "0" 또는 "1" → ( q_2 ) (처음 두 비트 "00" 충족 후 어떤 문자열도 수락).
- ( q_3 ):
- 입력 "1" → ( q_4 ) (처음 두 비트가 "11").
- 입력 "0" → ( q_{\text{dead}} ) (처음 두 비트가 "10").
- ( q_4 ):
- 입력 "0" 또는 "1" → ( q_4 ) (처음 두 비트 "11" 충족 후 어떤 문자열도 수락).
- ( q_{\text{dead}} ):
- 입력 "0" 또는 "1" → ( q_{\text{dead}} ) (죽음 상태 유지).
- ( q_0 ):
3. DFA의 수락 상태
- 수락 상태: ( F = {q_2, q_4} )
- ( q_2 ): 처음 두 비트가 "00".
- ( q_4 ): 처음 두 비트가 "11".
DFA 동작
예제 1: 입력 "0011"
- ( q_0 ): 초기 상태에서 "0" 입력 → ( q_1 ).
- ( q_1 ): "0" 입력 → ( q_2 ) (수락 상태, 처음 두 비트 "00").
- ( q_2 ): "1" 입력 → ( q_2 ).
- ( q_2 ): "1" 입력 → ( q_2 ).
- 결과: 문자열 수락.
예제 2: 입력 "1010"
- ( q_0 ): 초기 상태에서 "1" 입력 → ( q_3 ).
- ( q_3 ): "0" 입력 → ( q_{\text{dead}} ) (처음 두 비트 "10").
- ( q_{\text{dead}} ): 나머지 입력은 모두 ( q_{\text{dead}} )에 머뭄.
- 결과: 문자열 거부.
DFA 시각화
- 상태와 전이 요약:
q0 --0--> q1 --0--> q2 | | | v v v q3 --1--> q4 <------ q3 \ / / \---> q_dead <---
- ( q_0 ): 시작 상태.
- ( q_2, q_4 ): 수락 상태.
- ( q_{\text{dead}} ): 거부 상태.
'강의 > Theory of Computation' 카테고리의 다른 글
Non-Deterministic PushDown Automata (NFA) (0) | 2025.02.05 |
---|---|
Construction of Minimal DFA Examples (0) | 2025.02.02 |
TOC Fundamentals, Regular Languages (0) | 2025.01.28 |
Introduction (0) | 2025.01.26 |