2017-09-25 2 views
5

Donc, je lisais un livre, "Introduction à la théorie du langage formel" et il décrit une langue L(G) = {a^n ++ b^n | n > 0}.Langage équilibré, 2 symboles non-terminaux, compréhension de la liste

Il a les productions suivantes:

S -> ab | aSb 

Et produirait la langue suivante:

a, ab, aabb, aaabbb, ... 

Je me demandais comment je pouvais utiliser la compréhension de la liste de Haskell pour créer cette langue. Je sais que je peux faire la compréhension de la liste avec des cordes, mais je suis plutôt débutant et je ne savais pas comment je pourrais obtenir une liste infinie comme je le voudrais de ces cordes.

J'imagine quelque chose comme:

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

Cela ne fonctionne pas exactement comme vous le pensez. Que diriez-vous de '[répliquer n 'a' ++ répliquer n 'b' | n <- [1 ..]] '? Cela semble être la traduction la plus fidèle ... – Alec

+1

"a" ne fait pas partie de cette langue. –

Répondre

8

travail de la règle de la production,

S -> ab | aSb 

nous pourrions écrire

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

afin que

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

Votre tentative pourrait travailler avec une petite modification,

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

afin qu'il utilise l'extension Parallel List Comprehensions (:set -XParallelListComp en GHCi), à l'exception des énumérations. Mais c'est simple à corriger,

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

Suivi rapide, j'ai remarqué que lorsque j'ai écrit 's = [" ab "] ++ [" a "++ x ++" b "| x <- s] 'dans le ghci, il lance une erreur, mais si je le mets dans test.hs et que: l test, ça marche! Savez-vous quelle est la différence? – user6189164

+0

quelle était l'erreur? avez-vous essayé d'utiliser 'let', comme' let s = ... '(vous devez, dans le cas où vous avez une ancienne version installée). –

+0

ah, il a dit ': 2: 3: erreur d'analyse sur l'entrée '=''; mais, si tu as raison, si je l'utilise laisse ça marchera! – user6189164