Tại sao không đơn giản để đếm số lượng từ trong một ngôn ngữ thông thường?


8

Cho DFA, A, hãy để L (A) biểu thị số lượng từ A chấp nhận. Tôi nghĩ thật dễ dàng để tính L (A): Dịch mã hóa của A thành một biểu thức thông thường. Nếu ngôi sao Kleene xuất hiện ở bất cứ đâu trong biểu thức - ngôn ngữ là vô hạn. Khác: Đi qua và đếm tất cả các kết hợp từ có thể thực hiện bằng cách sử dụng biểu thức (về cơ bản nếu có toán tử + trên biểu thức, nhân số lượng từ hợp pháp với số lượng chuỗi được kết nối bởi + ..)

Điều này có sai không? Cảm ơn trước


3
ε không phải là ngôn ngữ vô hạn.
David Richerby

Câu trả lời:


12

Đúng, điều này là sai, vì sự mơ hồ.

Hãy xem xét các ngôn ngữ sau: (a+aa)+a(a+ϵ) .

Với phương pháp của bạn, chúng tôi thấy 4 từ, . Nhưng chúng tôi có bản sao! Có nhiều cách để tạo cùng một từ trong biểu thức chính quy định.a,aa,aa,a

Phương pháp tốt hơn là sử dụng lập trình động trên một DFA tối thiểu cho ngôn ngữ của bạn, không có trạng thái "chết". Nếu DFA tối thiểu là tuần hoàn, ngôn ngữ là vô hạn, vì vậy chúng ta có thể giả sử không có chu kỳ. Sử dụng DFA là chìa khóa, bởi vì tính xác định có nghĩa là có chính xác một đường dẫn qua DFA cho mỗi từ.

Những gì bạn làm là xây dựng một sự lặp lại cho số lượng từ kết thúc ở một trạng thái nhất định:

  • 1 từ đầu ở trạng thái bắt đầu: ϵ
  • Đối với mỗi trạng thái , số lượng từ kết thúc có tổng số lượng từ kết thúc tại mỗi trạng thái với sự chuyển đổi thành q .qq

Tổng số từ sau đó là tổng số lượng từ kết thúc ở mỗi trạng thái cuối cùng.


2
Cần lưu ý rằng những sự lặp lại này luôn có thể được giải quyết bằng đại số máy tính, ví dụ cho các hàm tạo. Vì vậy, yea, ngôn ngữ thông thường thực sự dễ dàng để đếm.
Raphael

9

Bổ sung câu trả lời của jmite, không quá khó để tính toán số lượng từ trong một ngôn ngữ thông thường, sử dụng phương pháp "ma trận chuyển". Điều này giống như lập trình động của jmite, nhưng kỹ thuật này có các ứng dụng khác như liệt kê tiệm cận.

Cho một DFA, xây dựng một ma trận M (nơi Q là tập hợp của các quốc gia), trong đó M ( i , j ) là số chữ cái nguyên nhân các DFA để di chuyển từ trạng thái j nêu i . Đặt 1 q 01 F lần lượt là các chỉ số cho trạng thái ban đầu và cho các trạng thái chấp nhận. Cuối cùng, hãy n = | Q | .Q×QMQM(i,j)ji1q01Fn=|Q|

Số lượng từ có độ dài c m : = 1 F M m 1 q 0 . Tính c m cho 0 m < 2 n . Nếu c n + + c 2 n - 1 > 0 thì ngôn ngữ được chấp nhận bởi DFA là vô hạn. Nếu không, các số từ trong ngôn ngữ là c 0 + + c n - 1 .mcm:=1FMm1q0cm0m<2ncn++c2n1>0c0++cn1

(Khi khả năng tính toán của , phải chú ý đến độ lớn của các mục, tính theo cấp số nhân của m . Vì kích thước của chúng chỉ là đa thức, thuật toán kết quả chạy trong thời gian đa thức.)Mm


2
Tôi thích cách tiếp cận này. Tôi cũng thấy rằng việc tính toán các giá trị riêng của thực sự tương ứng với gốc của mẫu số trong cách tiếp cận hàm tạo và có lẽ không có gì đáng ngạc nhiên, các giá trị riêng này là bất biến đối với việc giảm thiểu DFA. Tuy nhiên, tôi hoàn toàn không biết làm thế nào để giải thích chính xác điều này. M
Lee

1
Đây không phải là quá bất ngờ, cho rằng các chức năng tạo là , mà đơn giản hoá để P ( z ) = 1 F ( tôi - z M ) - 1 1 q 0 . Bạn có thể nhận được một kết quả thậm chí rõ ràng hơn bằng cách làm lại phép tính này bằng cách sử dụng mẫu M của Jordan , có tính năng giá trị riêng. P(z)=n=01FMn1q0znP(z)=1F(IzM)11q0M
Yuval Filmus

7

Trên thực tế, bạn vẫn có thể rút ra các công thức đếm cho các biểu thức chính quy rõ ràng với các ngôi sao Kleene bên trong.

Căn cứ vào định nghĩa quy nạp của một biểu thức chính quy như:

eRe:=xΣe0 e1e0+e1e

Hãy xem xét bản dịch sau đây có biểu thức chính quy và chuyển nó thành hàm hữu tỷ có giá trị phức tạp:[[]]:ReC(z)

[[xΣ]]=z[[e0 e1]]=[[e0]]×[[e1]][[e0+e1]]=[[e0]]+[[e1]][[e]]=11[[e]]

Chúng ta có thể chỉ ra rằng bản dịch này trả về một biểu thức hợp lý bằng cách thực hiện cảm ứng cấu trúc trên và lưu ý rằng tất cả các hoạt động được sử dụng ở phía bên phải sẽ duy trì tính hợp lý.e

Giả sử rằng biểu thức chính quy mà chúng ta đặt vào không rõ ràng, thì chúng ta sẽ thấy rằng hàm hữu tỷ được biểu thị bởi [e thực sự là chức năng tạo ra cho gia đình của từ được chấp nhận bởi các ngôn ngữ cơ bản e , được xếp hạng theo độ dài của họ.[[e]]C(z)e

Ví dụ, hãy xem xét ngôn ngữ , trong đó xác định ngôn ngữ của chạy của một giới hạn bởi b . Bây giờ, biểu thức chính quy này không rõ ràng, vì vậy chúng tôi có thể chạy thủ thuật dịch thuật của mình:(ab)ab

[[(ab)]]=11[[ab]]=11([[a]]×[[b]])=11(11[[a]]×z)=11z1z=12+124z

Hóa ra, với hàm tạo ở trên, trích xuất hệ số của nó sẽ là

[zn][[(ab)]]=2n1+δ(n)2
δ(n)={1if n=00otherwise

[[]]

r(z)+p(z)q(z)
r,p,q
r(z)+C0zq0++Cnzqn
qkq(z)
[zn]Czq=C×qn

n am b

Thật không may, mức độ mà phương pháp này sẽ hữu ích kết thúc khi bạn có một biểu thức mơ hồ.

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.