
Лабораторные работа на Turbo Prolog / lab_3
.docЛабораторная работа №3
«Моделирование работы машины Тьюринга»
Цель работы: построение машины Тьюринга на языке Turbo Prolog, позволяющей реализовать заданную функцию.
Задание к работе: реализовать машину Тьюринга для функции
Выполнение работы:
Описание предикатов:
tu(integer, string, integer, integer, string, integer) – описывает команды машины Тьюринга. Первый параметр – текущее состояние, второй – наблюдаемый символ, третий – текущая позиция на ленте, четвертый – новое состояние, пятый – записываемый на ленту символ, шестой – новая позиция, полученная после перемещения считывающего устройства.
t(integer, string, integer) – организует общий вычислительный процесс. Первый параметр – текущая позиция на ленте, второй – строка символов, соответствующая записанной на ленте информации, третий – текущее состояние машины.
str(string, integer, string, string) – осуществляет процесс записи нового символа на ленту. В строке символов, которой соответствует первый параметр, в позиции, задаваемой вторым параметром, старый символ заменяется на символ, определяемый третьим параметром. Полученная после замены строка связывается с четвертым параметром.
sym(integer, string, string) – извлекает из строки, связанной со вторым параметром, символ, стоящий в позиции, определенной первым параметром, и присваивает его значение третьему параметру.
start – организует начало работы программы, ввод строки, соответствующей ленте машины в начальный момент времени.
Листинг программы:
predicates
tu(integer, string, integer, integer, string, integer)
t(integer, string, integer)
str(string, integer, string, string)
sym(integer, string, string)
start
clauses
sym(1, S0, S2) if
frontstr(1, S0, S2, _).
sym(N, S0, S2) if
N1 = N -1,
frontstr(N1,S0,_,R),
frontstr(1, R,S2,_).
str(S0,1,SR,Rez) if
frontchar(S0,_,R2),
concat(SR,R2,Rez).
str(S0,N,SR,Rez) if
N1 = N-1,
frontstr(N1,S0,S2,R),
frontchar(R,_,R2),
concat(S2,SR,R3),
concat(R3,R2,Rez).
/* вычисление x+y */
tu(-1," ",N,0," ",N1) if N1 = N+1.
tu(0,"1",N,1,"0",N1) if N1 = N+1.
tu(0," ",N,7," ",N1) if N1 = N+1.
tu(1,"1",N,1,"1",N1) if N1=N+1.
tu(1," ",N,2," ",N1) if N1=N+1.
tu(2,"1",N,2,"1",N1) if N1=N+1.
tu(2," ",N,3," ",N1) if N1=N+1.
tu(3," ",N,4,"1",N1) if N1=N-1.
tu(3,"1",N,3,"1",N1) if N1=N+1.
tu(4,"1",N,4,"1",N1) if N1=N-1.
tu(4," ",N,5," ",N1) if N1=N-1.
tu(5,"1",N,5,"1",N1) if N1=N-1.
tu(5," ",N,6," ",N1) if N1=N-1.
tu(5,"0",N,7,"1",N1) if N1=N+1.
tu(6,"1",N,6,"1",N1) if N1=N-1.
tu(6,"0",N,0,"1",N1) if N1=N+1.
tu(7,"1",N,2,"0",N1) if N1=N+1.
tu(7," ",N,8," ",N1) if N1=N+1.
tu(8,"1",N,8,"1",N1) if N1=N-1.
tu(8," ",N,9," ",N1) if N1=N-1.
/* вычисление (x+y)*y */
tu(9,"1",N,9,"1",N1) if N1=N-1.
tu(9," ",N,10," ",N1) if N1=N+1.
tu(10,"1",N,11,"1",N1) if N1=N+1.
tu(11,"1",N,12,"0",N1) if N1=N+1.
tu(11," ",N,20," ",N1) if N1=N+1.
tu(12,"1",N,12,"1",N1) if N1=N+1.
tu(12," ",N,13," ",N1) if N1=N+1.
tu(13,"1",N,14,"0",N1) if N1=N+1.
tu(13," ",N,18," ",N1) if N1=N-1.
tu(14,"1",N,14,"1",N1) if N1=N+1.
tu(14," ",N,15," ",N1) if N1=N+1.
tu(15," ",N,16,"1",N1) if N1=N-1.
tu(15,"1",N,15,"1",N1) if N1=N+1.
tu(16,"1",N,16,"1",N1) if N1=N-1.
tu(16," ",N,17," ",N1) if N1=N-1.
tu(17,"1",N,17,"1",N1) if N1=N-1.
tu(17,"0",N,13,"1",N1) if N1=N+1.
tu(18,"1",N,18,"1",N1) if N1=N-1.
tu(18," ",N,19," ",N1) if N1=N-1.
tu(19,"1",N,19,"1",N1) if N1=N-1.
tu(19,"0",N,11,"1",N1) if N1=N+1.
tu(20,"1",N,20,"1",N1) if N1=N+1.
tu(20," ",N,21," ",N1) if N1=N+1.
tu(21,"1",N,21,"1",N1) if N1=N+1.
tu(21," ",N,22," ",N1) if N1=N-1.
tu(22,"1",N,23," ",N1) if N1=N-1.
tu(22," ",N,24," ",N1) if N1=N-1.
tu(23," ",N,24,"1",N1) if N1=N-1.
tu(23,"1",N,23,"1",N1) if N1=N-1.
tu(24,"1",N,24,"1",N1) if N1=N-1.
tu(24," ",N,25," ",N1) if N1=N+1.
/* вычисление x*x */
tu(25,"1",N,25,"1",N1) if N1=N-1.
tu(25," ",N,26," ",N1) if N1=N-1.
tu(26,"1",N,26,"1",N1) if N1=N-1.
tu(26," ",N,27," ",N1) if N1=N-1.
tu(27,"1",N,27,"1",N1) if N1=N-1.
tu(27," ",N,28," ",N1) if N1=N+1.
tu(28,"1",N,29,"0",N1) if N1=N+1.
tu(28," ",N,37," ",N1) if N1=N-1.
tu(29,"1",N,29,"1",N1) if N1=N+1.
tu(29," ",N,30," ",N1) if N1=N+1.
tu(30,"1",N,30,"1",N1) if N1=N+1.
tu(30," ",N,31," ",N1) if N1=N+1.
tu(31,"1",N,31,"1",N1) if N1=N+1.
tu(31," ",N,32," ",N1) if N1=N+1.
tu(32," ",N,33,"1",N1) if N1=N-1.
tu(32,"1",N,32,"1",N1) if N1=N+1.
tu(33," ",N,34," ",N1) if N1=N-1.
tu(33,"1",N,33,"1",N1) if N1=N-1.
tu(34,"1",N,34,"1",N1) if N1=N-1.
tu(34," ",N,35," ",N1) if N1=N-1.
tu(35,"1",N,35,"1",N1) if N1=N-1.
tu(35," ",N,36," ",N1) if N1=N-1.
tu(36,"1",N,36,"1",N1) if N1=N-1.
tu(36,"0",N,28,"1",N1) if N1=N+1.
tu(37,"1",N,37,"1",N1) if N1=N-1.
tu(37," ",N,38," ",N1) if N1=N+1.
tu(38,"1",N,39,"1",N1) if N1=N+1.
tu(39,"1",N,40,"0",N1) if N1=N+1.
tu(39," ",N,52," ",N1) if N1=N+1.
tu(40,"1",N,40,"1",N1) if N1=N+1.
tu(40," ",N,41," ",N1) if N1=N+1.
tu(41,"1",N,41,"1",N1) if N1=N+1.
tu(41," ",N,42," ",N1) if N1=N+1.
tu(42,"1",N,42,"1",N1) if N1=N+1.
tu(42," ",N,43," ",N1) if N1=N+1.
tu(43,"1",N,44,"0",N1) if N1=N+1.
tu(43," ",N,48," ",N1) if N1=N-1.
tu(44,"1",N,44,"1",N1) if N1=N+1.
tu(44," ",N,45," ",N1) if N1=N+1.
tu(45," ",N,46,"1",N1) if N1=N-1.
tu(45,"1",N,45,"1",N1) if N1=N+1.
tu(46," ",N,47," ",N1) if N1=N-1.
tu(46,"1",N,46,"1",N1) if N1=N-1.
tu(47,"1",N,47,"1",N1) if N1=N-1.
tu(47,"0",N,43,"1",N1) if N1=N+1.
tu(48,"1",N,48,"1",N1) if N1=N-1.
tu(48," ",N,49," ",N1) if N1=N-1.
tu(49,"1",N,49,"1",N1) if N1=N-1.
tu(49," ",N,50," ",N1) if N1=N-1.
tu(50,"1",N,50,"1",N1) if N1=N-1.
tu(50," ",N,51," ",N1) if N1=N-1.
tu(51,"1",N,51,"1",N1) if N1=N-1.
tu(51,"0",N,39,"1",N1) if N1=N+1.
tu(52,"1",N,52,"1",N1) if N1=N+1.
tu(52," ",N,53," ",N1) if N1=N+1.
tu(53,"1",N,53,"1",N1) if N1=N+1.
tu(53," ",N,54," ",N1) if N1=N+1.
tu(54,"1",N,54,"1",N1) if N1=N+1.
tu(54," ",N,55," ",N1) if N1=N+1.
tu(55,"1",N,55,"1",N1) if N1=N+1.
tu(55," ",N,56," ",N1) if N1=N-1.
tu(56,"1",N,57," ",N1) if N1=N-1.
tu(56," ",N,59," ",N1) if N1=N-1.
tu(57,"1",N,57,"1",N1) if N1=N-1.
tu(57," ",N,58,"1",N1) if N1=N-1.
tu(58,"1",N,58,"1",N1) if N1=N-1.
tu(58," ",N,59," ",N1) if N1=N+1.
/* деление числителя на знаменатель */
tu(59,"1",N,60,"0",N1) if N1=N-1.
tu(60," ",N,61," ",N1) if N1=N-1.
tu(60,"0",N,60,"0",N1) if N1=N-1.
tu(61,"1",N,61,"1",N1) if N1=N-1.
tu(61," ",N,62," ",N1) if N1=N+1.
tu(61,"0",N,62,"0",N1) if N1=N+1.
tu(62,"1",N,63,"0",N1) if N1=N+1.
tu(62," ",N,68," ",N1) if N1=N+1.
tu(63,"1",N,63,"1",N1) if N1=N+1.
tu(63," ",N,64," ",N1) if N1=N+1.
tu(64,"0",N,64,"0",N1) if N1=N+1.
tu(64,"1",N,60,"0",N1) if N1=N-1.
tu(64," ",N,65," ",N1) if N1=N+1.
tu(65," ",N,66,"1",N1) if N1=N-1.
tu(65,"1",N,65,"1",N1) if N1=N+1.
tu(66,"1",N,66,"1",N1) if N1=N-1.
tu(66," ",N,67," ",N1) if N1=N-1.
tu(67,"0",N,67,"1",N1) if N1=N-1.
tu(67," ",N,59," ",N1) if N1=N+1.
tu(68,"0",N,68,"1",N1) if N1=N+1.
tu(68,"1",N,68,"1",N1) if N1=N+1.
tu(68," ",N,69," ",N1) if N1=N+1,!.
t(_,S,69) if
field_str(5,1,50,S),
field_str(6,1,3,"End"),
readchar(_),
exit.
t(N,S,Q) if
field_str(0,1,50,S),
scr_char(2,N,'^'),
str_int(St,Q),
field_str(12,0,5,St),
sym(N,S,S2),
tu(Q,S2,N,Qr,S2r,Nr),
str(S,N,S2r,Rez),
readchar(_),
scr_char(2,N,' '),
t(Nr,Rez,Qr).
start if
field_str(8,0,50," (x+y)*y "),
field_str(9,0,50,"f(x,y) = ---------"),
field_str(10,0,50," x*x "),
write("Введите начальную строку ->\n"), readln(Str),
scr_char(0,0,' '),
field_str(1,0,50," "),
t(1,Str,-1).
goal
start.
Работа программы:
Для начала работы программы необходимо запустить исполняемый файл и ввести исходное состояние ленты машины Тьюринга – через пробелы вводятся значения параметров функции:
При нажатии кнопки Enter начинается работа машины Тьюринга и после окончания её работы выводится лента машины:
на ленте после окончания деления через пробел записаны: значение параметра x, значение параметра y, значение числителя функции, значение знаменателя функции, результат функции.
Вывод: в данной лабораторной работе было произведено моделирование работы машины Тьюринга на языке Turbo Prolog. В ходе выполнения работы были получены навыки по проектирования системы команд машины для реализации вычисления значения заданной функции и её реализации.