logo

Нормальна форма Хомського (CNF)

CNF означає нормальну форму Хомського. CFG (контекстно-вільна граматика) знаходиться в CNF (нормальній формі Хомського), якщо всі правила виробництва задовольняють одну з таких умов:

  • Почніть генерувати символ ε. Наприклад, A → ε.
  • Нетермінал, що генерує два нетермінали. Наприклад, S → AB.
  • Нетермінал, що генерує термінал. Наприклад, S → a.

Наприклад:

 G1 = {S → AB, S → c, A → a, B → b} G2 = {S → aA, A → a, B → c} 

Правила створення граматики G1 задовольняють правила, визначені для CNF, тому граматика G1 знаходиться в CNF. Однак правило виробництва Grammar G2 не задовольняє правила, визначені для CNF, оскільки S → aZ містить термінальний, за яким іде нетермінальний. Отже, граматика G2 не в CNF.

parseint java

Кроки для перетворення CFG в CNF

Крок 1: Видаліть символ старту з правого боку. Якщо символ початку T знаходиться праворуч від будь-якої продукції, створіть нову продукцію як:

 S1 → S 

Де S1 – новий символ початку.

крок 2: У граматиці видаліть null, unit і марні постановки. Ви можете звернутися до спрощення CFG.

крок 3: Видаліть термінали з RHS виробництва, якщо вони існують разом з іншими нетерміналами або терміналами. Наприклад, виробництво S → aA можна розкласти як:

матриці в програмуванні на C
 S → RA R → a 

крок 4: Усуньте RHS з більш ніж двома нетермінальними. Наприклад, S → ASB можна розкласти як:

 S → RS R → AS 

приклад:

Перетворіть даний CFG у CNF. Розглянемо дану граматику G1:

 S → a | aA | B A → aBB | ε B → Aa | b 

рішення:

Крок 1: Ми створимо нову продукцію S1 → S, оскільки символ початку S з’являється на правій лінії. Граматика буде:

 S1 → S S → a | aA | B A → aBB | ε B → Aa | b 

крок 2: Оскільки граматика G1 містить A → ε нульове виробництво, його видалення з граматики дає:

10 мл в унціях
 S1 → S S → a | aA | B A → aBB B → Aa | b | a 

Тепер, оскільки граматика G1 містить Unit production S → B, її видалення дає:

 S1 → S S → a | aA | Aa | b A → aBB B → Aa | b | a 

Також видаліть одиницю виробництва S1 → S, її видалення з граматики дає:

 S0 → a | aA | Aa | b S → a | aA | Aa | b A → aBB B → Aa | b | a 

крок 3: У виробничому правилі S0 → aA | Aa, S → aA | Aa, A → aBB і B → Aa, термінал a існує на RHS з нетерміналами. Тому ми замінимо термінал a на X:

що таке hashset java
 S0 → a | XA | AX | b S → a | XA | AX | b A → XBB B → AX | b | a X → a 

крок 4: У правилі створення A → XBB RHS має більше двох символів, що виключає його з граматичного виведення:

 S0 → a | XA | AX | b S → a | XA | AX | b A → RB B → AX | b | a X → a R → XB 

Отже, для даної граматики це необхідна КНФ.