2017-09-25 12 views
5

Vì vậy, tôi đã đọc một cuốn sách, "Giới thiệu về lý thuyết ngôn ngữ chính thức" và nó mô tả một ngôn ngữ L(G) = {a^n ++ b^n | n > 0}.Ngôn ngữ cân bằng, 2 Ký hiệu không phải là thiết bị đầu cuối, Danh sách hiểu

Nó có tác phẩm sau đây:

S -> ab | aSb 

Và như vậy sẽ tạo ra các ngôn ngữ sau:

a, ab, aabb, aaabbb, ... 

tôi đã tự hỏi làm thế nào tôi có thể sử dụng danh sách hiểu Haskell để tạo ra ngôn ngữ này. Tôi biết tôi có thể làm danh sách hiểu với dây, nhưng tôi khá nhiều người mới bắt đầu và không chắc chắn làm thế nào tôi có thể nhận được một danh sách vô hạn như tôi muốn của các dây.

Tôi đang tưởng tượng cái gì đó như:

[ x ++ y | x <- ["a","aa",..] y <- ["b","bb",..]] 
+1

Điều này không làm chính xác những gì bạn nghĩ. Làm thế nào về '[replicate n 'a' ++ tái tạo n 'b' | n <- [1 ..]] '? Điều đó có vẻ giống như bản dịch trung thành nhất ... – Alec

+1

"a" không phải là một phần của ngôn ngữ đó. –

Trả lời

8

Làm việc từ sự cai trị sản xuất,

S -> ab | aSb 

chúng ta có thể viết

s = ["ab"] ++ [ "a" ++ x ++ "b" | x <- s ] 

để

~> take 5 s 
["ab","aabb","aaabbb","aaaabbbb","aaaaabbbbb"] 
it :: [[Char]] 

nỗ lực của bạn có thể làm việc với một chỉnh sửa nhỏ,

[ x ++ y | x <- ["a","aa",..] | y <- ["b","bb",..]] 

để nó sử dụng Parallel List Comprehensions mở rộng (:set -XParallelListComp trong GHCi), trừ các kiểu liệt kê. Nhưng điều này rất đơn giản để khắc phục,

[ x ++ y | x <- [replicate n 'a' | n <- [1..]] 
     | y <- [replicate n 'b' | n <- [1..]]] 
+0

Quick followup, tôi nhận thấy rằng khi tôi viết 's = [" ab "] ++ [" a "++ x ++" b "| x <- s] 'trong ghci, nó ném một lỗi, nhưng nếu tôi đặt nó trong test.hs và sau đó: l test, nó hoạt động! Bạn có biết sự khác biệt là gì không? – user6189164

+0

lỗi là gì? bạn đã thử sử dụng 'let', như' let s = ... '(bạn phải, trong trường hợp bạn đã cài đặt phiên bản cũ hơn). –

+0

ah, nó nói ': 2: 3: lỗi phân tích cú pháp trên đầu vào ‘=’ '; nhưng, nếu bạn nói đúng, nếu tôi sử dụng hãy để nó hoạt động! – user6189164

Các vấn đề liên quan