Advertisement
Guest User

Untitled

a guest
Jun 9th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Implementación de Máquina de Turing
  2.  
  3. -- Se define formalmente como TM  = (Q, Σ, Γ, δ, qo, ␣, F) donde:
  4. -- Q Conjunto de estados
  5. -- Σ Alfabeto de entrada
  6. -- Γ Alfabeto de la cinta
  7. -- δ Función de transición
  8. -- q0 Estado Inicial
  9. -- ␣ Símbolo en blanco
  10. -- F Conjunto de estados finales
  11.  
  12. -- Definamos los tipos:
  13.  
  14. type State = String
  15.  
  16. -- Una configuración se representa mediante el siguiente sinónimo
  17. -- El entero representa la posición de la cabeza de lectoescritura en la cadena
  18. type Config = (State, String, Int)
  19.  
  20. type Q = [State]
  21. type Sigma = [Char]
  22. type Gamma = [Char]
  23. type Delta = State -> Char -> (State, Char, Movement)
  24. type F = [String]
  25.  
  26. -- Movimiento de la cabeza lectora
  27. data Movement = L | R
  28.  
  29. -- Tipo de dato algebraico de la Máquina de Turing
  30. data MaqT = MaqT { states :: Q
  31.                  , sigma :: Sigma
  32.                  , gamma :: Gamma
  33.                  , delta :: Delta
  34.                  , q_0 :: State
  35.                  , blank_symbol :: Char
  36.                  , end_states :: F
  37.                  }
  38.  
  39. -- Recibe una MaqT y una cadena
  40. -- Imprime el procesamiento formal de la cadena con configuraciones
  41. compute :: MaqT -> String -> [Config]
  42. compute tm@(MaqT _ _ _ _ q_0 _ _) str = computeAux tm q_0 str 0
  43.  
  44. computeAux :: MaqT -> State -> String -> Int -> [Config]
  45. computeAux tm@(MaqT states sigma gamma delta _ blank_symbol end_states) q str index =
  46.     case str of [] -> []
  47.                 (x:_) ->
  48.                     let (q_next, c_next, mov) = delta q x
  49.                         new_str = replaceNth index c_next str
  50.                         config = (q, str, index)
  51.                         i_head = case mov of
  52.                                     L -> index
  53.                                     R -> index + 1
  54.                     in config:(computeAux tm q_next new_str i_head)
  55.  
  56.  
  57. replaceNth :: Int -> a -> [a] -> [a]
  58. replaceNth _ _ [] = []
  59. replaceNth n newVal (x:xs)
  60.     | n == 0 = newVal:xs
  61.     | otherwise = x:replaceNth (n-1) newVal xs
  62.  
  63. -- Recibe una MaqT y una cadena
  64. -- Regresa un bool diciendo si la cadena es aceptada [true] o no [false]
  65. -- por la máquina de Turing
  66. accept :: MaqT -> String -> Bool
  67. accept _ _ = True
  68.  
  69. -- Recibe una MaqT
  70. -- Codifica la MaqT para pasarla como entrada de la Máquina Universal
  71. encode :: MaqT -> String
  72. encode _ = "d"
  73.  
  74. -- EXTRA
  75.  
  76. -- Recibe una String representando una máquina codificada
  77. -- Regresa la MaqT que representa
  78. decode :: String -> MaqT
  79. decode _ = error "sdf"
  80.  
  81. tm_delta :: State -> Char -> (State, Char, Movement)
  82. tm_delta "q0" 'a' = ("q1", 'A', R)
  83. tm_delta "q0" 'B' = ("q4", 'B', R)
  84.  
  85. tm_delta "q1" 'a' = ("q1", 'a', R)
  86. tm_delta "q1" 'b' = ("q2", 'B', R)
  87. tm_delta "q1" 'B' = ("q1", 'B', R)
  88.  
  89. tm_delta "q2" 'C' = ("q2", 'C', R)
  90. tm_delta "q2" 'b' = ("q2", 'b', R)
  91. tm_delta "q2" 'c' = ("q3", 'C', L)
  92.  
  93. tm_delta "q3" 'A' = ("q0", 'A', R)
  94. tm_delta "q3" 'C' = ("q3", 'C', L)
  95. tm_delta "q3" 'b' = ("q3", 'b', L)
  96. tm_delta "q3" 'B' = ("q3", 'B', L)
  97. tm_delta "q3" 'a' = ("q3", 'a', L)
  98.  
  99. tm_delta "q4" 'B' = ("q4", 'B', R)
  100. tm_delta "q4" 'C' = ("q4", 'C', R)
  101. tm_delta "q4" '_' = ("qf", '_', R)
  102.  
  103. -- tm_delta _ _ = ("qf", '_', R)
  104.  
  105. tm_ex = MaqT { states=["q0", "q1", "q2", "q3", "q4", "qf"]
  106.              , sigma=['a', 'b', 'c']
  107.              , gamma=['a', 'b', 'c', 'A', 'B', 'C', '_']
  108.              , delta=tm_delta
  109.              , q_0="q0"
  110.              , blank_symbol='_'
  111.              , end_states=["qf"]
  112.              }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement