Advertisement
Guest User

Untitled

a guest
Jun 9th, 2019
94
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 blank_symbol _) str = computeAux tm q_0 aux_str 0
  43.     where aux_str = str ++ [blank_symbol, blank_symbol]
  44.  
  45. computeAux :: MaqT -> State -> String -> Int -> [Config]
  46. computeAux tm@(MaqT states sigma gamma delta _ blank_symbol end_states) q str index =
  47.     if index == (length str)
  48.     then []
  49.     else    let (q_next, c_next, mov) = delta q (str !! index)
  50.                 new_str = replaceNth index c_next str
  51.                 i_head = case mov of
  52.                         L -> index - 1
  53.                         R -> index + 1
  54.                 formatted_str = [ x | x <- str, not (x `elem` [blank_symbol]) ]
  55.                 config = (q, formatted_str, index)
  56.             in if q `elem` end_states
  57.                 then config:[]
  58.                 else config:(computeAux tm q_next new_str i_head)
  59.  
  60.  
  61. replaceNth :: Int -> a -> [a] -> [a]
  62. replaceNth _ _ [] = []
  63. replaceNth n newVal (x:xs)
  64.     | n == 0 = newVal:xs
  65.     | otherwise = x:replaceNth (n-1) newVal xs
  66.  
  67. -- Recibe una MaqT y una cadena
  68. -- Regresa un bool diciendo si la cadena es aceptada [true] o no [false]
  69. -- por la máquina de Turing
  70. accept :: MaqT -> String -> Bool
  71. accept _ _ = True
  72.  
  73. -- Recibe una MaqT
  74. -- Codifica la MaqT para pasarla como entrada de la Máquina Universal
  75. encode :: MaqT -> String
  76. encode _ = "d"
  77.  
  78. -- EXTRA
  79.  
  80. -- Recibe una String representando una máquina codificada
  81. -- Regresa la MaqT que representa
  82. decode :: String -> MaqT
  83. decode _ = error "sdf"
  84.  
  85. tm_delta :: State -> Char -> (State, Char, Movement)
  86. tm_delta "q0" 'a' = ("q1", 'A', R)
  87. tm_delta "q0" 'B' = ("q4", 'B', R)
  88.  
  89. tm_delta "q1" 'a' = ("q1", 'a', R)
  90. tm_delta "q1" 'b' = ("q2", 'B', R)
  91. tm_delta "q1" 'B' = ("q1", 'B', R)
  92.  
  93. tm_delta "q2" 'C' = ("q2", 'C', R)
  94. tm_delta "q2" 'b' = ("q2", 'b', R)
  95. tm_delta "q2" 'c' = ("q3", 'C', L)
  96.  
  97. tm_delta "q3" 'A' = ("q0", 'A', R)
  98. tm_delta "q3" 'C' = ("q3", 'C', L)
  99. tm_delta "q3" 'b' = ("q3", 'b', L)
  100. tm_delta "q3" 'B' = ("q3", 'B', L)
  101. tm_delta "q3" 'a' = ("q3", 'a', L)
  102.  
  103. tm_delta "q4" 'B' = ("q4", 'B', R)
  104. tm_delta "q4" 'C' = ("q4", 'C', R)
  105. tm_delta "q4" '_' = ("qf", '_', R)
  106.  
  107. -- tm_delta _ _ = ("qf", '_', R)
  108.  
  109. tm_ex = MaqT { states=["q0", "q1", "q2", "q3", "q4", "qf"]
  110.              , sigma=['a', 'b', 'c']
  111.              , gamma=['a', 'b', 'c', 'A', 'B', 'C', '_']
  112.              , delta=tm_delta
  113.              , q_0="q0"
  114.              , blank_symbol='_'
  115.              , end_states=["qf"]
  116.              }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement