Guest User

Untitled

a guest
Jul 19th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. type Arity = Integer
  2. data Term = Function Arity | Variable
  3.  
  4. termByName :: Char -> Maybe Term
  5. -- f, g, h - функции арности 2
  6. termByName 'f' = Just (Function 2)
  7. termByName 'g' = Just (Function 2)
  8. termByName 'h' = Just (Function 2)
  9. -- p, q - функции арности 3
  10. termByName 'p' = Just (Function 3)
  11. termByName 'q' = Just (Function 3)
  12. -- m - функция арности 1
  13. termByName 'm' = Just (Function 1)
  14. -- переменные
  15. termByName 'x' = Just Variable
  16. termByName 'y' = Just Variable
  17. termByName 'z' = Just Variable
  18. termByName 'u' = Just Variable
  19. termByName 'v' = Just Variable
  20. -- любой другой символ не является именем терма
  21. termByName _ = Nothing
  22.  
  23. type Junk = String
  24. -- Fail - строка не начинается с терма, Success - начинается, и после него идёт Junk
  25. data ParseResult = Fail | Success Junk
  26.  
  27. parseTerm :: String -> ParseResult
  28. parseTerm [] = Fail
  29. parseTerm (first:chars) =
  30. parseTerm' term chars
  31. where
  32. term = termByName first
  33.  
  34. parseTerm' :: (Maybe Term) -> String -> ParseResult
  35.  
  36. -- Если строка начинается с имени переменной
  37. parseTerm' (Just Variable) chars = Success chars
  38.  
  39. -- Если строка начинается с имени функции, то нужно считать
  40. -- открывающую скобку, аргументы и закрывающую скобку
  41. parseTerm' (Just (Function arity)) chars =
  42. (openBracket `before` (arguments arity) `before` closeBracket) chars
  43. where
  44. openBracket = parseChar '('
  45. closeBracket = parseChar ')'
  46.  
  47. arguments :: Arity -> String -> ParseResult
  48. -- ноль аргументов
  49. arguments 0 = Success
  50. -- один аргумент
  51. arguments 1 = argument
  52. -- более одного аргумента
  53. arguments arity =
  54. argument `before` comma `before` (arguments (arity - 1))
  55. where
  56. comma = parseChar ','
  57.  
  58. -- аргумент это терм
  59. argument = parseTerm
  60.  
  61. parseChar :: Char -> String -> ParseResult
  62. parseChar char =
  63. parse
  64. where
  65. parse (char:chars) = Success chars
  66. parse _ = Fail
  67.  
  68. before :: (String -> ParseResult) -> (String -> ParseResult) -> (String -> ParseResult)
  69. f `before` g =
  70. g' . f
  71. where
  72. g' Fail = Fail
  73. g' (Success junk) = g junk
  74.  
  75. -- если строка начинается с чего-то постороннего, то это не терм
  76. parseTerm' Nothing _ = Fail
  77.  
  78. isTerm :: String -> Bool
  79. isTerm s =
  80. isTerm' parsed
  81. where
  82. parsed = parseTerm s
  83. -- строка является термом если она состоит из терма за которым следует пустая строка
  84. isTerm' (Success "") = True
  85. isTerm' _ = False
Add Comment
Please, Sign In to add comment