У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа ’1 а разработать программное средство распознающее тип введенной пользователем грам.html

Работа добавлена на сайт samzan.net: 2016-01-17

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 3.2.2025

Лабораторная работа №1

а) разработать программное средство, распознающее тип введенной пользователем грамматики по классификации Хомского;

б) вывести десять слов языка, порождаемого грамматикой;

в) описать язык, порождаемый грамматикой.

Правила грамматики:

  1.  S → ab, S → aKSb, K → bSb, KS → b, K → ε.

Решение

Программа, распознающая тип введённой пользователем грамматики, была написана на языке Python. Программный код, реализующий алгоритм определения типа грамматики, приведён ниже.

from math import *

lev=['S','S','K','KS','K']

prav=['ab','aKSb','bSb','b','e']

for i in range(len(lev)):

   if len(lev[i])<=len(prav[i]):

       kz=kz+1

   if len(lev[i])==1 and ord(lev[i])<97 and ord(lev[i])>64:

       ks=ks+1   

   s=0        

   for j in prav[i]:

         if ord(j)>64 and ord(j)<97 or ord(j)==101:

             s=s+1         

   if s==1:

       l=l+1

   k=prav[i]

   if ord(k[-1])<97 and ord(k[-1])>64 or ord(j)==101 :

       pl=pl+1

if kz==(len(lev)) and ks==(len(lev)) and l==(len(lev)) and pl==(len(lev)):

   print('праволинейная грамматика')

if kz==(len(lev)) and ks==(len(lev)) and l==(len(lev)) and pl<(len(lev)):

   print('линейная грамматика')

if kz==(len(lev)) and ks==(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('контекстно-свободная грамматика')

if kz==(len(lev)) and ks<(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('контектно-зависимая грамматика')

if kz<(len(lev)) and ks<(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('грамматика общего вида')  Результат работы программы:

Грамматика общего вида. Вывод нескольких её слов:

                                                                                       

                                                                                                                                 

Язык с заданными правилами грамматики не описывается однозначным образом

Лабораторная работа №2

Задание:

Разработать программное средство, реализующее следующие функции:

  1.  ввод произвольной формальной грамматики с клавиатуры и проверка ее на принадлежность к классу праволинейных грамматик;
  2.  построение по заданной праволинейной грамматике конечного автомата;
  3.  определение, является ли полученный конечный автомат детерминированным;
  4.  в случае недетеменированности, преобразование конечного автомата к детерминированному виду.

Правила грамматики:

SbS, JbW, SaJ, JaJ, WaS, WbJ, WaW, Wε

Решение

Для решения задач, поставленных в работе, была написана программа на языке Python.

from math import *

lev=['S','J','S','J','W','W','W','W']

prav=['bS','bW','aJ','aJ','aS','bJ','aW','e']

Q=[]

E=[]

Y=[]

I=[]

F=[]

P=[]

N=[]

B=[]

pl=0

kz=0

ks=0

l=0

for i in range(len(lev)):

   if len(lev[i])<=len(prav[i]):

       kz=kz+1

   if len(lev[i])==1 and ord(lev[i])<97 and ord(lev[i])>64:

       ks=ks+1   

   s=0        

   for j in prav[i]:

         if ord(j)>64 and ord(j)<97 or ord(j)==101:

             s=s+1         

   if s==1:

       l=l+1

   k=prav[i]

   if ord(k[-1])<97 and ord(k[-1])>64 or ord(j)==101 :

       pl=pl+1

if kz==(len(lev)) and ks==(len(lev)) and l==(len(lev)) and pl==(len(lev)):

   print('праволинейная грамматика')

if kz==(len(lev)) and ks==(len(lev)) and l==(len(lev)) and pl<(len(lev)):

   print('линейная грамматика')

if kz==(len(lev)) and ks==(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('контекстно-свободная грамматика')

if kz==(len(lev)) and ks<(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('контектно-зависимая грамматика')

if kz<(len(lev)) and ks<(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('грамматика общего вида')    

for i in range(len(lev)):

   for j in lev:

       s=0

       for w in range(len(Q)):            

           if j!=Q[w]:

               s=s+1

       if s==len(Q):

           Q.append(j)

for i in range(len(lev)):

   for j in prav[i]:

       s=0

       if ord(j)>96 and ord(j)<124 and ord(j)!=101:

           for w in range(len(E)):

               if j!=E[w]:

                   s=s+1

           if s==len(E):

               E.append(j)

for i in range(len(lev)):

   for j in prav[i]:

       s=0

       if ord(j)==101:

           for w in range(len(F)):

               if j!=F[w]:

                   s=s+1

           if s==len(F):

               F.append(lev[i])

I.append(lev[0])

for i in range(len(lev)-len(F)):

   R=lev[i]+prav[i]

   Y.append(R)

print(Q)

print(E)

print(F)

print(I)

print(Y)

p=0

for i in range(len(Q)):

   P=[]

   R=Q[i]    

   s=0

   z=0

   U=E

   for j in range(len(Y)):               

       for k in range(len(Y[j])):

           if k==1 and Y[j][0]==R:

               s=s+1

           if k==2 and Y[j][0]==R:

               P.append(Y[j][1])

   for t in range(len(U)):

       u=U[t]

       P.remove(u)

   if len(P)!=0:

       print('автомат недетерминированный')

   else:

       p=p+1

if p==len(Q):

   print('автомат полный детерминированный')

Для заданной в работе грамматики программа выдает результат

>>> праволинейная грамматика

['S', 'J', 'W']

['b', 'a']

['W']

['S']

['SbS', 'JbW', 'SaJ', 'JaJ', 'WaS', 'WbJ', 'WaW']

автомат недетерминированный

Получили, что автомат недетерминирован. Преобразуем его к детерминированному виду. Представим автомат в виде схемы.

С её помощью составим табл. В её первой строке приведены все подмножества множества состояний, а во второй и третьей – состояния достижимые из данных подмножеств по переходам a и b, соответственно.

S

J

W

SJ

SW

JW

SJW

a

J

J

WS

J

SJW

WSJ

WSJ

b

S

W

J

SW

SJ

JW

WSJ

      

.

Лабораторная работа №3

 

Минимизация полных детерминированных

конечных автоматов

Задание:

Разработать программное средство, реализующее следующие функции:

  1.  определение, является ли введенный пользователем конечный автомат полным детерминированным;
  2.  нахождение минимального полного детерминированного конечного автомата;
  3.  определение языка, распознаваемого полученным конечным автоматом.

. 

Решение

Определение принадлежности заданного конечного автомата к классу полных детерминированных конечных автоматов и процедура минимизации автоматов из этого класса были реализованы в виде программы на языке Python. Текст программы приведён ниже.

from math import *

lev=['A','A','B','B','C','C','D','D','E','E','F','F','G','G','E','G']

prav=['aB','bA','aC','bE','bE','aC','aB','bG','aG','bC','bD','aG','aE','bD','e','e']

Q=[]

E=[]

Y=[]

I=[]

F=[]

P=[]

N=[]

B=[]

pl=0

kz=0

ks=0

l=0

for i in range(len(lev)):

   if len(lev[i])<=len(prav[i]):

       kz=kz+1

   if len(lev[i])==1 and ord(lev[i])<97 and ord(lev[i])>64:

       ks=ks+1   

   s=0        

   for j in prav[i]:

         if ord(j)>64 and ord(j)<97 or ord(j)==101:

             s=s+1         

   if s==1:

       l=l+1

   k=prav[i]

   if ord(k[-1])<97 and ord(k[-1])>64 or ord(j)==101 :

       pl=pl+1

if kz==(len(lev)) and ks==(len(lev)) and l==(len(lev)) and pl==(len(lev)):

   print('праволинейная грамматика')

if kz==(len(lev)) and ks==(len(lev)) and l==(len(lev)) and pl<(len(lev)):

   print('линейная грамматика')

if kz==(len(lev)) and ks==(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('контекстно-свободная грамматика')

if kz==(len(lev)) and ks<(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('контектно-зависимая грамматика')

if kz<(len(lev)) and ks<(len(lev)) and l<(len(lev)) and pl<(len(lev)):

   print('грамматика общего вида')    

for i in range(len(lev)):

   for j in lev:

       s=0

       for w in range(len(Q)):            

           if j!=Q[w]:

               s=s+1

       if s==len(Q):

           Q.append(j)

for i in range(len(lev)):

   for j in prav[i]:

       s=0

       if ord(j)>96 and ord(j)<124 and ord(j)!=101:

           for w in range(len(E)):

               if j!=E[w]:

                   s=s+1

           if s==len(E):

               E.append(j)

for i in range(len(lev)):

   for j in prav[i]:

       s=0

       if ord(j)==101:

           for w in range(len(F)):

               if j!=F[w]:

                   s=s+1

           if s==len(F):

               F.append(lev[i])

I.append(lev[0])

for i in range(len(lev)-len(F)):

   R=lev[i]+prav[i]

   Y.append(R)

print(Q)

print(E)

print(F)

print(I)

print(Y)

p=0

for i in range(len(Q)):

   P=[]

   R=Q[i]    

   s=0

   z=0

   U=E

   for j in range(len(Y)):               

       for k in range(len(Y[j])):

           if k==1 and Y[j][0]==R:

               s=s+1

           if k==2 and Y[j][0]==R:

               P.append(Y[j][1])

   for t in range(len(U)):

       u=U[t]        

       P.remove(u)

   if len(P)!=0:

       print('автомат недетерминированный')

   else:

       p=p+1

if p==len(Q):

   print('автомат полный детерминированный')

for i in range(len(Q)):

   r=0

   for j in range(len(Y)):

        k=Y[j]         

        if k[-1]==Q[i]:

           r=r+1    

   N.append(r)

print(N)

for i in range(len(Y)):

   k=Y[i]

   for j in range(len(N)):

       if N[j]==0:    

           if k[0]==Q[j]:

               B.append(i)                

for i in range(len(B)):

    Y.remove(Y[B[i]])

    if i==0:

        B[i+1]=B[i+1]-1             

print(B)

print(Y)

for i in range(len(N)):

   if N[i]==0:

       Q.remove(Q[i])

L=[]

for j in range(len(Q)):

   t=0

   for i in F:

       if Q[j]==i:

           t=t+1

   if t==0:

       L.append(Q[j])

n=len(Q)

P=[0]*n

for i in range(n):

   P[i]=[0]*n

P[0][0]=L

P[0][1]=F

G=[0]*n

m=len(E)+2

for i in range(n):

   G[i]=[0]*m

G1=[0]*n

for i in range(n):

   G1[i]=[0]*3

for i in range(n):

   G1[i][0]=Q[i]

   for j in range(len(Y)):

       k=Y[j]        

       if k[0]==G1[i][0] and k[1]=='a':

           G1[i][1]=k[-1]

       if k[0]==G1[i][0] and k[1]=='b':

           G1[i][2]=k[-1]

for g in range(n-1):#главный цикл

       for i in range (n):

           G[i][0]=Q[i]

           l=0

           for q in range(n):    

                if P[g][q]!=0:        

                       l=l+1    

           for j in range(l):

                   for k in P[g][j]:            

                       if G[i][0]==k:

                           G[i][1]=j

                       if G[i][0]==G1[i][0] and G1[i][1]==k:

                           G[i][2]=j

                       if G[i][0]==G1[i][0] and G1[i][-1]==k:

                          G[i][3]=j                                 #сформирована главная матрица

       P[g+1][0]=Q[0]

       mn=1

       c4=0

       nep=0

       for j in range(l):

              for k in P[g][j]:                      

                  for h in range(n):      # поиск нужного столбца в главной матрице

                       if G[h][0]==k:       # поиск нужного столбца в главной матрице       

                             h1=h            # поиск нужного столбца в главной матрице

                  for j1 in range(mn):

                      for k1 in P[g+1][j1]:

                          for h in range(n):      # поиск нужного столбца в главной матрице

                               if G[h][0]==k1:       # поиск нужного столбца в главной матрице       

                                     h2=h            # поиск нужного столбца в главной матрице

                          c4=c4+1                        

                          if k!=k1 and G[h1][1]==G[h2][1] and G[h1][2]==G[h2][2] and G[h1][3]==G[h2][3] and k!=0:                   # нужный столбец совпадает с исходным то добваляем букву к множеству

                              P[g+1][j1]=P[g+1][j1]+k

                              break

                          if k!=k1 and (G[h1][1]!=G[h2][1] or G[h1][2]!=G[h2][2] or G[h1][3]!=G[h2][3]) and k!=0:      #сколько раз неподошло

                              nep=nep+1                    #неподходит множеству

                  if nep==c4:                              # если никакому не подошед, добавляем новое множество

                       P[g+1][mn]=k

                       mn=mn+1

                  c4=0

                  nep=0                                                 

                    

print(P[n-1])

print(G)

Q1=[]

for i in range(n):

   if P[n-1][i]!=0:        

       Q1.append(P[n-1][i])

print(Q1)

print(E)    

F1=[]

for i in range(n):

   if P[n-1][i]!=0:

       for k in F:

           for j in P[n-1][i]:

               if j==k:

                   F1.append(P[n-1][i])

           break                                

print(F1)

I1=[]

for i in range(n):

   if P[n-1][i]!=0:

       for k in I:

           for j in P[n-1][i]:

               if j==k:

                   I1.append(P[n-1][i])

           break

print(I1)

Y1=[]

for i in range(n):

   if P[n-1][i]!=0:

       for k in range(len(G)):

           g=G[k]    

           for j in P[n-1][i]:

               if j==g[0]:

                  R=P[n-1][i]+'a'+P[n-1][g[2]]

                  R1=P[n-1][i]+'b'+P[n-1][g[3]]

                  Y1.append(R)

                  Y1.append(R1)

               break

print(Y1)Результат работы программы приведён на рисунке. Видим, что автомат полный детерминированный.

Его минимизированный аналог представлен ниже.

Таким образом, язык, распознаваемый заданным конечным автоматом, представим следующим регулярным выражением

b*a(a*b*)*




1. Стены и башни Московского Кремля
2. Республиканская клиническая стоматологическая поликлиника
3. Управление культуры администрации области
4. вплив посади лідер що має більше посадових повноважень може значно легше вести за собою ніж той хто не во
5. тематик теоретик музыки астроном
6. 1985 Изучая современную живопись пришел к выводу что проблемы колоризма в том виде в каком они существовал
7. Стратегии роста.html
8. Тема- ldquo;Правила проведения инвентаризации и оформления ее результатовrdquo;
9. 21 неопровержимый закон лидерства ПРЕДИСЛОВИЕ ЭТА КНИГА НАВЕРНЯКА придется вам по душе независимо
10. Эндрюс входит в удивительный призрачный мир