POSIX BRE có thể diễn đạt tất cả các ngôn ngữ thông thường không?


12

Dường như "Biểu thức chính quy cơ bản" như được định nghĩa bởi POSIX.1-2008 không hỗ trợ xen kẽ, a|b(mặc dù một số triển khai grep nhận ra phiên bản đã thoát, \|).

Vì các ngôn ngữ thông thường được đóng theo liên kết theo định nghĩa, điều này có nghĩa là POSIX BRE có sức mạnh biểu cảm ít hơn một máy tự động hữu hạn? Hoặc có một số cách để mô phỏng xen kẽ bằng cách sử dụng các cấu trúc khác?

Câu trả lời:


17

Thật vậy, ngôn ngữ POSIX BRE không thể diễn tả tất cả các biểu thức thông thường vì nó thiếu xen kẽ. Nó thậm chí không thể nhận ra tất cả các ngôn ngữ hữu hạn, nói gì đến tất cả các ngôn ngữ thông thường.

Ví dụ: không thể nhận ra dưới dạng BRE. Để chứng minh điều này, hãy xem xét hình thức cú pháp của toplevel có thể là gì:{mộtb,bmột}

  • Nó không thể là một trong những dạng ký tự đơn vì ngôn ngữ có các từ có độ dài .>1
  • Nó không thể là vì đó sẽ phù hợp với chuỗi rỗng.R*
  • Không thể là ngoại trừ với m = n = 1 (trong trường hợp đó chúng tôi quay lại vấn đề ban đầu) vì điều đó sẽ khớp với các chuỗi có độ dài khác nhau hoặc chuỗi trống.R{m,n}m= =n= =1
  • Vì vậy, nó phải được nối: . Bây giờ xem xét như thế nào một b được công nhận: R1R2mộtb
    • Nếu nhận một b sau đó R 2 không phải nhận bất cứ điều gì bất cứ điều gì khác hơn là chuỗi rỗng. Vì vậy, R 1 phải nhận ra { a b , b a } và chúng tôi quay lại vấn đề ban đầu.R1mộtbR2R1{mộtb,bmột}
    • Nếu nhận một nhưng không một b sau đó R 2 phải công nhận b . Nhưng sau đó R 1 R 2 nhận ra tất cả các từ có dạng u b trong đó R 1 nhận ra u , vì vậy R 1 không được nhận ra bất cứ điều gì ngoài a . Không có cách nào để nhận ra b a .R1mộtmộtbR2bR1R2bạnbR1bạnR1mộtbmột
    • Nếu nhận không phải một b cũng không một thì cách duy nhất cho R để nhận ra một b là nếu R 1 nhận chuỗi rỗng, trong trường hợp này chúng tôi trở lại vấn đề ban đầu như trên, nhưng đối với R 2 lần này.R1mộtbmộtRmộtbR1R2

Khi chúng tôi quay trở lại vấn đề ban đầu, điều đó có nghĩa là giải pháp duy nhất để tìm BRE nhận ra ngôn ngữ là tìm một BRE nhỏ hơn có cùng thuộc tính. Đây là một dòng dõi vô hạn , vì vậy không có BRE có thuộc tính mong muốn.

Tôi không nghĩ rằng có một đặc tính của các ngôn ngữ BRE dễ nhận biết, ví dụ như các ngôn ngữ có thể nhận biết được bởi một lớp automata tốt đẹp.

{ww|w{một,b}*}\(.*\)\1


1
Nếu bạn đang sử dụng một công cụ như grep có thể chấp nhận nhiều biểu thức được phân tách bằng dòng mới để khớp, hãy lấy sản phẩm cartesian của tất cả các lựa chọn thay thế (ví dụ: {ab, ba} {ab, ba} trở thành {abba, abba, baab, baba}) đủ để tương đương với bất kỳ "BRE-plus-xen kẽ" nào và do đó có bất kỳ ngôn ngữ thông thường nào không?
Random832

1
@ Random832: Cố gắng làm (abc|bac)*.
rici
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.