Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Пример работы)
Строка 85: Строка 85:
 
Дано слово <tex>w = $()(())$</tex>.
 
Дано слово <tex>w = $()(())$</tex>.
  
{| clear="both" |}
+
 
  
 
Инициализация массива <tex>d</tex>.
 
Инициализация массива <tex>d</tex>.
  
 
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
 
 
! colspan="7"|A
 
! colspan="7"|A
 
|-
 
|-
Строка 108: Строка 107:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 117: Строка 115:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 126: Строка 123:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 135: Строка 131:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 144: Строка 139:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 153: Строка 147:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|B
 
! colspan="7"|B
 
|-
 
|-
Строка 173: Строка 166:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 182: Строка 174:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 191: Строка 182:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 200: Строка 190:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 209: Строка 198:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 218: Строка 206:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|C
 
! colspan="7"|C
 
|-
 
|-
Строка 238: Строка 225:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 247: Строка 233:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 256: Строка 241:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 265: Строка 249:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 274: Строка 257:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 283: Строка 265:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|D
 
! colspan="7"|D
 
|-
 
|-
Строка 303: Строка 284:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 312: Строка 292:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 321: Строка 300:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 330: Строка 308:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 339: Строка 316:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 348: Строка 324:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; "  
+
{| border="1" style="width: 150px; height: 150px; "  
 
! colspan="7"|E
 
! colspan="7"|E
 
|-
 
|-
Строка 368: Строка 343:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 377: Строка 351:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 386: Строка 359:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 395: Строка 367:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 404: Строка 375:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 413: Строка 383:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 +
|}
  
|}
 
 
{| clear="both" |}
 
{| clear="both" |}
  
Строка 421: Строка 391:
 
{| clear="both" |}
 
{| clear="both" |}
  
Итерация m = <tex>1</tex>.
+
Итерация <tex>m = 1</tex>.
  
  
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|A
 
! colspan="7"|A
 
|-
 
|-
Строка 442: Строка 412:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 451: Строка 420:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 460: Строка 428:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 469: Строка 436:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 478: Строка 444:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 487: Строка 452:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|B
 
! colspan="7"|B
 
|-
 
|-
Строка 507: Строка 471:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 516: Строка 479:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 525: Строка 487:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 534: Строка 495:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 543: Строка 503:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 552: Строка 511:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|C
 
! colspan="7"|C
 
|-
 
|-
Строка 572: Строка 530:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 581: Строка 538:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 590: Строка 546:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 599: Строка 554:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 608: Строка 562:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 617: Строка 570:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|D
 
! colspan="7"|D
 
|-
 
|-
Строка 637: Строка 589:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 646: Строка 597:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 655: Строка 605:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 664: Строка 613:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 673: Строка 621:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 682: Строка 629:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; "  
+
{| border="1" style="width: 150px; height: 150px; "  
 
! colspan="7"|E
 
! colspan="7"|E
 
|-
 
|-
Строка 702: Строка 648:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 711: Строка 656:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 720: Строка 664:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 729: Строка 672:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 738: Строка 680:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 747: Строка 688:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
 
{| clear="both" |}
 
{| clear="both" |}
  
Итерация m = <tex>2</tex>.
+
Итерация <tex>m = 2</tex>.
  
  
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|A
 
! colspan="7"|A
 
|-
 
|-
Строка 772: Строка 712:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 781: Строка 720:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 790: Строка 728:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 799: Строка 736:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 808: Строка 744:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 817: Строка 752:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|B
 
! colspan="7"|B
 
|-
 
|-
Строка 837: Строка 771:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 846: Строка 779:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 855: Строка 787:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 864: Строка 795:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 873: Строка 803:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 882: Строка 811:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|C
 
! colspan="7"|C
 
|-
 
|-
Строка 902: Строка 830:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 911: Строка 838:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 920: Строка 846:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 929: Строка 854:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 938: Строка 862:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 947: Строка 870:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|D
 
! colspan="7"|D
 
|-
 
|-
Строка 967: Строка 889:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 976: Строка 897:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 985: Строка 905:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 994: Строка 913:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1003: Строка 921:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1012: Строка 929:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; "  
+
{| border="1" style="width: 150px; height: 150px; "  
 
! colspan="7"|E
 
! colspan="7"|E
 
|-
 
|-
Строка 1032: Строка 948:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1041: Строка 956:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1050: Строка 964:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1059: Строка 972:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1068: Строка 980:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1077: Строка 988:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
 
{| clear="both" |}
 
{| clear="both" |}
  
Итерация m = <tex>3</tex>.
+
Итерация <tex>m = 3</tex>.
  
  
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|A
 
! colspan="7"|A
 
|-
 
|-
Строка 1102: Строка 1012:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1111: Строка 1020:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1120: Строка 1028:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1129: Строка 1036:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1138: Строка 1044:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1147: Строка 1052:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|B
 
! colspan="7"|B
 
|-
 
|-
Строка 1167: Строка 1071:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1176: Строка 1079:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1185: Строка 1087:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1194: Строка 1095:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1203: Строка 1103:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1212: Строка 1111:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|C
 
! colspan="7"|C
 
|-
 
|-
Строка 1232: Строка 1130:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1241: Строка 1138:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1250: Строка 1146:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1259: Строка 1154:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1268: Строка 1162:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1277: Строка 1170:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|D
 
! colspan="7"|D
 
|-
 
|-
Строка 1297: Строка 1189:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1306: Строка 1197:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1315: Строка 1205:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1324: Строка 1213:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1333: Строка 1221:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1342: Строка 1229:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; "  
+
{| border="1" style="width: 150px; height: 150px; "  
 
! colspan="7"|E
 
! colspan="7"|E
 
|-
 
|-
Строка 1362: Строка 1248:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1371: Строка 1256:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1380: Строка 1264:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1389: Строка 1272:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1398: Строка 1280:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1407: Строка 1288:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
 
{| clear="both" |}
 
{| clear="both" |}
  
Итерация m = <tex>4</tex>.
+
Итерация <tex>m = 4</tex>.
  
  
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|A
 
! colspan="7"|A
 
|-
 
|-
Строка 1432: Строка 1312:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1441: Строка 1320:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1450: Строка 1328:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1459: Строка 1336:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1468: Строка 1344:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1477: Строка 1352:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|B
 
! colspan="7"|B
 
|-
 
|-
Строка 1497: Строка 1371:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1506: Строка 1379:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1515: Строка 1387:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1524: Строка 1395:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1533: Строка 1403:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1542: Строка 1411:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|C
 
! colspan="7"|C
 
|-
 
|-
Строка 1562: Строка 1430:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1571: Строка 1438:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1580: Строка 1446:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1589: Строка 1454:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1598: Строка 1462:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1607: Строка 1470:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|D
 
! colspan="7"|D
 
|-
 
|-
Строка 1627: Строка 1489:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1636: Строка 1497:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1645: Строка 1505:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1654: Строка 1513:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1663: Строка 1521:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1672: Строка 1529:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; "  
+
{| border="1" style="width: 150px; height: 150px; "  
 
! colspan="7"|E
 
! colspan="7"|E
 
|-
 
|-
Строка 1692: Строка 1548:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 1701: Строка 1556:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 1710: Строка 1564:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 1719: Строка 1572:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 1728: Строка 1580:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 1737: Строка 1588:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
|}
 
{| clear="both" |}
 
 
Итерация m = <tex>5</tex>.
 
 
 
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"
 
! colspan="7"|A
 
|-
 
!
 
! 1
 
! 2
 
! 3
 
! 4
 
! 5
 
! 6
 
|-
 
! 1
 
|
 
| align="center"| ●
 
|
 
|
 
|
 
| align="center"| ●
 
 
|-
 
! 2
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 3
 
|
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
 
|-
 
! 4
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
|
 
 
|-
 
! 5
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 6
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|}
 
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"
 
! colspan="7"|B
 
|-
 
!
 
! 1
 
! 2
 
! 3
 
! 4
 
! 5
 
! 6
 
|-
 
! 1
 
|
 
| align="center"| ●
 
|
 
|
 
|
 
| align="center"| ●
 
 
|-
 
! 2
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 3
 
|
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
 
|-
 
! 4
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
|
 
 
|-
 
! 5
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 6
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|}
 
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"
 
! colspan="7"|C
 
|-
 
!
 
! 1
 
! 2
 
! 3
 
! 4
 
! 5
 
! 6
 
|-
 
! 1
 
| align="center"| ●
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 2
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 3
 
|
 
|
 
| align="center"| ●
 
|
 
|
 
|
 
 
|-
 
! 4
 
|
 
|
 
|
 
| align="center"| ●
 
|
 
|
 
 
|-
 
! 5
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 6
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|}
 
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"
 
! colspan="7"|D
 
|-
 
!
 
! 1
 
! 2
 
! 3
 
! 4
 
! 5
 
! 6
 
|-
 
! 1
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 2
 
|
 
| align="center"| ●
 
|
 
|
 
|
 
|
 
 
|-
 
! 3
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 4
 
|
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
 
|-
 
! 5
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
|
 
 
|-
 
! 6
 
|
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
 
|}
 
{| border="1" class="wikitable" style="width: 150px; height: 150px; "
 
! colspan="7"|E
 
|-
 
!
 
! 1
 
! 2
 
! 3
 
! 4
 
! 5
 
! 6
 
|-
 
! 1
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 2
 
|
 
| align="center"| ●
 
|
 
|
 
|
 
|
 
 
|-
 
! 3
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 4
 
|
 
|
 
|
 
|
 
|
 
|
 
 
|-
 
! 5
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
|
 
 
|-
 
! 6
 
|
 
|
 
|
 
|
 
|
 
| align="center"| ●
 
 
 
|}
 
|}
 
{| clear="both" |}
 
{| clear="both" |}
  
Итерация m = <tex>6</tex>.
+
Итерация <tex>m = 5</tex>.
  
  
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|A
 
! colspan="7"|A
 
|-
 
|-
Строка 2092: Строка 1612:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 2101: Строка 1620:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 2110: Строка 1628:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 2119: Строка 1636:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 2128: Строка 1644:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 2137: Строка 1652:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|B
 
! colspan="7"|B
 
|-
 
|-
Строка 2157: Строка 1671:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 2166: Строка 1679:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 2175: Строка 1687:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 2184: Строка 1695:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 2193: Строка 1703:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 2202: Строка 1711:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|C
 
! colspan="7"|C
 
|-
 
|-
Строка 2222: Строка 1730:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 2231: Строка 1738:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 2240: Строка 1746:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 2249: Строка 1754:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 2258: Строка 1762:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 2267: Строка 1770:
 
|  
 
|  
 
|  
 
|  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; float: left;"  
+
{| border="1" style="width: 150px; height: 150px; float: left;"  
 
! colspan="7"|D
 
! colspan="7"|D
 
|-
 
|-
Строка 2287: Строка 1789:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 2296: Строка 1797:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 2305: Строка 1805:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 2314: Строка 1813:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 2323: Строка 1821:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 2332: Строка 1829:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
{| border="1" class="wikitable" style="width: 150px; height: 150px; "  
+
{| border="1" style="width: 150px; height: 150px; "  
 
! colspan="7"|E
 
! colspan="7"|E
 
|-
 
|-
Строка 2352: Строка 1848:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 2
 
! 2
Строка 2361: Строка 1856:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 3
 
! 3
Строка 2370: Строка 1864:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 4
 
! 4
Строка 2379: Строка 1872:
 
|  
 
|  
 
|  
 
|  
 
 
|-
 
|-
 
! 5
 
! 5
Строка 2388: Строка 1880:
 
| align="center"| ●  
 
| align="center"| ●  
 
|  
 
|  
 
 
|-
 
|-
 
! 6
 
! 6
Строка 2397: Строка 1888:
 
|  
 
|  
 
| align="center"| ●  
 
| align="center"| ●  
 
 
|}
 
|}
 
{| clear="both" |}
 
{| clear="both" |}

Версия 20:31, 5 ноября 2014

Задача:
Пусть дана контекстно-свободная грамматика [math]\Gamma[/math] в нормальной форме Хомского и слово [math]w \in \Sigma^{*}[/math]. Требуется выяснить, выводится ли это слово в данной грамматике.


Контекстно-свободная грамматика

Определение:
Контекстно-свободная грамматика (КС-грамматика, бесконтекстная грамматика) — способ описания формального языка, представляющий собой четверку

[math]\Gamma =\langle \Sigma, N, S \in N, P \subset N^{+}\times (\Sigma\cup N)^{*}\rangle[/math], где:

  • [math]\Sigma[/math]алфавит, элементы которого называют терминалами (англ. terminals)
  • [math]N[/math] — множество, элементы которого называют нетерминалами (англ. nonterminals)
  • [math]S[/math] — начальный символ грамматики (англ. start symbol)
  • [math]P[/math] — набор правил вывода (англ. production rules или productions) вида [math]A \rightarrow B_1 B_2 ... B_n[/math], где [math]A \in N[/math], [math]B_i \in \Sigma \cup N[/math], то есть у которых левые части — одиночные нетерминалы, а правые - последовательности терминалов и нетерминалов.


Пример

Терминалы [math]\Sigma = \{(, )\}[/math].

Нетерминалы [math]N = \{S\}[/math].

Правила вывода [math]P[/math]:

[math]\begin{array}{l l} S \rightarrow \varepsilon\\ S \rightarrow SS\\ S \rightarrow (S)\\ \end{array}[/math]

Данная грамматика задает язык правильных скобочных последовательностей. Например, последовательность [math](()(()))[/math] может быть выведена следующим образом:

[math] S \Rightarrow (S) \Rightarrow (SS) \Rightarrow (()(S)) \Rightarrow (()(())) [/math]

Нормальная форма Хомского

Нормальная форма Хомского - нормальная форма КС-грамматик, в которой все продукции имеют вид:

  • A → a, где A - нетерминал, а a - терминал
  • A → BC, где A, B, C - нетерминалы, причем B и C не являются начальными нетерминалами
  • S → ε, где S - начальный нетерминал и ε - пустая строка (данная продукция необходима, если в языке присуствует пустая строка)

Можно показать, что любую КС-грамматику можно привести к нормальной форме Хомского, поэтому алгоритм является в этом плане универсальным.

Алгоритм

Алгоритм Кока-Янгера-Касами (англ. Cocke-Younger-Kasami algorithm, англ. CYK-алгоритм) — универсальный алгоритм, позволяющий по слову узнать, выводимо ли оно в заданной КС-грамматике в нормальной форме Хомского. Будем решать задачу динамическим программированием. Дана строка [math]w[/math] размером [math]n[/math]. Заведем для неё трехмерный массив [math]d[/math] размером [math]|N| \times n \times n[/math], состоящий из логических значений, и [math]d[A][i][j] = true[/math] тогда и только тогда, когда из нетерминала [math]A[/math] правилами грамматики можно вывести подстроку [math]w[i \dots j][/math].

Рассмотрим все пары [math]\lbrace \langle j, i \rangle | j-i=m \rbrace[/math], где [math]m[/math] — константа и [math]m \lt n[/math].

  • [math]i = j[/math]. Инициализируем массив для всех нетерминалов, из которых выводится какой-либо символ строки [math]w[/math]. В таком случае [math]d[A][i][i] = true[/math], если в грамматике [math]\Gamma[/math] присутствует правило [math]A \rightarrow w[i][/math]. Иначе [math]d[A][i][i] = false[/math].
  • [math]i \ne j[/math]. Значения для всех нетерминалов и пар [math]\lbrace \langle j', i' \rangle | j' - i' \lt m \rbrace[/math] уже вычислены, поэтому [math]d[A][i][j] = \bigvee\limits_{A \rightarrow BC}\bigvee\limits_{k = i}^{j-1} d[B][i][k] \wedge d[C][k+1][j][/math]. То есть, подстроку [math]w[i \dots j][/math] можно вывести из нетерминала [math]A[/math], если существует продукция вида [math]A \rightarrow BC[/math] и такое [math]k[/math], что подстрока [math]w[i \dots k][/math] выводима из [math]B[/math], а подстрока [math]w[k + 1 \dots j][/math] выводится из [math]C[/math].

CYK rule 2.jpg

После окончания работы значение [math]d[S][1][n][/math] содержит ответ на вопрос, выводима ли данная строка в данной грамматике, где [math]S[/math] — начальный символ грамматики.

Модификации

Количество способов вывести слово

Если массив будет хранить целые числа, а формулу заменить на [math]d[A][i][j] = \sum\limits_{A \rightarrow BC}\sum\limits_{k = i}^{j-1} d[B][i][k] \cdot d[C][k + 1][j][/math], то [math]d[A][i][j][/math] — количество способов получить подстроку [math]w[i \dots j][/math] из нетерминала [math]A[/math].

Минимальная стоимость вывода слова

Пусть [math]H(A \rightarrow BC)[/math] — стоимость вывода по правилу [math]A \rightarrow BC[/math]. Тогда, если использовать формулу [math]d[A][i][j] = \min\limits_{A \rightarrow BC} \min\limits_{k = i}^{j-1} ( d[B][i][k] + d[C][k + 1][j] + H(A \rightarrow BC) )[/math], то [math]d[A][i][j][/math] — минимальная стоимость вывода подстроки [math]w[i \dots j][/math] из нетерминала [math]A[/math].

Таким образом, задача о выводе в КС-грамматике в нормальной форме Хомского является частным случаем задачи динамического программирования на подотрезке.

Асимптотика

Обработка правил вида [math]A \rightarrow w[i][/math] выполняется за [math]O(n \cdot |\Gamma|)[/math].

Проход по всем подстрокам выполняется за [math]O(n^2)[/math]. В обработке одной подстроки присутствует цикл по всем правилам вывода и по всем разбиениям на две подстроки, следовательно обработка работает за [math]O(n \cdot |\Gamma|)[/math]. В итоге получаем конечную сложность [math]O(n^3 \cdot |\Gamma|)[/math].

Следовательно, общее время работы алгоритма — [math]O(n^3 \cdot |\Gamma|)[/math]. Кроме того, алгоритму требуется память на массив [math]d[/math] объемом [math]O(n^2 \cdot |N|)[/math], где [math]|N|[/math] — количество нетерминалов грамматики.

Пример работы

Дана грамматика правильных скобочных последовательностей [math]\Gamma[/math] в нормальной форме Хомского.

[math]\begin{array}{l l} A \rightarrow \varepsilon|BB|CD\\ B \rightarrow BB|CD\\ C \rightarrow (\\ D \rightarrow BE|)\\ E \rightarrow )\\ \end{array}[/math]

Дано слово [math]w = $()(())$[/math].


Инициализация массива [math]d[/math].

A
1 2 3 4 5 6
1
2
3
4
5
6
B
1 2 3 4 5 6
1
2
3
4
5
6
C
1 2 3 4 5 6
1
2
3
4
5
6
D
1 2 3 4 5 6
1
2
3
4
5
6
E
1 2 3 4 5 6
1
2
3
4
5
6
Заполнение массива [math]d[/math].
Итерация [math]m = 1[/math].
A
1 2 3 4 5 6
1
2
3
4
5
6
B
1 2 3 4 5 6
1
2
3
4
5
6
C
1 2 3 4 5 6
1
2
3
4
5
6
D
1 2 3 4 5 6
1
2
3
4
5
6
E
1 2 3 4 5 6
1
2
3
4
5
6
Итерация [math]m = 2[/math].
A
1 2 3 4 5 6
1
2
3
4
5
6
B
1 2 3 4 5 6
1
2
3
4
5
6
C
1 2 3 4 5 6
1
2
3
4
5
6
D
1 2 3 4 5 6
1
2
3
4
5
6
E
1 2 3 4 5 6
1
2
3
4
5
6
Итерация [math]m = 3[/math].
A
1 2 3 4 5 6
1
2
3
4
5
6
B
1 2 3 4 5 6
1
2
3
4
5
6
C
1 2 3 4 5 6
1
2
3
4
5
6
D
1 2 3 4 5 6
1
2
3
4
5
6
E
1 2 3 4 5 6
1
2
3
4
5
6
Итерация [math]m = 4[/math].
A
1 2 3 4 5 6
1
2
3
4
5
6
B
1 2 3 4 5 6
1
2
3
4
5
6
C
1 2 3 4 5 6
1
2
3
4
5
6
D
1 2 3 4 5 6
1
2
3
4
5
6
E
1 2 3 4 5 6
1
2
3
4
5
6
Итерация [math]m = 5[/math].
A
1 2 3 4 5 6
1
2
3
4
5
6
B
1 2 3 4 5 6
1
2
3
4
5
6
C
1 2 3 4 5 6
1
2
3
4
5
6
D
1 2 3 4 5 6
1
2
3
4
5
6
E
1 2 3 4 5 6
1
2
3
4
5
6

См. также

Источники информации