Cách tạo ngữ pháp nhạy cảm ngữ cảnh cho www


7

Tôi đang cố gắng giải quyết bài kiểm tra sắp tới của mình và không biết làm thế nào để tạo ngữ pháp cho các ngôn ngữ nhạy cảm ngữ cảnh, ví dụ như làm thế nào để tôi tiến hành loại câu hỏi này.

Đưa ra một ngữ pháp nhạy cảm theo ngữ cảnh (không chỉ tăng chiều dài) cho {www:w{a,b}}.

Ý tưởng hoặc cách tiếp cận về cách đối phó với loại câu hỏi này được đánh giá cao.


4
Ý tưởng: mỗi khi bạn tạo "a", cũng tạo "a '" và "a' '" (tương tự với "b" s). Bây giờ, một '' có thể chuyển đổi với một chữ cái không được mồi sang bên phải của nó (nhưng không phải với một chữ cái được sơn lót hoặc nhân đôi.). Vào cuối, thoát khỏi các số nguyên tố.
Ran G.

1
Gợi ý: "www" không có ngữ cảnh nên bạn sẽ phải sử dụng các phương tiện ngữ pháp nhạy cảm với ngữ cảnh bổ sung cho bạn. Một chủ đề phổ biến là chuyển đổi không đầu cuối, di chuyển chúng xung quanh câu một cách hiệu quả. Do đó, thật dễ dàng để mô phỏng một đầu TM với ngữ pháp. Làm thế nào bạn sẽ quyết định "www" theo thuật toán?
Raphael

Câu trả lời:


5

Theo trực giác, bạn muốn tạo ba biểu tượng trung gian cùng một lúc và cho phép các biểu tượng tự sắp xếp. Để choSlà biểu tượng bắt đầu. Các quy tắc thế hệ là:

SSA1A2A3
SSB1B2B3
Các quy tắc sắp xếp như sau: Đối với các biểu tượng Xi,Yi{A1,A2,A3,B1,B2,B3} như vậy mà j<i thêm quy tắc:
XiYjYjXi
Cuối cùng, chúng ta phải biến các ký hiệu trung gian thành các ký hiệu đầu cuối. Biến biểu tượng bắt đầu thành biểu tượng khácS1 để kết thúc giai đoạn thế hệ.
SS1
Đẩy S1 thông qua các chuỗi chuyển đổi các ký hiệu thành các ký hiệu đầu cuối trên đường và tăng chỉ số khi được thực hiện bằng một từ w. Cho tất cải{1,2,3} thêm các quy tắc:
SiAiaSi|aSi+1
SiBibSi|bSi+1
Bảng con của Sđảm bảo rằng các ký hiệu được chuyển đổi theo đúng thứ tự vì chỉ số không thể giảm. Cuối cùng loại bỏS3.
S3ε

2
Mặc dù ngữ pháp của bạn đến gần, nhưng nó không có ngữ cảnh (mà User_1234 yêu cầu) do các quy tắc như "ABBA"cũng không đơn điệu do S3ϵ.
lukas.coenig

@ lukas.coenig Quy tắc epsilon thực sự không được phép (nên dễ sửa), nhưng nếu không thì ngữ pháp ở dạng Kuroda bình thường . Không phải mọi định nghĩa về CSG đều thừa nhận nó, nhưng nó nổi tiếng là một định nghĩa tương đương. Nếu OP (hoặc bất kỳ người đọc nào) phải sử dụng một định nghĩa khác, họ có thể sử dụng các cấu trúc lấy từ các bằng chứng tương đương của các định nghĩa và áp dụng chúng (một cách cơ học) cho giải pháp này.
Raphael

1
@Raphael. Cảm ơn bạn, nhưng tôi không nghĩ rằng nó dễ dàng. Xem xét từaaacho người cũ Để có được từ đó, bạn phải bắt đầu vớiSSA1A2A3. Độ dài của hình thức gửi này là 4, trong khi độ dài củaaaalà 3, vì vậy ở đâu đó trên đường bạn sẽ phải giảm độ dài của hình thức gửi đi. Tuy nhiên, điều này không được phép trong ngữ pháp nhạy cảm theo ngữ cảnh vì nó không giảm, nghĩa là, cho mọi sản phẩmxy, người ta phải có xy. Nếu tôi không sai, điều này có nghĩa là giải pháp của jnalanko đều sai. Tuy nhiên, tôi dường như không thể tìm ra giải pháp chính xác ...
Barbara

1
@Barbara Có vẻ như chúng ta hiểu lầm nhau. Tôi có nghĩa là để cấu trúc lại toàn bộ ngữ pháp; bạn sẽ bắt đầu với ; chỉ số trên sẽ thay thế "quyền của ". Nói một cách trừu tượng, tất cả các "chi phí" có kích thước không đổi có thể được gấp lại thành các biểu tượng đặc biệt. (Tôi nghĩ vậy.)A10A2A3iSi
Raphael

1
@Barbara Tại thời điểm này, tôi nghĩ bạn nên mở một câu hỏi mới. Nếu cách từ đây đến những gì bạn cần không đơn giản như tôi nghĩ, thì một cuộc thảo luận trong các bình luận không phải là cách đúng đắn để làm rõ.
Raphael

2

Câu trả lời cho ví dụ cụ thể của bạn là có, nhưng câu hỏi chung vẫn còn.

Trong rất nhiều năm, trong cả khoa học máy tính lý thuyết và ứng dụng, tôi không nhớ là phải viết một ngữ pháp CS như vậy.

Tuy nhiên, nếu tôi có thể đưa ra một lời khuyên, thì hoàn toàn không nên nhìn thấy như tạo ra một ngữ pháp CF, bạn phải tuân thủ các quy tắc để có được mọi thứ đúng chỗ và phối hợp chính xác như nó được tạo ra.

Các ngữ pháp CS có nhiều thuật toán hơn và bạn có thể bắt chước khá nhiều máy Turing (làm việc trong không gian hữu hạn, tỷ lệ với kích thước đầu vào, có nghĩa là Máy tính tự động tuyến tính - LBA) để di chuyển mọi thứ xung quanh khi cần. Vì vậy, nó là nhiều hơn một bài tập lập trình.

Bạn có thể tạo ra các thành phần đầu tiên để tạo một trong các từ trong ngôn ngữ, sau đó di chuyển chúng theo thuật toán. Bạn có thể sử dụng các ký hiệu đặc biệt (có thể trong các hương vị khác nhau tương ứng với trạng thái hữu hạn) để hoạt động như những cái đầu mà bạn di chuyển xung quanh với các quy tắc phù hợp, làm như để kiểm tra những gì sẽ được thực hiện. Và như thế.

Một cách đọc tốt có thể là xem xét bằng chứng về sự tương đương giữa các ngôn ngữ CSG và ngôn ngữ LBA, tức là các ngôn ngữ CS.

Hãy nhớ rằng gần như tất cả các thuật toán mà chúng tôi làm việc có thể được thực hiện bởi LBA, do đó tương ứng với ngôn ngữ có thể xác định CSG. Điều đó sẽ cho bạn một ý tưởng về sức mạnh thuật toán có sẵn.

Nhưng một chút trí tưởng tượng giúp giải pháp thanh lịch, như trong ví dụ bạn đã đưa ra.


Vì vậy, đối với ngôn ngữ được cung cấp trong câu hỏi của User_1234, làm thế nào người ta có thể thiết kế LBA cho nó? Tôi chỉ có kinh nghiệm thiết kế Máy Turing cho các ngôn ngữ có dải phân cách; Ví dụ: , điều này dường như giúp mọi việc dễ dàng hơn. {w#w#w:w{a,b}}
David Smith

@DavidSmith Đối với có một giải pháp cụ thể đơn giản được đưa ra trong nhận xét Ran G đầu tiên và với các chi tiết trong giải pháp trước đó. Điều này hơi khác so với TM thường được xây dựng dưới dạng chấp nhận (nhận dạng), trong khi ở đây bạn muốn có một hàm tạo. Một cách khác để làm điều đó là tạo một chuỗi , sau đó thêm 2 ký hiệu ở một bên, sau đó thay thế mỗi ký hiệu bằng một bản sao của chuỗi . Điều này phức tạp hơn, nhưng nó sẽ hoạt động với bất kỳ số lượng bản sao nào của , chỉ bằng cách tăng số lượng ký hiệu . wwww##ww#
babou

@DavidSmith Một LBA là một người chấp nhận, mà bạn "lập trình" khá giống như một TM. Trong trường hợp này, nếu bạn được cung cấp và muốn nhận ra nó, bạn có thể chỉ cần tính toán đầu tiên bằng cách nào đó (nhiều cách) đếm các ký hiệu để đặt hai ở đúng vị trí. Ngoài ra, bạn có thể dựa vào tính không xác định và đặt hai ở vị trí ngẫu nhiên trên chuỗi đầu vào. Một lựa chọn trong số họ sẽ là tốt, nếu chuỗi là trong ngôn ngữ. www##
babou

1

đây chỉ là một câu trả lời bổ sung có thể được coi là một giải pháp chung. CSL, ngôn ngữ nhạy cảm ngữ cảnh được mô hình hóa bằng LBA, automata giới hạn tuyến tính . LBA là một máy Turing có thể chấp nhận hoặc từ chối một băng công việc không lớn hơn một lần không đổi kích thước của băng đầu vào. vì vậy nếu bạn có thể tìm ra một chương trình máy tính có thể xử lý đầu vào trong không gian không đổi, thì đó là CSL. ý tưởng: một chương trình hoạt động cho vấn đề này sẽ làm một cái gì đó như liệt kê các hoán vị trong không gian không đổi.

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.