Lemmes d'étalement pour les langues régulières et sans contexte

Deux lemmes de croissance sont des énoncés qui sont utilisés pour prouver le caractère limité de classes importantes de langages formels: régulier et sans contexte. L'importance de ces classes pour les programmeurs est facile à comprendre: les expressions régulières (l'une des descriptions des langages réguliers) sont utilisées assez souvent dans le travail, et les langages de programmation dont la syntaxe est décrite par des grammaires hors contexte le sont encore plus.


Les lemmes se ressemblent beaucoup tant dans les formulations que dans les épreuves. Cette proximité m'a paru si merveilleuse que j'ai décidé d'y consacrer un article entier.


Le plan est le suivant: nous comprenons ce que sont les langues régulières et quelle est la relation entre les expressions régulières et les automates finis, nous formulons et prouvons un lemme d'extension pour les langues régulières, et nous l'utilisons pour prouver l'irrégularité de plusieurs langues. Ensuite, nous faisons une astuce similaire avec les langages sans contexte, tout en découvrant comment ils se rapportent aux langages ordinaires et comment contourner les restrictions découvertes à l'aide de grammaires générales. Aller!




KDPV illustre le processus de croissance des grammaires KS


— ( , ) . , , . : Σ. , .. , : ε.


(.. ), : . . , .


1.


: , , .


, :


  • — , ;
  • {ε}— , , , ;
  • {a},aΣ— , .

. AB— , :


  • AB— ;
  • AB={αβ|αA,βB}— : , A, B;
  • A={α1α2...αk|kN0,αiA}— : kA, k.

: N0=N{0}, ,


: AB=AB.


. , , . , PuTTY, - :


http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+

, url' , , , , url'. .


: ([0-9]), ([s]?), (a+ — , aa*, .. ) . , , .


, ( ), | (), * () . , .


, :


abc(def|de)


, :


abcde
abcdf
abcdef
abcdeef
abcdeeef
abcdeeeef

.


2.


. — , . , (). .


. , , .


, , . , , . , — , .


. , , , , .



, bab|aabca


. ai, aj, ak— . aiak, Lik. , aiajLij, ajakLjk. , aj, Ljj.


aj, aiak,


Lik=LikLijLjjLjk


, aj. , , , .




, , . , - , ε. , . , .


, . : ; , , , , ; , , , , .


, . , , :



, .


3.


L={anbn|nN0}. ε, ab, aabb, aaabbb. ? , .


, , . , , : , ab. , ? … , , ?


, ! , , .


. LnN, wL,|w|nx, y, z, : w=xyz; yε; |xy|n; k0:xykzL.

Laisser être L— , n, wLn.


w: a0, a1, a2, ..., am. , , m+1, mn.


n, . ai— , j. xiw, yw, aiaj, zw, ajan.


aiaj, ( !) , , , kN0:xykzL.


ai, aj— . , a0, a1, ..., aj1. , n. , jn|xy|n, .


: , , ( .. ) , , .


L={anbn|nN0}. n— . anbnanbn=xyz,
|xy|n, , , xya. ya, . xykzk>1a, b, , L. L. , L!


(n)n, . .


4. -


— , .


: () T() N; Σ=NT. SN— .


P. φΣ: (s1,s2)φ, s1s2. : . , (s1,s2)φ, s1s2.


βα, α=xs1z, β=xs2z(s1,s2)φ. , — . : αβ.


, βα( ), s0=α, s1, s2, ..., sk+1=β, : sisi+1. αβ.


s, : sT, Ss. , , .


, - (-), — . , - , - .


, - :


S(S)S
Sε


, , . , - , . ; .


, , «» :


def BuildPath(queue, parents, parent):
    path = []
    while parents[parent] != parent:
        path += [queue[parent]]
        parent = parents[parent]
    return path[::-1]

def Solve(rules, target):
    queue = ['S']
    parents = [0]

    idx = 0
    while idx < len(queue):
        current = queue[idx]

        for rule in rules:
            entryIdx = current.find(rule[0])
            while entryIdx != -1:
                new = current[:entryIdx] + rule[1] + current[entryIdx + len(rule[0]):]

                if new == target:
                    path = [queue[0]] + BuildPath(queue, parents, idx) + [new]
                    return path

                queue.append(new)
                parents.append(idx)

                entryIdx = current.find(rule[0], entryIdx + 1)

        idx += 1

, , , , , ; ! :


rules = [
    ("S", "(S)S"),
    ("S", ""),
]
target = "(()())()"
print('\n'.join(Solve(rules, target)))

S
(S)S
((S)S)S
((S)(S)S)S
((S)(S)S)(S)S
(()(S)S)(S)S
(()()S)(S)S
(()())(S)S
(()())()S
(()())()

- L={anbn|nN0}:


rules = [
    ("S", "aSb"),
    ("S", ""),
]
target = "aaabbb"
print('\n'.join(Solve(rules, target)))

S
aSb
aaSbb
aaaSbbb
aaabbb

- , . , -, . , - : , , , .


, - .


5. -


L={anbncn|nN0}. , - anbn, , , - :


Sε
SAB
AaAb
BBc
Aε
Bε


anbncm. , mn? « » , , . , , . -,


- . - LnN, wL,|w|nu, v, x, y, z, : w=uvxyz; vyε; |vxy|n; k0:uvkxykzL.

, .


, . , . , :
Sε
ABC
Aa


, , : , — . . .



- acd


, . n=2|N|+1, |N|— , wL,|w|n. . — , .. . , m, |N|+1. , -. , .


B, , B. : , , .


B, SuBz. B, B, BvBy, vyε, .. , . Bx.



:


  • SuBz
  • BvBy
  • Bx

, kN0Suvkxykz, vyε.


vxy. .. B, , |N|. , 2|N|+1=n. |vxy|n.


L={anbncn|nN0}. , -. , n— . anbncn.


, anbncn=uvxyz, |vxy|nvyε, uvkxykz.


vxya, c, .. wacnb, vxyn.


uvkxykzk. , k>1m, uvkxykz=ambmcm, L. , -!




6.


, - . , L={anbncn|nN0}, .


:


Sε
SaHbCE


E, bc. :


Eε


H:


HaHbC
Hε


, , Cc. - !


CbbC
CEEc


! 5 , :


rules = [
    ("S", "aHbCE"),
    ("H", ""),
    ("H", "aHbC"),
    ("Cb", "bC"),
    ("CE", "Ec"),
    ("E", ""),
]
target = "aaabbbccc"
print('\n'.join(Solve(rules, target)))

S
aHbCE
aaHbCbCE
aaaHbCbCbCE
aaaHbbCCbCE
aaaHbbCbCCE
aaaHbbbCCCE
aaaHbbbCCEc
aaaHbbbCEcc
aaaHbbbEccc
aaaHbbbccc
aaabbbccc

: «» ; C. .


( ) , . - .


All Articles