Будь умным!


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

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

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

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

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

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

от 25%

Подписываем

договор

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

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

Лабораторная работа №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. Лабораторная работа 7 РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ ЗЕЙДЕЛЯ Вариант 16- Метод Зейд
3. Водородная энергетика
4. Захист житлових прав
5. Тема 1. Введение в микроэкономику План 1
6. Правовая природа статуса арбитражных управляющих в законодательстве о несостоятельности
7. Электроснабжение цеха промышленного предприятия
8. Тема ПНЕВМОНИЯ Количество часов 2
9. тематический урок организационный классный час
10. правового коледжу МАУП
11. лекарство является производным французского слова DROGUE сухая трава подразумевают любое вещество которое м
12. Развитие экономики Республики Казахстан
13. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата педагогічних наук.html
14. О защите прав потребителей с изменениями от 05
15. Стрельна 50 на спине Девочки 2005г
16. иГассет Дегуманизация искусства Перевод С
17. участвует в регуляции всех видов обмена веществ в организме человека но основное действие стимуляция рост
18. ЮжноРоссийский государственный университет экономики и сервиса ФГБОУ ВПО ЮРГУЭС Кафедра Теор
19. Российский государственный профессиональнопедагогический университет Машиностроительный институт.html
20. Роман