Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лисп - лаб.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
373.76 Кб
Скачать

Лабораторная работа №4 Моделирование работы машины Тьюринга

Mulisp

Определим набор функций для реализации поставленной задачи:

delay(n) – организует задержку (ведет вычисления для заданного произвольного числа n). Используется для установления паузы между отдельными тактами машины.

start() – определяет систему команд машины и запускает ее в работу.

m_turing() – запрашивает исходную строку, соответствующую записи на ленте, выполняет начальные установки и вызывает функцию, отрабатывающую каждый такт.

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 delay (n)

(loop

((eql n 0) "delay")

(setq n (- n 1))

)

)

(defun run()

(setq *com* '(

(1 "1" 2 "1" "r") ;реализация вычитания

(2 "1" 2 "1" "r")

(2 "-" 3 "-" "r")

(3 "1" 3 "1" "r")

(3 "=" 4 "=" "l")

(4 "1" 5 "*" "l")

(5 "-" 6 "-" "l")

(4 "-" 20 "-" "l")

(5 "1" 5 "1" "l")

(6 "-" 6 "-" "l")

(6 "*" 6 "*" "l")

(6 "1" 7 "*" "r")

(7 "-" 8 "-" "r")

(7 "*" 7 "*" "r")

(8 "1" 8 "1" "r")

(8 "*" 9 "*" "l")

(9 "1" 5 "*" "l")

(9 "-" 20 "-" "l")

(20 "*" 20 "*" "l") ; вывод результата вычитания после знака '='

(20 " " 25 " " "r")

(20 "1" 21 "!" "r")

(21 "!" 21 "!" "r")

(21 "-" 21 "-" "r")

(20 "!" 20 "!" "r")

(21 "*" 21 "*" "r")

(21 "1" 21 "1" "r")

(21 "=" 21 "=" "r")

(21 " " 22 "1" "l")

(22 "1" 22 "1" "l")

(22 "=" 23 "=" "l")

(23 "1" 23 "1" "l")

(23 "*" 24 "*" "l")

(24 "-" 24 "-" "l")

(24 "*" 24 "*" "l")

(24 "!" 24 "!" "l")

(24 "1" 21 "!" "r")

(24 " " 25 " " "r")

(25 "!" 25 "1" "r")

(25 "*" 25 "1" "r")

(25 "-" 25 "-" "r")

(25 "1" 25 "1" "r")

(25 "=" 25 "=" "r")

(25 " " 200 "!" "e")

))

(m_turing)

)

(defun m_turing()

(prin1 "Input string->")(setq str (read))

(clear-screen)

(set-cursor 0 0)

(write-string str)

(terpri)

(set-cursor 2 1)

(write-string "^")

(terpri)

(delay 200000)

(step 1 str 2)

)

(defun step (pos str sost)

((eql sost 200)(print "Rabota mashiny Turinga okonchena")

(print"---------------------------------------------------------------------")

)

(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 "^")

(delay 200000)

(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)

)

Lispworks

Функция findstate по заданному текущему состоянию state, списку leftpart содержимого ленты слева от головки, букве letter под головкой, списку rightpart букв ленты справа от головки и ещё не просмотренной части programrest программы находит в этой части список команд для текущего состояния. В случае неуспеха этого поиска работа машины завершается, а функция result компонует из частей ленты результирующее слово

Функция findinstruction ищет в списке команд instructionslist для состояния state команду, соответствующую букве letter. Если команда нашлась, то происходит обращение к функции step& для исполнения очередного шага работы машины. При неудаче вызывается функция result – работа программы завершена.

Функция step& записывает под головкой новую букву newletter, сдвигает, если значение параметра shift этого требует, головку вправо или влево и переводит машину в состояние newstate. Если часть ленты в направлении сдвига представлена пустым списком, то под головкой размещается пустая клетка, как бы выделенная из этого списка, остающегося пустым.

(setq alphbet '(ZERO 1 +))

(setq stateslist '(Q0 Q1 Q2))

;сложение чисел

(setq program

'((Q0 (1 Q0 1 right) (+ Q1 1 STILL))

(Q1 (1 Q1 1 right) (ZERO Q2 ZERO left))

(Q2 (1 Q2 ZERO still))))

(defun turing (input)

(print "Машина Тьюринга")

(setq sl stateslist)

(findstate (car sl) nil (car input)(cdr input) program))

(defun findstate(state leftpart letter rightpart programrest)

(cond

((null programrest) (result leftpart letter rightpart))

((eq state (caar programrest)) (findinstruction state

leftpart letter rightpart (cdar programrest)))

(t(findstate state leftpart letter rightpart

(cdr programrest)))))

(defun findinstruction(state leftpart

letter rightpart instructionslist)

(cond

((null instructionslist)(result leftpart letter rightpart))

((eq letter (caar instructionslist))

(step& (cadar instructionslist) leftpart

(caddar instructionslist) rightpart

(car (cdddar instructionslist))))

(t(findinstruction state leftpart

letter rightpart (cdr instructionslist)))))

(defun step& (newstate leftpart newletter rightpart shift)

(cond

((eq shift 'still)

(findstate newstate leftpart newletter rightpart program))

((eq shift 'right)(findstate newstate (cons newletter leftpart)

(cond

((null rightpart) (car alphabet))

(t (car rightpart)))

(cond

((null rightpart) nil)

(t (cdr rightpart))) program))

((eq shift 'left) (findstate newstate

(cond

((null leftpart) nil)

(t (cdr leftpart)))

(cond

((null leftpart) (car alphabet))

(t (car leftpart)))

(cons newletter rightpart) program))))

(defun result(leftpart letter rightpart)

(print "Результат")

(remove 'ZERO (append leftpart (cons letter rightpart))))

Пример обращения:

CL-USER 11 > (turing '(1 1 1 1 + 1 1))

"Результат"

(1 1 1 1 1 1)

Задания для самостоятельного решения:

Реализовать машину Тьюринга, описывающую функции, представленные в табл.3.1. 

Таблица 3.1

Функция

Функция

1

2

3

4

1.      

 

2.     

3.      

4.     

5.      

6.     

7.      

8.     

9.      

10.            

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]