Tại sao không có hoán vị trong Regexes? (Ngay cả khi các ngôn ngữ thông thường dường như có thể làm điều này)


13

Vấn đề

Không có cách nào dễ dàng để có được hoán vị với regex.

  • Hoán vị: Bắt một từ ("aabc") sang một thứ tự khác, mà không thay đổi số lượng hoặc loại chữ cái.
    w=x1xn
  • Regex: Biểu thức chính quy.

Để xác minh:

Loại giải pháp tôi đang tìm kiếm

Nó nên có dạng:

  • »Aabc« (hoặc bất cứ điều gì khác mà bạn có thể sử dụng dấu ngoặc đơn mở và đóng)
  • (aabc)! (tương tự (abc)? nhưng cuối cùng có một biểu tượng khác)
  • [aabc]! (tương tự như [abc] + nhưng cuối cùng có một biểu tượng khác)

Ưu điểm của các giải pháp này

Họ đang:

  • dễ dàng
  • thích nghi
  • tái sử dụng

Tại sao điều này nên tồn tại

  • Regexes là một cách để mô tả một ngữ pháp của ngôn ngữ thông thường. Họ có toàn bộ sức mạnh để trở thành bất kỳ loại ngôn ngữ thông thường nào.
  • Giả sử, ngôn ngữ thông thường đủ mạnh để hoán vị (bằng chứng bên dưới) - tại sao không có cách nào dễ dàng để diễn đạt điều này?

Vì vậy, câu hỏi của tôi là:

  • (Tại sao) Bằng chứng của tôi sai?
  • Nếu nó đúng: Tại sao không có cách dễ dàng để thể hiện hoán vị?

Bằng chứng

  • Biểu thức chính quy là một cách để lưu ý ngữ pháp của ngôn ngữ thông thường. Họ có thể mô tả bất kỳ ngữ pháp thông thường.
  • Một cách khác để mô tả bất kỳ ngôn ngữ thông thường nào (có số lượng chữ cái hữu hạn trong bảng chữ cái của chúng) ngữ pháp là Automatons không xác định (với số lượng trạng thái hữu hạn).

Có số lượng chữ cái hữu hạn tôi có thể tạo ra máy tự động này: (Ví dụ. Chính thức: xem bên dưới)

Ngữ pháp chấp nhận hoán vị của "abbc":

(sry cho số trên đầu, có thể ai đó biết làm thế nào để làm cho phần này nhìn tốt hơn)

s -> ah¹

s -> bh²

s -> ch³

h¹ -> bh¹¹

h¹ -> ch¹²

h² -> ah¹¹ (không có lỗi đánh máy!

h² -> bh²²

h² -> ch²³

h³ -> ah¹²

h³ -> bh²³

h¹¹ -> bc

h¹¹ -> cb

h¹² -> bb

h²² -> ac

h²² -> ca

h²³ -> ab

h²³ -> ba

Chính thức hơn: (sử dụng một máy tự động trạng thái hữu hạn nhưng điều này cũng có thể được thực hiện với ngữ pháp)

  • Một từ q (có độ dài hữu hạn) mà bất kỳ hoán vị nào cũng sẽ đạt đến trạng thái chấp nhận.
  • X là bảng chữ cái hữu hạn.
  • Tập hợp các trạng thái S chứa bất kỳ thứ tự các chữ cái có độ dài bằng q. (Vì vậy, kích thước của S là hữu hạn.) Cộng với một trạng thái "bất kỳ từ nào dài hơn".
  • chức năng chuyển trạng thái d trong đó lấy một chữ cái và di chuyển trên trạng thái tương ứng với phần hiện đang đọc của từ này.
  • F là tập hợp các trạng thái đó là hoán vị chính xác của q.

Vì vậy, có thể tạo ra một máy tự động trạng thái hữu hạn để chấp nhận hoán vị của một từ nhất định.

Tiếp tục với bằng chứng

Vì vậy, tôi đã chứng minh rằng các ngôn ngữ thông thường có khả năng kiểm tra hoán vị, phải không?

Vậy tại sao không có cách tiếp cận nào để đạt được điều này với Regexes? Đây là một chức năng hữu ích.


10
Bạn có thể liệt kê tất cả các hoán vị của từ của bạn với một biểu thức thông thường. Biểu thức kết quả sẽ khá lớn, nhưng chắc chắn sẽ là biểu thức chính quy.
Yuval Filmus

7
Tôi đề nghị bỏ qua tất cả các câu trả lời về Lý thuyết tính toán trên stackoverflow. Đây không phải là đặc sản của trang web.
Yuval Filmus 17/11/18

Câu trả lời trên trang được liên kết của bạn ở đây - stackoverflow.com/a/3102205/6936386 - dường như có thể dễ dàng điều chỉnh và không quá phức tạp: ^(a()|a()|b()|c()){4}\2\3\4\5$dường như hoạt động (xem regex101.com/r/9URPpg/4/tests ).
boboquack

7
@boboquack Đó không phải là một biểu thức chính quy theo nghĩa mà thuật ngữ này được sử dụng trong khoa học máy tính. (Loại điều này chính xác là lý do tại sao Yuval đề nghị không tin vào các câu trả lời của Stack Overflow về CS lý thuyết.)
David Richerby 18/11/18

Câu trả lời:


37

Các định lý cơ bản của lý thuyết ngôn ngữ chính thức là các biểu thức chính quy, ngữ pháp thông thường, automata hữu hạn xác định (DFAs) và automata hữu hạn hữu hạn (NFA) đều mô tả cùng một loại ngôn ngữ: cụ thể là các ngôn ngữ thông thường. Việc chúng ta có thể mô tả các ngôn ngữ này theo nhiều cách hoàn toàn khác nhau cho thấy rằng có những điều tự nhiên và quan trọng về các ngôn ngữ này, giống như cách tương đương của máy Turing, phép tính lambda và tất cả các loại ngôn ngữ khác cho thấy các ngôn ngữ có thể tính toán được là tự nhiên và quan trọng. Chúng không chỉ là một tạo tác của bất kỳ quyết định ngẫu nhiên nào mà người khám phá ban đầu đưa ra.

Rπ(R)RL(π(abc))={abc,acb,bac,bca,cab,cba}L(π((ab))))ab

Vì vậy, để trả lời câu hỏi tiêu đề, các biểu thức chính quy không thể hoán vị và chúng tôi không thêm khả năng đó vì khi đó các biểu thức chính quy sẽ không khớp với các ngôn ngữ thông thường. Phải nói rằng, có thể "các biểu thức chính quy với hoán vị" cũng sẽ là một lớp ngôn ngữ thú vị với nhiều đặc điểm khác nhau.


Nhưng L ((ab) *) cũng không phải là ngôn ngữ thông thường - vì vậy L (perm ((ab) *)) không thể là một ngôn ngữ. ((ab) * không phải là ngôn ngữ thông thường vì không có loại bộ nhớ để nhớ có bao nhiêu "a" mở, vì vậy với số lượng trạng thái hữu hạn, bạn không thể đặt cùng số "b" s.)
Asqiir

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

4
ab

2
Bạn hoàn toàn đúng. Tôi đã bỏ lỡ quan điểm "đặt các biểu thức chính quy vào nhau", tôi chỉ nghĩ về việc "hoán vị một từ cố định" chứ không phải "hoán vị một biểu thức chính quy khác" mà tất nhiên là không thể.
Asqiir

1
Có lẽ các biểu thức chính quy với hoán vị mô tả một lớp ngôn ngữ có các thuộc tính thú vị, nhưng tôi chưa bao giờ cần đến !toán tử trong thực tế và tôi cho rằng rất ít người có, vì nó dễ thực hiện và không triển khai các biểu thức chính quy mở rộng đã thấy hỗ trợ nó.
Revierpost

16

Vì vậy, câu hỏi của tôi là:

  • (Tại sao) Bằng chứng của tôi sai?
  • Nếu nó đúng: Tại sao không có cách dễ dàng để thể hiện hoán vị?

"Bằng chứng" của bạn chỉ nhìn vào hoán vị của các từ đơn, là ngôn ngữ hữu hạn.

Mọi ngôn ngữ hữu hạn đều đều (ví dụ: chỉ bằng cách liệt kê tất cả các thành viên có một phần giữa |), nhưng có những ngôn ngữ thông thường vô hạn (và những ngôn ngữ nói chung là những ngôn ngữ thú vị hơn).

Ngay khi bạn nhận được một biểu thức chính quy (hoặc ngữ pháp / automaton) chấp nhận một ngôn ngữ vô hạn (nghĩa là một biểu thức với *toán tử hoặc một máy tự động có vòng lặp), công trình của bạn không hoạt động nữa (bạn có một ngữ pháp / tự động vô hạn ).

Câu trả lời của David Richerby đã cung cấp một ví dụ về một ngôn ngữ thông thường mà ngôn ngữ hoán vị không còn thường xuyên nữa - tất cả các ví dụ như vậy là ngôn ngữ vô hạn.


8

ΣnΣmO(m)

Vì vậy, trong một số ý nghĩa, không có cách ngắn gọn để chỉ định tất cả các hoán vị của một từ.


Ω~(2n)ΣnmO(m)

L(xi,yi)1iN

  • xiyiL
  • ijxiyjLxjyiL

LNLixiyiqixiqiqjijqi=qjxiyjxjyiL

Lnσ1,,σnnSσ1,,σnn/2xSSySSxSySLnSTxSyTLnLn(nn/2)=Ω(2n/n)


Điều này có nghĩa là 1) về mặt lý thuyết, có thể cho phép »abc« khớp với tất cả {abc, acb, bac, bca, cab, cba} nhưng nó không hiệu quả và sẽ khiến chúng quá chậm vì »abc« sẽ mở rộng theo cấp số nhân (abc | acb | bac | bca | taxi | cba)? hoặc 2) Loại máy tự động tôi cần là không thể chỉ định tất cả các hoán vị cho một từ nhất định?
Asqiir

1
abcabc+acd+bac+bca+cab+cba1+3+6+6+1=17abcdefghij.
Yuval Filmus 17/11/18

1
Điều tôi hiểu: Về lý thuyết, các ngôn ngữ thông thường có thể chấp nhận hoán vị (các biểu thức chính quy cũng vậy). Không có "cách đơn giản" để viết "hoán vị abc" như »abc«. (Vì bất cứ lý do gì.)
Asqiir 17/11/18

1
Vâng, đó là một bản tóm tắt tốt. Tôi sẽ xem liệu tôi có thể đưa ra một đối số đơn giản hơn cho các biểu thức thông thường không.
Yuval Filmus

2
Đối với độc giả tương lai: đây không phải là câu trả lời chính xác! (Sửa lỗi cho tôi nếu tôi sai.) Hãy tìm người được chấp nhận.
Asqiir

0

Tại sao không có cách nào để viết "hoán vị" trong Regexes

Một hoán vị của một ngôn ngữ thông thường, vô hạn (số lượng từ vô hạn) không nhất thiết phải thường xuyên. Vì vậy, nó không thể được viết là regex.

Bằng chứng

Hãy nghĩ về ngôn ngữ (ab)*. (Ví dụ lấy cảm hứng từ David Richerby .) Một trong những hoán vị của nó là a*b*. Đây không phải là một ngôn ngữ thông thường. qed.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.