Скачиваний:
9
Добавлен:
01.05.2014
Размер:
99.84 Кб
Скачать

Лабораторная работа №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. В ходе выполнения работы были получены навыки по проектирования системы команд машины для реализации вычисления значения заданной функции и её реализации.

7

Соседние файлы в папке Лабораторные работы на muLisp