정규식에 순열이없는 이유는 무엇입니까? (일반 언어가 이것을 할 수있는 것처럼 보일지라도)


13

문제

정규 표현식으로 순열을 얻는 쉬운 방법은 없습니다.

  • 순열은 : 얻기 단어 번호를 변경하거나 종류의 문자 않고, 다른 순서 ( "AABC을").
    =엑스1엑스
  • 정규식 : 정규식.

확인을 위해 :

내가 찾고있는 솔루션의 종류

다음과 같은 형식이어야합니다.

  • »aabc«(또는 다른 괄호를 사용할 수있는 다른 것)
  • (aabc)! ((abc)와 비슷하지만 끝에 다른 기호가 있음)
  • [aabc]! ([abc] +와 유사하지만 끝에 다른 기호가 있음)

이 솔루션의 장점

그들은:

  • 쉬운
  • 적응할 수 있는
  • 재사용 가능

이것이 존재해야하는 이유

  • 정규식은 정규 언어의 문법을 설명하는 방법입니다. 그들은 모든 종류의 정규 언어가 될 수있는 모든 힘을 가지고 있습니다.
  • 일반 언어는 순열에 충분할 정도로 강력합니다 (아래 증명). 이것을 표현하는 쉬운 방법이없는 이유는 무엇입니까?

그래서 내 질문은 :

  • (왜) 내 증거가 잘못 되었나요?
  • 맞다면 : 순열을 표현하는 쉬운 방법이없는 이유는 무엇입니까?

증거

  • 정규 표현식은 정규 언어의 문법을 주목하는 한 가지 방법입니다. 정규 언어 문법을 설명 할 수 있습니다.
  • 정규 언어 (알파벳 내에 유한 한 글자 수를 가진) 문법을 설명하는 또 다른 방법은 결정적이지 않은 오토 마톤 (유한 한 수의 상태)입니다.

유한 한 글자 수를 가지고이 오토 마톤을 만들 수 있습니다 : (예. 형식 : 아래 참조)

"abbc"의 순열을 허용하는 문법 :

(위에 숫자를 검색하십시오. 어쩌면 누군가 가이 부분을 더 잘 보이게하는 방법을 알고있을 것입니다)

s-> 아 ¹

s-> bh²

s-> ch³

h¹-> bh¹¹

h¹-> ch¹²

h²-> 아 ¹¹ (오타가 없습니다!)

h²-> bh²²

h²-> ch²³

h³-> 아 ¹²

h³-> bh²³

h¹¹-> bc

h¹¹-> cb

h¹²-> bb

h²²-> ac

h²²-> ca

h²³-> ab

h²³-> 바

더 공식적인 : (유한 상태-자동 사용하지만 문법으로도 만들 수 있음)

  • 순열이 허용 상태에 도달해야하는 단어 q (유한 길이)
  • X는 유한 알파벳입니다.
  • 상태 집합 S에는 최대 q 길이의 문자 순서가 포함됩니다. (따라서 S의 크기는 유한합니다.) 그리고 "더 이상 단어"의 한 상태가 더해집니다.
  • 문자를 취하고 단어의 현재 읽은 부분에 해당하는 상태로 이동하는 상태 전이 함수 d.
  • F는 q의 정확한 순열 인 상태 집합입니다.

따라서 주어진 단어의 순열을 받아 들일 수있는 유한 상태 오토 마톤을 만들 수 있습니다.

증거로 진행

그래서 정규 언어가 순열을 검사 할 수있는 힘을 가지고 있음을 증명했습니다.

그렇다면 왜 Regexes를 사용하여 접근 할 수 없습니까? 유용한 기능입니다.


10
정규식으로 단어의 모든 순열을 나열 할 수 있습니다. 결과 표현식은 상당히 크지 만 확실히 정규 표현식입니다.
유발 Filmus

7
스택 오버플로에서 계산 이론에 대한 모든 답변을 무시하는 것이 좋습니다. 이것은 해당 사이트의 전문 분야가 아닙니다.
유발 Filmus

- 여기 링크 된 페이지에 대답 stackoverflow.com/a/3102205/6936386은 - 너무 복잡 쉽게 적응하지 것 같다 : ^(a()|a()|b()|c()){4}\2\3\4\5$(참조 작동하는 것 같다 regex101.com/r/9URPpg/4/tests을 ).
boboquack

7
@boboquack 이것은 컴퓨터 과학에서이 용어가 사용된다는 의미에서 정규 표현이 아닙니다. (이런 종류의 이유는 Yuval이 이론적 CS에 대한 스택 오버플로 답변을 믿지 말 것을 제안하는 이유입니다.)
David Richerby

답변:


37

공식 언어 이론의 기본 정리는 정규 표현, 정규 문법, 결정 론적 유한 오토마타 (DFA) 및 비결정론 적 유한 오토마타 (NFA)가 모두 같은 종류의 언어, 즉 정규 언어를 설명한다는 것입니다. 이러한 언어를 매우 다양한 방식으로 설명 할 수 있다는 사실은 튜링 머신, 람다 미적분학 및 기타 모든 종류의 동등성이 계산 가능한 언어와 동일한 방식으로 이러한 언어에 대해 자연스럽고 중요한 것이 있음을 시사합니다 자연스럽고 중요합니다. 그들은 원래 발견자가 만든 임의의 결정에 대한 인공물이 아닙니다.

아르 자형π(아르 자형)아르 자형L(π(abc))={abc,acb,bac,bca,cab,c}(π(())))

따라서 제목 질문에 대답하기 위해 정규 표현식 순열을 수행 할 수 없으며 정규 표현식은 정규 언어와 일치하지 않으므로 이러한 기능을 추가 할 수 없습니다. "순열이있는 정규 표현식"도 다양한 특성을 가진 흥미로운 언어 클래스 일 수 있습니다.


그러나 L ((ab) *)도 정규 언어가 아니므로 L (perm ((ab) *))은 하나가 될 수 없습니다. ((ab) *는 개방 된 "a"의 수를 기억할 메모리가 없기 때문에 정규 언어가 아닙니다. 따라서 한정된 수의 상태에서는 같은 수의 "b"를 넣을 수 없습니다.
Asqiir

9
L((ab)){ε,ab,abab,ababab,abababab,}{ε,ab,aabb,aaabbb,aaaabbbb,}

4

2
당신은 완전히 옳습니다. 나는 "정규 표현을 서로에 넣는"요점을 놓쳤다. 물론 "정규 단어를 바꾸는 것"만이 "다른 정규 표현식을 바꾸는"것이 아니라는 생각 만했다.
Asqiir

1
아마도 순열이있는 정규 표현식은 흥미로운 속성을 가진 언어 클래스를 설명하지만 !실제로 는 연산자 가 필요 하지 않으며 구현하기 쉽고 확장 된 정규 표현식을 구현하지 않기 때문에 거의 사람이 없다고 가정합니다. ve는 그것을 지원합니다.
reinierpost

16

그래서 내 질문은 :

  • (왜) 내 증거가 잘못 되었나요?
  • 맞다면 : 순열을 표현하는 쉬운 방법이없는 이유는 무엇입니까?

"증거"는 유한 한 언어 인 단일 단어의 순열만을 보았습니다.

모든 유한 언어는 규칙적이지만 (예 : |중간에 모든 멤버를 나열하여 ), 일반 언어는 무한하며 (일반적으로 더 흥미로운 언어입니다).

무한한 언어를 받아들이는 정규 표현식 (또는 문법 / 오토 마톤)을 얻는 즉시 (즉, *연산자를 사용한 표현식 또는 루프가있는 오토 마톤) 구성이 더 이상 작동하지 않습니다 (무한 문법 / 오토 마톤을 얻습니다) ).

David Richerby의 답변은 순열 언어가 더 이상 정규 언어가 아닌 일반 언어의 예를 제공했습니다. 이러한 모든 예는 무한한 언어입니다.


8

ΣnΣmO(m)

따라서 어떤 의미에서 단어의 모든 순열을 지정하는 간결한 방법은 없습니다.


Ω~(2n)Σn미디엄영형(미디엄)

(엑스나는,와이나는)1나는

  • 엑스나는와이나는
  • 나는제이엑스나는와이제이엑스제이와이나는

나는엑스나는와이나는나는엑스나는나는제이나는제이나는=제이엑스나는와이제이엑스제이와이나는

σ1,,σ에스σ1,,σ/2엑스에스에스와이에스에스엑스에스와이에스에스엑스에스와이(/2)=Ω(2/)


이것은 1) 이론상»abc«가 모든 {abc, acb, bac, bca, cab, cba}와 일치하게하는 것이 가능하지만»abc«가 기하 급수적으로 (abc | acb | bac | bca | cab | cba)? 또는 2) 내가 필요로하는 종류의 자동 기계가 주어진 단어에 대한 모든 순열을 지정할 수 있습니까?
Asqiir

1
+++++1++6+6+1=17이자형에프h나는제이.
유발 Filmus

1
내가 이해 한 것 : 이론상, 정규 언어는 순열을 받아 들일 수있다 (정규 표현도 마찬가지이다). »abc«와 같이 "abbc의 순열"을 작성하는 "간단한 방법"은 없습니다. (어떤 이유로 든)
Asqiir

1
예, 좋은 요약입니다. 정규식에 대한 간단한 인수를 생각해 낼 수 있는지 살펴 보겠습니다.
유발 Filmus

2
미래의 독자들을 위해 : 이것은 정답이 아닙니다! (내가 틀렸다면 정정하십시오.) 받아 들여진 것을 찾으십시오.
Asqiir

0

정규식에서 "순열"을 쓰는 방법이없는 이유

규칙적이고 무한한 언어 (무한 단어 수)의 순열이 반드시 규칙적인 것은 아닙니다. 따라서 정규식으로 작성할 수 없습니다.

증명

언어를 생각하십시오 (ab)*. ( David Richerby에서 영감을 얻은 예 ) 순열 중 하나는 a*b*입니다. 이것은 일반적인 언어가 아닙니다. 청.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.