Làm thế nào để chứng minh một ngôn ngữ là thường xuyên?


48

Có nhiều phương pháp để chứng minh rằng một ngôn ngữ không thường xuyên , nhưng tôi cần làm gì để chứng minh rằng một số ngôn ngữ chính quy?

Chẳng hạn, nếu tôi được cho rằng là thường xuyên, làm thế nào tôi có thể chứng minh rằng sau đây cũng đều đặn?L 'LL

L:={wL:uv=w for uΣL and vΣ+}

Tôi có thể vẽ một máy tự động hữu hạn không điều kiện để chứng minh điều này không?


1
có một lỗi đánh máy trong định nghĩa của bạn , vui lòng chỉnh sửa để sửa. L
Ran G.

2
"Vẽ" là không có bằng chứng; bạn phải cung cấp một NFA và chứng minh rằng nó chấp nhận ngôn ngữ.
Raphael

Tôi nghĩ định nghĩa ngôn ngữ vẫn không có nghĩa gì cả ...
hugomg

2
Dù sao, ngôn ngữ cụ thể là không liên quan nếu câu hỏi là "tôi có thể rút ra một NFA để chứng minh nó là thường xuyên không". @corium, chúng ta có thể chỉnh sửa câu hỏi để phản ánh câu hỏi chung chung hơn: "làm thế nào để chứng minh rằng một cụ thể là thường xuyên" không? L
Ran G.

Câu trả lời:


48

Có, nếu bạn có thể đưa ra bất kỳ điều nào sau đây:

đối với một số ngôn ngữ , thì là thường xuyên. Có nhiều mô hình tương đương , nhưng ở trên là phổ biến nhất.LLL

Ngoài ra còn có các thuộc tính hữu ích bên ngoài thế giới "tính toán". cũng thường xuyên nếuL

  • nó là hữu hạn,
  • bạn có thể xây dựng nó bằng cách thực hiện các hoạt động nhất định trên các ngôn ngữ thông thường và các hoạt động đó được đóng cho các ngôn ngữ thông thường , chẳng hạn như

    • ngã tư,
    • bổ sung,
    • đồng hình,
    • đảo ngược,
    • trái hoặc phải thương,
    • tải nạp thường xuyên

    hơn thế nữa , hoặc

  • sử dụng định lý Nerode Myhill nếu số lớp tương đương cho là hữu hạn.L

Trong ví dụ đã cho, chúng tôi có một số ngôn ngữ (thông thường) làm cơ sở và muốn nói điều gì đó về một ngôn ngữ bắt nguồn từ nó. Theo cách tiếp cận đầu tiên - xây dựng một mô hình phù hợp cho - chúng ta có thể giả sử bất kỳ mô hình tương đương nào cho mà chúng ta mong muốn; Tất nhiên nó sẽ vẫn trừu tượng, vì không rõ. Trong cách tiếp cận thứ hai, chúng ta có thể sử dụng trực tiếp và áp dụng các thuộc tính đóng cho nó để đi đến một mô tả cho .L ' L ' L L L L 'LLLLLLL


4
Cũng có thể đáng lưu ý rằng việc chứng minh một ngôn ngữ là hữu hạn là đủ để cho thấy nó là thường xuyên. Điều đó có thể hữu ích, đặc biệt trong các bằng chứng không mang tính xây dựng của các trường hợp.
Patrick87

2
regrec's như được tìm thấy trong các ngôn ngữ lập trình có thể làm nhiều hơn so với các ngôn ngữ thông thường. Bạn sẽ phải hạn chế các cấu trúc "cổ điển".
David Lewis

4
@DavidLewis: Trên trang web này, bạn có thể cho rằng bằng "biểu thức chính quy", khái niệm cổ điển có nghĩa là.
Raphael

@DavidLewis Tôi đồng ý, người ta nên tránh "regrec" trong bối cảnh lý thuyết để tránh nhầm lẫn.
Raphael

Lưu ý rằng đối với bất kỳ viên đạn nào trong bốn viên đạn đầu tiên, bạn sẽ cần một bằng chứng cho thấy đại diện của bạn thực sự chính xác.
Raphael

10

Phương pháp cơ bản

  1. Máy tự động hữu hạn (có thể không đặc biệt, với các chuyển tiếp trống).
  2. Biểu thức chính quy.
  3. Phương trình tuyến tính phải (hoặc trái, nhưng không phải cả hai), như trong đó và là chính quy.K LX=KX+LKL
  4. Ngữ pháp thông thường (Loại 3).
  5. Hoạt động bảo tồn các ngôn ngữ thông thường (hoạt động Boolean, sản phẩm, ngôi sao, xáo trộn, hình thái, đảo ngược hình thái, đảo ngược, vv)
  6. Được công nhận bởi một monoid hữu hạn.

Phương pháp logic (thường được sử dụng trong xác minh chính thức)

  1. Logic bậc hai đơn âm (định lý Büchi).
  2. Logic thời gian tuyến tính (định lý của Kamp).
  3. Định lý cây của Rabin (logic thứ hai đơn nguyên với hai lần kế tiếp). Rất mạnh.

Phương pháp nâng cao

  1. Bổ đề bơm tinh vi. Xem ví dụ
    [1] J. Jaffe, Một bổ đề bơm cần và đủ cho các ngôn ngữ thông thường, Sigact News - SIGACT 10 (1978) 48-49.
    [2] A. Ehrenfeucht, R. Parikh và G. Rozenberg, Bơm bổ đề cho các bộ thông thường, SIAM J. Comput. 10 (1981), 536-541.
    [3] S. Varricchio, Một điều kiện bơm cho các bộ thông thường, SIAM J. Comput. 26 (1997) 764-771.

  2. Vâng đơn đặt hàng. Xem
    [4] W. Bucher, A. Ehrenfeucht, D. Haussler, Trên tổng số các cơ quan quản lý được tạo ra bởi các mối quan hệ phái sinh, Theor. Tính toán. Khoa học. 40 (1985) 131 Vang148.
    [5] M. Kunz, Giải pháp thường xuyên về bất bình đẳng ngôn ngữ và các đơn đặt hàng tốt .

  3. Hỗ trợ chuỗi .N

  4. Các phương pháp đại số dựa trên sự tải nạp (xem thêm Hoạt động bảo tồn các ngôn ngữ thông thường ).


4

Câu trả lời của Ran G. đưa ra một danh sách khá rộng rãi về các mô hình tương đương có thể được sử dụng để chỉ định các ngôn ngữ thông thường (và danh sách vẫn tiếp tục, automata hai chiều, logic MSO, nhưng được bao phủ bởi liên kết trong 'các mô hình tương đương hơn '). Và như Raphael nhấn mạnh, chúng ta cần một lập luận để thuyết phục khán giả rằng đại diện được chọn là thực sự chính xác.

Xem xét lại câu hỏi, nó thêm 'Ví dụ '. Điều đó có nghĩa là chúng ta phải đưa ra một cấu trúc hợp lệ , với bất kỳ mô hình nào ở trên, chúng tôi giả sử chỉ định ngôn ngữ , biến mô hình đó thành một cho . Đây thường sẽ là cùng một kiểu mô hình, nhưng không cần phải như vậy: chúng ta có thể bắt đầu bằng một FSA xác định cho và kết thúc bằng một mô hình không xác định cho .L L ' L L 'LLLL

Điều này bao gồm khả năng sử dụng các thao tác đóng: trong hoạt động được cung cấp rõ ràng trong ví dụ chúng ta có .L=(ΣL)Σ

Vì vậy, quan điểm của tôi là câu trả lời rất hay, nhưng chúng ta nên thêm "từ đến xây dựng", khi không xây dựng một ngôn ngữ cụ thể từ đầu.L 'LL


1
Tôi không chắc chắn những gì bạn đang nhận được. Nếu tôi có một số mô hình cho , tôi có thể chuyển đổi nó thành bất kỳ mô hình tương đương nào khác. L
Raphael

@Raphael Xin lỗi tôi đã đưa ra quan điểm của mình. Các câu trả lời trước đó dường như giải thích chúng ta có thể xây dựng một mô tả về ngôn ngữ (như automaton, hoạt động, v.v.). Tôi đồng ý. Tuy nhiên, câu hỏi dường như là về các thuộc tính đóng, xem ví dụ đưa ra. Điểm đó tôi thiếu trong các câu trả lời khác: để chứng minh một thuộc tính đóng mà bạn cho rằng bạn có một mô tả và xây dựng một thuộc tính mới.
Hendrik ngày 1

1
À, đây là ! Bây giờ tôi nhận được nó, xấu của tôi. Tôi đồng ý, khía cạnh này bị thiếu trong câu trả lời của Ran. L
Raphael

1
Tôi không chắc tại sao nó bị thiếu (hoặc chính xác là thiếu gì). Giả sử bạn có một thường xuyên'và bạn muốn chứng minh là thường xuyên là tốt, bạn có thể bắt đầu với 's DFA và sử dụng nó để xây dựng một DFA cho . Nhưng điều này được bao phủ bởi "xây dựng DFA cho " .. không hạn chế sử dụng automaton cho nhiệm vụ đó (và tự nhiên, nếu được xác định thông qua bạn sẽ buộc phải sử dụng máy tự động của ..) . Điều tương tự cũng xảy ra đối với biểu thức chính quy, đóng cửa, ngữ pháp, v.v. L L ' L L L ' L L ' L 'LLLLLLLLL
Ran G.

1
Ồ được thôi. Trên thực tế, tôi muốn chỉnh sửa câu hỏi và xóa phần "ví dụ", do đó làm cho câu hỏi trở nên tổng quát hơn và tham chiếu cho các câu hỏi tương tự trong tương lai .. (:
Ran G.

4

Đôi khi bạn sẽ gặp một ngôn ngữ được chỉ định là "tất cả các chuỗi đó mọi chuỗi con -element của thỏa mãn ", trong đó là một hằng số cố định. Trong trường hợp đó, ngôn ngữ sẽ là thường xuyên. Ý tưởng ở đây là định nghĩa một máy tự động hữu hạn, một số trạng thái "nhớ" các ký hiệu đầu vào được nhìn thấy gần đây nhất , như trong câu trả lời cho câu hỏi này .k s k ksks<some property>kk


4

Một phương pháp khác, không được bao gồm trong các câu trả lời ở trên, là chuyển đổi tự động hữu hạn . Ví dụ đơn giản, chúng ta hãy chỉ ra rằng các ngôn ngữ thông thường được đóng trong hoạt động xáo trộn , được định nghĩa như sau: Bạn có thể hiển thị bao đóng dưới xáo trộn bằng các thuộc tính đóng, nhưng bạn cũng có thể hiển thị trực tiếp bằng DFA. Giả sử rằng là một DFA chấp nhận (với ). Chúng tôi xây dựng một DFA như sau:

L1SL2={x1y1xnynΣ:x1xnL1,y1ynL2}
Ai=Σ,Qi,Fi,δi,q0iLii=1,2Σ,Q,F,δ,q0
  • Tập hợp các trạng thái là , trong đó thành phần thứ ba ghi nhớ biểu tượng tiếp theo là (khi 1) hay (khi 2).Q1×Q2×{1,2}xiyi
  • Trạng thái ban đầu là .q0=q01,q02,1
  • Các trạng thái chấp nhận là .F=F1×F2×{1}
  • Hàm chuyển đổi được xác định bởi và .δ(q1,q2,1,σ)=δ1(q1,σ),q2,2δ(q1,q2,2,σ)=q1,δ2(q2,σ),1

Một phiên bản tinh vi hơn của phương pháp này liên quan đến việc đoán . Ví dụ: chúng ta hãy chỉ ra rằng các ngôn ngữ thông thường được đóng dưới sự đảo ngược , nghĩa là, (Ở đây .) Đây là một trong những thao tác đóng tiêu chuẩn và đóng cửa dưới sự đảo ngược dễ dàng sau khi thao tác các biểu thức chính quy (có thể được coi là đối tác của chuyển đổi tự động hữu hạn để biểu thức chính quy) - chỉ cần đảo ngược biểu thức thông thường. Nhưng bạn cũng có thể chứng minh việc đóng cửa bằng NFA. Giả sử rằng được chấp nhận bởi DFA . Chúng tôi xây dựng một NFA

LR={wR:wΣ}.
(w1wn)R=wnw1LΣ,Q,F,δ,q0Σ,Q,F,δ,q0 , trong đó
  • Tập hợp các trạng thái là .Q=Q{q0}
  • Trạng thái ban đầu là .q0
  • Trạng thái chấp nhận duy nhất là .q0
  • Hàm chuyển đổi được xác định như sau: và cho mọi trạng thái và , .δ(q0,ϵ)=FqQσΣδ(q,σ)={q:δ(q,σ)=q}

(Chúng ta có thể thoát khỏi nếu chúng ta cho phép nhiều trạng thái ban đầu.) Thành phần đoán ở đây là trạng thái cuối cùng của từ sau khi đảo ngược.q0


Đoán thường liên quan đến việc xác minh. Một ví dụ đơn giản là đóng cửa theo vòng quay : Giả sử rằng được chấp nhận bởi DFA . Chúng tôi xây dựng một NFA , hoạt động như sau. Đầu tiên NFA đoán . Sau đó, nó xác minh rằng và , chuyển từ sang không xác định. Điều này có thể được chính thức hóa như sau:

R(L)={yxΣ:xyL}.
LΣ,Q,F,δ,q0Σ,Q,F,δ,q0q=δ(q0,x)δ(q,y)Fδ(q0,x)=qyx
  • Các trạng thái là . Ngoài trạng thái ban đầu , các trạng thái là , trong đó là trạng thái mà chúng tôi đoán, là trạng thái hiện tại và chỉ định xem chúng tôi có ở phần của đầu vào (khi 1) hoặc tại phần của đầu vào (khi 2).Q={q0}Q×Q×{1,2}q0q,qcurr,sqqcurrsyx
  • Các trạng thái cuối cùng là : chúng tôi chấp nhận khi .F={q,q,2:qQ}δ(q0,x)=q
  • Các hiệu ứng chuyển tiếp thực hiện đoán .δ(q0,ϵ)={q,q,1:qQ}q
  • Các chuyển đổi (với mọi và ) mô phỏng DFA gốc.δ(q,qcurr,s,σ)=q,δ(qcurr,σ),sq,qcurrQs{1,2}
  • Các hiệu ứng chuyển tiếp , với mọi và , thực hiện di chuyển từ phần sang phần. Điều này chỉ được phép nếu chúng tôi đạt đến trạng thái cuối cùng trên phần .δ(q,qf,1,ϵ)=q,q0,2qQqfFyxy

Một biến thể khác của kỹ thuật kết hợp các quầy giới hạn. Ví dụ: chúng ta hãy xem xét việc đóng khoảng cách chỉnh sửa thay đổi : Đưa ra một DFA cho , e xây dựng một NFA cho như sau:

Ek(L)={xΣ: there exists yL whose edit distance from x is at most k}.
Σ,Q,F,δ,q0LΣ,Q,F,δ,q0Ek(L)
  • Tập hợp các trạng thái là , trong đó mục thứ hai đếm số lượng thay đổi được thực hiện cho đến nay.Q=Q×{0,,k}
  • Trạng thái ban đầu là .q0=q0,0
  • Các trạng thái chấp nhận là .F=F×{0,,k}
  • Với mỗi có các hiệu ứng chuyển tiếp .q,σ,iδ(q,σ),iδ(q,i,σ)
  • Các phần chèn được xử lý bởi các hiệu ứng chuyển tiếp cho tất cả sao cho .q,i+1δ(q,i,σ)q,σ,ii<k
  • Việc xóa được xử lý bằng các chuyển đổi cho tất cả sao cho .δ(q,σ),i+1δ(q,i,ϵ)q,σ,ii<k
  • Thay thế được xử lý tương tự bằng cách chuyển đổi cho tất cả sao cho .δ(q,σ),i+1δ(q,i,τ)q,σ,τ,ii<k

3

Một ngôn ngữ là thông thường nếu bạn có thể viết một máy quét quyết định các chuỗi tùy ý cho dù chúng có thuộc ngôn ngữ sử dụng không quá một lượng bộ nhớ cố định hay không - tức là có thể thực hiện nhận dạng trong không gian O (1) .


O (1) không gian, ý bạn là gì? Trong mọi trường hợp, điều này được bao phủ bởi thực tế là DFA đủ; có thể đáng để lưu ý rõ ràng sự tương đương này về mặt lập trình.
Raphael

Vâng, nó chỉ là một quan điểm khác nhau.
Revierpost

3

Chuyển đổi biểu thức chính quy là một cách để chứng minh sự đóng cửa trong các hoạt động nhất định. Hai ví dụ đơn giản nhất là đóng cửa dưới sự đảo ngược và đóng cửa dưới sự đồng hình .

Với một biểu thức chính quy đại diện cho một ngôn ngữ , chúng ta có thể xây dựng một biểu thức chính quy cho , ngôn ngữ đảo ngược của tất cả các từ trong , theo cách đệ quy:rLLRL

  • ϵR=ϵ , , .σR=σR=
  • (r1+r2)R=(r1R+r2R) , , .(r)R=(rR)(r1r2)R=r2Rr1R

Tất cả các hành động xảy ra tại các quy tắc chính thức . Ví dụ, bạn có thể kiểm tra xem . Thiết lập cảm ứng cấu rằng ngôn ngữ của thực sự là . ( 0 * 1 * ) R = 1 * 0 * r R L R(r1r2)R=r2Rr1R(01)R=10rRLR

Một ví dụ đơn giản khác là đóng cửa dưới sự đồng hình. Đưa ra một phép đồng hình và một biểu thức chính quy cho một ngôn ngữ , chúng ta có thể có được một biểu thức chính quy cho bằng cách thay thế mọi trường hợp của trong bằng . r L h ( L ) σ r h ( σ )h:ΣΔrLh(L)σrh(σ)


0

Một cách khác là xây dựng ngôn ngữ bằng các thao tác mà theo đó bạn biết chúng bị đóng. Đây là một phần mở rộng để thể hiện một biểu thức chính quy, vì bạn có sẵn nhiều thao tác hơn (đảo ngược chuỗi, bổ sung, giao cắt, cắt ra một mảnh, chỉ giữ một phần, đồng cấu và đồng cấu nghịch đảo, ...)


2
Điều đó đã được đề cập trong câu trả lời của Ran.
Raphael
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.