هناك نوعان من قشور النمو عبارة عن بيانات تُستخدم لإثبات حدود فئات مهمة من اللغات الرسمية: العادية وخالية من السياق. من السهل فهم أهمية هذه الفئات للمبرمجين : يتم استخدام التعبيرات العادية (أحد أوصاف اللغات العادية) في كثير من الأحيان في العمل ، ولغات البرمجة التي يتم وصف تركيبها من خلال القواعد النحوية الخالية من السياق أكثر من ذلك.
تتشابه الليمونات إلى حد كبير مع بعضها البعض سواء في التركيبات أو في البراهين. بدا لي هذا القرب رائعًا جدًا لدرجة أنني قررت تكريس مقال كامل له.
الخطة هي: نحن نفهم ما هي اللغات العادية وما هي العلاقة بين التعبيرات العادية والأتمتة المحدودة ، نقوم بصياغة وإثبات lemma امتداد للغات العادية ، نستخدمها لإثبات عدم انتظام عدة لغات. ثم نقوم بخدعة مماثلة مع اللغات الخالية من السياق ، على طول الطريقة التي نكتشف بها كيفية ارتباطها باللغات العادية وكيفية التحايل على القيود المكتشفة باستخدام القواعد النحوية العامة. اذهب!

يوضح KDPV عملية النمو لقواعد اللغة KS
— ( , ) . , , . : . , .. , : .
(.. ), : . . , .
1.
: , , .
, :
- — , ;
- — , , , ;
- — , .
. — , :
- — ;
- — : , , ;
- — : , .
: , ,
: .
. , , . , PuTTY, - :
http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+
, url' , , , , url'. .
: ([0-9]
), ([s]?
), (a+
— , aa*
, .. ) . , , .
, ( ), |
(), *
() . , .
, :
, :
abcde
abcdf
abcdef
abcdeef
abcdeeef
abcdeeeef
.
2.
. — , . , (). .
. , , .
, , . , , . , — , .
. , , , , .

,
. , , — . , . , , — . , , .
, ,
, . , , , .

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

, .
3.
. , , , . ? , .
, , . , , : , — . , ? … , , ?
, ! , , .
. , , , , : ; ; ; .
اسمحوا ان — , , — .
: , , , ..., . , , , .
, . — , . — , — , , — , .
, ( !) , , , .
, — . , , , ..., . , . , , .
: , , ( .. ) , , .
. — . ,
, , , . , . , , , . . , !
, . .
4. -
— , .
: () () ; . — .
. : , . : . , , .
, , . , — . : .
, ( ), , , , ..., , : . .
, : , . , , .
, - (-), — . , - , - .
, - :
, , . , - , . ; .
, , «» :
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
(()())()
- :
rules = [
("S", "aSb"),
("S", ""),
]
target = "aaabbb"
print('\n'.join(Solve(rules, target)))
S
aSb
aaSbb
aaaSbbb
aaabbb
- , . , -, . , - : , , , .
, - .
5. -
. , - , , , - :
. , ? « » , , . , , . -,
- . - , , , , , , : ; ; ; .
, .
, . , . , :
, , : , — . . .

- acd
, . , — , . . — , .. . , , . , -. , .
, , . : , , .
, . , , , , .. , . .

:
, , .
. .. , , . , . .
. , -. , — . .
, , , .
, , .. , .
. , , , . , -!
6.
, - . , , .
:
, . :
:
, , . - !
! 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
: «» ; . .
( ) , . - .