Лабораторные работы на muLisp / lab_7
.docЛабораторная работа №7
«Моделирование работы машины Тьюринга»
Цель работы: построение машины Тьюринга на языке muLisp, позволяющей реализовать заданную функцию.
Задание к работе: реализовать машину Тьюринга для функции
Выполнение работы:
Описание функций:
start ( str ) – определяет систему команд машины и запускает её работу. Параметр str – исходное содержимое ленты.
m_turing ( str ) – запрашивает исходную строку str, соответствующую записи на ленте, выполняет начальные установки и вызывает функцию, отрабатывающую каждый такт.
step (pos str sost) – функция, имитирующая работу машины Тьюринга, получает в виде исходных данных текущую позицию pos, текущую запись на ленте str и текущее состояние sost. За одну итерацию определяет новое состояние, новую позицию и формирует новый вид ленты, после чего рекурсивно вызывает сама себя для следующей итерации. Заканчивает работу, если машина приходит в заключительное состояние.
change (sym pos list n) – в заданной строке list (переведенной в эквивалентный ей список) заменяет в позиции pos старый символ на новый, связанный с параметром sym. Параметр n задает начальную позицию для просмотра списка.
analiz (pos napr) – определяет новую текущую позицию на ленте на основании прежней позиции pos и направления перемещения napr из отработавшей команды.
get_symbol (pos str) – для заданной строки str выдает символ, стоящий в позиции pos.
tu (pos sym sost) – среди команд машины Тьюринга выбирается команда, соответствующая текущему состоянию и определяются параметры нового состояния.
Листинг программы:
; запуск машины Тьюринга
(defun start ( str )
(setq *com* '(
; операция сложения
(70 " " 0 " " "r" )
(0 "1" 1 "0" "r")
(0 " " 7 " " "r")
(1 "1" 1 "1" "r")
(1 " " 2 " " "r")
(2 "1" 2 "1" "r")
(2 " " 3 " " "r")
(3 " " 4 "1" "l")
(3 "1" 3 "1" "r")
(4 "1" 4 "1" "l")
(4 " " 5 " " "l")
(5 "1" 5 "1" "l")
(5 " " 6 " " "l")
(5 "0" 7 "1" "r")
(6 "1" 6 "1" "l")
(6 "0" 0 "1" "r")
(7 "1" 2 "0" "r")
(7 " " 8 " " "r")
(8 "1" 8 "1" "l")
(8 " " 9 " " "l")
; операция умножения
(9 "1" 9 "1" "l")
(9 " " 10 " " "r")
(10 "1" 11 "1" "r")
(11 "1" 12 "0" "r")
(11 " " 20 " " "r")
(12 "1" 12 "1" "r")
(12 " " 13 " " "r")
(13 "1" 14 "0" "r")
(13 " " 18 " " "l")
(14 "1" 14 "1" "r")
(14 " " 15 " " "r")
(15 " " 16 "1" "l")
(15 "1" 15 "1" "r")
(16 "1" 16 "1" "l")
(16 " " 17 " " "l")
(17 "1" 17 "1" "l")
(17 "0" 13 "1" "r")
(18 "1" 18 "1" "l")
(18 " " 19 " " "l")
(19 "1" 19 "1" "l")
(19 "0" 11 "1" "r")
(20 "1" 20 "1" "r")
(20 " " 21 " " "r")
(21 "1" 21 "1" "r")
(21 " " 22 " " "l")
(22 "1" 23 " " "l")
(22 " " 24 " " "l")
(23 " " 24 "1" "l")
(23 "1" 23 "1" "l")
(24 "1" 24 "1" "l")
(24 " " 25 " " "r")
; вычисление x*x
(25 "1" 25 "1" "l")
(25 " " 26 " " "l")
(26 "1" 26 "1" "l")
(26 " " 27 " " "l")
(27 "1" 27 "1" "l")
(27 " " 28 " " "r")
(28 "1" 29 "0" "r")
(28 " " 37 " " "l")
(29 "1" 29 "1" "r")
(29 " " 30 " " "r")
(30 "1" 30 "1" "r")
(30 " " 31 " " "r")
(31 "1" 31 "1" "r")
(31 " " 32 " " "r")
(32 " " 33 "1" "l")
(32 "1" 32 "1" "r")
(33 " " 34 " " "l")
(33 "1" 33 "1" "l")
(34 "1" 34 "1" "l")
(34 " " 35 " " "l")
(35 "1" 35 "1" "l")
(35 " " 36 " " "l")
(36 "1" 36 "1" "l")
(36 "0" 28 "1" "r")
(37 "1" 37 "1" "l")
(37 " " 38 " " "r")
(38 "1" 39 "1" "r")
(39 "1" 40 "0" "r")
(39 " " 52 " " "r")
(40 "1" 40 "1" "r")
(40 " " 41 " " "r")
(41 "1" 41 "1" "r")
(41 " " 42 " " "r")
(42 "1" 42 "1" "r")
(42 " " 43 " " "r")
(43 "1" 44 "0" "r")
(43 " " 48 " " "l")
(44 "1" 44 "1" "r")
(44 " " 45 " " "r")
(45 " " 46 "1" "l")
(45 "1" 45 "1" "r")
(46 " " 47 " " "l")
(46 "1" 46 "1" "l")
(47 "1" 47 "1" "l")
(47 "0" 43 "1" "r")
(48 "1" 48 "1" "l")
(48 " " 49 " " "l")
(49 "1" 49 "1" "l")
(49 " " 50 " " "l")
(50 "1" 50 "1" "l")
(50 " " 51 " " "l")
(51 "1" 51 "1" "l")
(51 "0" 39 "1" "r")
(52 "1" 52 "1" "r")
(52 " " 53 " " "r")
(53 "1" 53 "1" "r")
(53 " " 54 " " "r")
(54 "1" 54 "1" "r")
(54 " " 55 " " "r")
(55 "1" 55 "1" "r")
(55 " " 56 " " "l")
(56 "1" 57 " " "l")
(56 " " 59 " " "l")
(57 "1" 57 "1" "l")
(57 " " 58 "1" "l")
(58 "1" 58 "1" "l")
(58 " " 59 " " "r")
; операция деления
(59 "1" 60 "0" "l")
(60 " " 61 " " "l")
(60 "0" 60 "0" "l")
(61 "1" 61 "1" "l")
(61 " " 62 " " "r")
(61 "0" 62 "0" "r")
(62 "1" 63 "0" "r")
(62 " " 68 " " "r")
(63 "1" 63 "1" "r")
(63 " " 64 " " "r")
(64 "0" 64 "0" "r")
(64 "1" 60 "0" "l")
(64 " " 65 " " "r")
(65 " " 66 "1" "l")
(65 "1" 65 "1" "r")
(66 "1" 66 "1" "l")
(66 " " 67 " " "l")
(67 "0" 67 "1" "l")
(67 " " 59 " " "r")
(68 "0" 68 "1" "r")
(68 "1" 68 "1" "r")
(68 " " 69 " " "r")
) )
(m_turing str)
)
; функция запроса исходной строки - записи на ленте и запуска работы машины Тьюринга
(defun m_turing ( str )
(clear-screen)
(set-cursor 0 0)
(write-string str)
(terpri)
(set-cursor 2 0)
(write-string "^")
(terpri)
(set-cursor 12 1)
(write-string " (x+y)*y ")
(set-cursor 13 1)
(write-string "f(x,y) = -------------")
(set-cursor 14 1)
(write-string " x*x ")
; (delay 1000)
(step 0 str 70)
)
; функция имитации работы машины Тьюринга
(defun step (pos str sost)
((eql sost 69) (print "End work"))
(setq sym (get_symbol pos str))
(setq list-mt (tu pos sym sost))
(set-cursor 0 pos) (write-string sym)
(setq n_str (pack(change (second list-mt) pos (unpack str) 0 )))
(setq n_pos (analiz pos (caddr list-mt)))
(set-cursor 0 0)
(write-string n_str)
(set-cursor 2 pos) (write-string " ")
(set-cursor 2 n_pos) (write-string "^")
(step n_pos n_str (car list-mt))
)
; функция замены старого символа на новый
(defun change (sym pos list n)
((eql n pos) (cons sym (cdr list)))
(cons (car list) (change sym pos (cdr list) (+ n 1)))
)
; функция определения новой позиции на основании текущей позиции и направления перемещения
(defun analiz (pos napr)
((string= napr "l") (- pos 1))
((string= napr "r") (+ pos 1))
((string= napr "e") pos)
)
; функция выбора команды, соответствующей текущему состоянию
(defun tu (pos sym sost)
(setq l1 *com*)
(loop
(setq l2 (pop l1))
((and (eql (car l2) sost) (eql (cadr l2) sym)) (cddr l2))
)
)
; функция определения символа в позиции строки
(defun get_symbol (pos str)
(char str pos)
)
Работа программы:
Для начала работы программы необходимо вызвать функцию start и передает ей в качестве параметра исходное состояние ленты машины Тьюринга – через пробелы вводятся значения параметров функции:
При нажатии кнопки Enter начинается работа машины Тьюринга и после окончания её работы выводится лента машины:
на ленте после окончания деления через пробел записаны: значение параметра x, значение параметра y, значение числителя функции, значение знаменателя функции, результат функции.
Вывод: в данной лабораторной работе было произведено моделирование работы машины Тьюринга на языке muLisp. В ходе выполнения работы были получены навыки по проектирования системы команд машины для реализации вычисления значения заданной функции и её реализации.