lu4kedr

regex-NKA

Oct 22nd, 2018
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.List
  2. --           poc stavu, startovni, koncove, abeceda,
  3. data Symbol = Symbol Char
  4.             | Epsilon
  5.  
  6. type Prech = (Int, Symbol, Int)
  7. type Aut = (Int, [Int], [Int], String, [Prech])
  8.  
  9. data RegExpr = Val Char
  10.           | Iter RegExpr
  11.           | Zret RegExpr RegExpr
  12.           | Spoj RegExpr RegExpr
  13.           deriving (Eq, Show)
  14.  
  15. re1 = Zret (Zret ( Iter (Spoj (Val 'a') (Val 'b'))) (Val 'a')) (Val 'b')
  16.  
  17. isEpsilon :: Symbol -> Bool
  18. isEpsilon (Symbol a)=False
  19. isEpsilon Epsilon =True
  20.  
  21. getCh :: Symbol -> Char
  22. getCh (Symbol a) =  a
  23. getCh Epsilon =  '&'
  24.  
  25. printSymbol :: Symbol -> String
  26. printSymbol (Symbol a) =  show a
  27. printSymbol Epsilon =  "&"
  28.  
  29. instance Show Symbol where -- pridani do  Show fce
  30.     show a=printSymbol a
  31.  
  32. ex1 :: Aut
  33. ex1 = (3, [0], [2], "ab", [(0,Symbol 'a',1), (0,Symbol 'b',0), (1,Symbol 'a',1), (1,Symbol 'b',2), (2,Symbol 'a',1), (2,Symbol 'b',0)])
  34.  
  35. ex2 :: Aut
  36. ex2 = (3, [0], [2], "ab", [(0,Symbol 'a',1), (0,Symbol 'a',0), (0,Symbol 'b',0), (1,Symbol 'b',2),(1,Epsilon,2)])
  37.  
  38. krok :: Char -> [Int] -> [Prech] -> [Int]
  39. krok x stavy prech = [novyStav| (stav, symbol, novyStav)<-prech,(existPath symbol x), elem stav stavy]
  40.  
  41. existPath :: Symbol -> Char -> Bool
  42. existPath (Symbol s) c = getCh (Symbol s) ==c
  43. existPath Epsilon _ = True
  44.  
  45. projdi:: String -> [Int] -> [Prech] -> [Int]
  46. projdi []     stavy _     = stavy
  47. projdi (x:xs) stavy prech = projdi xs (krok x stavy prech) prech  
  48.  
  49. indx::[Int]->[[Int]]->Int
  50. indx x xs = let Just y = elemIndex x xs
  51.                   in y
  52.  
  53. jeKoncovy :: [Int]-> [Int] ->Bool
  54. jeKoncovy koncovy aktualni = elem True [elem x koncovy| x<-aktualni]
  55.  
  56. test:: Aut -> String -> Bool
  57. test (_, start, koncove, _, prech) slovo =
  58.   let noveStavy = projdi slovo start prech
  59.   in jeKoncovy koncove noveStavy
  60.  
  61.  
  62. preved:: Aut -> Aut
  63. preved (pocetStavu, start, koncove, symboly, prech) =
  64.   let stavy = dostupne [] [start] prech symboly
  65.       np = [(indx q stavy, (Symbol s), indx (krok s q prech) stavy) |s<-symboly, q<-stavy]
  66.   in (length stavy, start, [indx x stavy|x<-stavy, jeKoncovy koncove x ],symboly,np )
  67.  
  68. dostupne:: [[Int]] -> [[Int]] -> [Prech] ->String -> [[Int]]
  69. dostupne vytvorene [] _ symboly= vytvorene
  70. dostupne x (s:zbytek) prech symboly =
  71.   let nove = [krok x s prech | x<-symboly]
  72.       nz = x ++ [s]
  73.   in dostupne nz (zbytek++[x|x<-nove, notElem x nz, notElem x zbytek]) prech symboly
  74.  
  75.  
  76. spojAut :: Aut -> Aut -> Aut
  77. spojAut (pocetStavuA, startA, koncoveA, symbolyA, prechA) (pocetStavuB, startB,koncoveB, symbolyB, prechB) =
  78.   ((pocetStavuA+pocetStavuB+1), [0],[a|a<-([aa+1| aa<-koncoveA]++[bb+1+pocetStavuA| bb <-koncoveB])], nub (symbolyA++symbolyB), (spojPrechody prechA prechB startA pocetStavuA startB))
  79.  
  80. spojPrechody :: [Prech]->[Prech] -> [Int] ->Int -> [Int] ->[Prech] -- prA, prB, pocatStA,pocetStA, pocatStB,
  81. spojPrechody pA pB pocA ppa pocB =[(0,Epsilon,pp+1)|pp<-pocA]++[(0,Epsilon,pb+1+ppa)|pb<-pocB] ++ [((z+1), co, (kam+1))|(z,co,kam)<-pA] ++[((zB+1+ppa), coB, kamB+1+ppa)|(zB,coB,kamB)<-pB]
  82.  
  83. zretAut :: Aut -> Aut -> Aut
  84. zretAut (pocetStavuA, startA, koncoveA, symbolyA, prechA) (pocetStavuB, startB,koncoveB, symbolyB, prechB) =
  85.   let zretPrech = prechA ++ [(f,Epsilon,t+pocetStavuA)|f<-koncoveA, t<-startB] ++ [(x+pocetStavuA,y,z+pocetStavuA)|(x,y,z)<-prechB]
  86.   in ((pocetStavuA+pocetStavuB),startA,[x+pocetStavuA|x<-koncoveB],nub (symbolyA++symbolyB),zretPrech)
  87.  
  88.  
  89. iterAut :: Aut ->  Aut
  90. iterAut (pocetStavuA, startA, koncoveA, symbolyA, prechA) =
  91.   ((pocetStavuA+1),[0],[0] ++ [x+1|x<-koncoveA], symbolyA, [(0,Epsilon,a+1)|a <-startA] ++ [(k+1,Epsilon,0)|k<-koncoveA] ++ [(z+1,co,kam+1)|(z,co,kam)<-prechA] )
  92.  
  93.  
  94. makeSimpleAut :: Char -> Aut
  95. makeSimpleAut znak = (2,[0],[1],[znak],[(0, Symbol znak,1)])
  96.  
  97.  
  98. prevedRegex :: RegExpr -> Aut
  99. prevedRegex (Val x) = makeSimpleAut x
  100. prevedRegex (Iter x) = iterAut (prevedRegex x)
  101. prevedRegex (Zret x y) = zretAut (prevedRegex x) (prevedRegex y)
  102. prevedRegex (Spoj x y) = spojAut (prevedRegex x) (prevedRegex y)
  103.  
  104. re2 = Zret (Spoj (Iter (Spoj (Val 'a') (Val 'b'))) (Val 'c')) (Val 'a')
Advertisement
Add Comment
Please, Sign In to add comment