결정적 유한 오토 마톤 튜플 유한 상태 기계 다중 상태에 매핑된다. 즉. DFA 의 일반적인 δ : Q × Σ → Q 전환 기능을 다른 기능 Δ : Q × Σ → P ( Q )로 대체합니다 .
NFA가 무엇인지 아는 경우 다음 섹션을 건너 뛰어도됩니다.
공식적인 정의
NFA는 다음과 같이 고유하게 설명됩니다.
- 유한 한 상태 집합
- 유한 한 기호 세트
- 전환 기능
- 초기 상태
- 최종 상태 세트
기계는 에서 시작 하여 유한 문자 스트링 w ∈ Σ ∗를 읽습니다. 각 심볼에 대해 현재 상태와 함께 전이 기능 기능을 동시에 적용하고 새로운 각 상태 세트를 현재 상태 세트에 추가합니다.
도전
이 문제를 해결 하기 위해 를 무시 하고 알파벳은 항상 (소문자) a ~ z 문자 이며 음수가 아닌 정수 N 의 경우 상태 세트는 { 0 … N } 입니다 . 초기 상태는 항상 0 입니다.
단어 와 NFA에 대한 설명이 주어지면 모든 최종 상태를 결정해야합니다.
예
문자열 과 다음 설명을 고려하십시오 .
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
기계는 에서 시작합니다 .
- : 새로운 상태 { 1 }을 읽으십시오
- 읽기 a : 새로운 상태 { 1 , 2 }
- 읽기 : 새로운 상태 { 0 }
- : 새로운 상태 { 1 }을 읽으십시오
- 읽기 a : 새로운 상태 { 1 , 2 }
따라서 최종 상태 및 결과는 입니다.
주의 : 단계 (2) 의 상태의 변화가 지도가 ∅ 설명이 단지 비어 세트로 천이를 포함한다.
규칙
입력은 문자열과 NFA에 대한 일종의 설명으로 구성됩니다 ( 전환 없음).
- 입력 문자열은 항상 { a … z }의 요소입니다. ∗
- 유효한 입력 (제한되지 않음) :
- 튜플 /리스트의 목록 / 배열
- 개행으로 분리 된 입력
- NFA에 대한 설명에는 결과로 비어 있지 않은 세트가있는 전환 만 포함됩니다.
- 결과가 동일한 경우 동일한 문자로 규칙을 축약 할 수 있습니다 (예 : 규칙
0,'a',[1,2]
및 다음과0,'b',[1,2]
같이 축약 될 수 있음)0,"ab",[1,2]
- 각 규칙을 따로 따를
0,'a',[1,2]
수 있습니다 (예 : 규칙 은0,'a',[1]
및0,'a',[2]
)
- 결과가 동일한 경우 동일한 문자로 규칙을 축약 할 수 있습니다 (예 : 규칙
- 원하는 경우 대문자를 선택할 수 있습니다
- 상태 수를 입력으로 사용할 수 있습니다
- 어떤 종류의 입력 순서를 가정 할 수 있습니다 (예 : 상태 또는 기호로 정렬)
출력은 최종 상태의 목록 / 세트 / 줄 바꾸기로 구분 된 출력 등이됩니다
- 순서는 중요하지 않습니다
- 중복되지 않습니다 (세트이므로)
테스트 사례
이러한 예는 형식이됩니다 튜플의 목록입니다 :description word -> states
description
(state,symbol,new-states)
[] "x" -> []
[] "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])] "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])] "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "abb" -> [1,2]