Машина Тюрінга для опису алгоритмів

Принцип роботи машини тюрінга - математичного поняття, введеного для формального уточнення інтуїтивного поняття алгоритму. Опис алгоритмів арифметичних дій в шістнадцятковій системі числення. Правила переведення чисел з однієї системи числення в іншу.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 31.01.2014
Размер файла 1,4 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Курсова робота

З дисципліни "Теорія алгоритмів"

На тему "Машина Тюрінга для опису алгоритмів"

Зміст

  • Список скорочень
  • Вступ
    • 1. Історія розвитку машини тюрінга та принцип її використання
    • 2. Створення машини тюрінга
      • 2.1 Побудувати МТ для опису алгоритмів арифметичних дій (віднімання) в шістнадцятковій системі числення
  • 2.2 Системи числення, правила переведення чисел з однієї системи числення в іншу
  • Висновки
  • Список використаних джерел
  • Додаток
  • Список скорочень
  • МТ-(машина Тюрінга).
  • Q - осередок зберігає символ стану, а Р - осередок - символ зсуву.
  • Вступ
  • Машина Тюрінга -- це абстрактна машина (автомат), що працює зі стрічкою, що складається із окремих комірок, в яких записано символи. Машина також має голівку для запису та читання символів із комірок і яка може рухатись вздовж стрічки. На кожному кроці машина зчитує символ із комірки, на яку вказує голівка та, на основі зчитаного символу та внутрішнього стану, робиться наступний крок. При цьому, машина може змінити свій стан, записати інший символ в комірку або пересунути голівку на одну комірку ліворуч або праворуч.
  • Під час проходження курсу з дисципліни "Теорія алгоритмів" я вчився будувати Машину Тюрінга. Переводити систему числення з двійкового в десятковий та навпаки. Основною темую курсу було дослідження роботи МТ та вцілому. Принцип роботи, знаходження комірок лічильника МТ, опис МТ. Найбільш зацікавило мене те, що при виконанні практичних робіт з дисципліни "Теорія алгоритмів" можна регулувати головку лічильника машини Тюрінга, яка виконує пошук символа на стрічці. Якщо вірно знаходить потрібний символ то машина робить перехід до наступної комірки. І таким чином вона повторюється (виконується) до тих пір поки не вийде на $-стоп.
  • Як практично так і теоретично під час проходження курсу я намагався засвоїти ті елементи МТ, які допоможуть мені виконати перехід вад одної системи числення до іншої. Алгоритм дії МТ діє поетапно, тобто принцип роботи полягає у послідовності введення в МТ даних для пошуку символів. МТ можна порівняти з сейфом,тобто якщо крутити кодову ручку сейфа то можна почути "хлопки" що означають, що дана комбінація "вірна" або співпала цифра і така дія триває до тих пір поки останній замок запобіжника не розімкне коло яке блукує замок;Ось по суті МТ і працює маже по такому принципу.
  • 1. Історія розвитку машини тюрінга та принцип її використання
  • машина тюрінг алгоритм числення
  • 1. Машина Тюрінга -- математичне поняття, введене для формального уточнення інтуїтивного поняття алгоритму. Названа на честь англійського математика Алана Тюрінга, який запропонував це поняття у 1936. Аналогічну конструкцію машини згодом і незалежно від Тюрінга ввів американський математик Еміль Пост.
  • Основна ідея, що лежить в основі машини Тюрінга, дуже проста.
  • Машина Тюрінга -- це абстрактна машина (автомат), що працює зі стрічкою, що складається із окремих комірок, в яких записано символи. Машина також має голівку для запису та читання символів із комірок і яка може рухатись вздовж стрічки. На кожному кроці машина зчитує символ із комірки, на яку вказує голівка та, на основі зчитаного символу та внутрішнього стану, робиться наступний крок. При цьому, машина може змінити свій стан, записати інший символ в комірку або пересунути голівку на одну комірку ліворуч або праворуч.
  • 2. Історія виникнення Машини Тюрінга,
  • Формальні визначення алгоритму з'явилися в тридцятих-сорокових роках 20 століття. Одним із перших було визначення англійського математика Алана Тюрінга, який у 1936 році описав схему деякої гіпотетичної (абстрактної) машини і запропонував називати алгоритмами те, що вміє робити така машина. При цьому визначенні, якщо щось не може бути зроблено машиною Тюрінга, це вже не алгоритм. Інакше кажучи, Тюрінг формалізував правила виконання дій за допомогою опису роботи деякої конструкції.
  • 3. Визначення,
  • У кожної машини Тюрінга є стрічка, потенційно нескінченна в обидві сторони. Є скінченна множина символів стрічки S0, …, Sn, що називається алфавітом машини. У кожен момент часу кожна комірка може бути зайнята не більш ніж одним символом. Машина має деяку скінченну множину внутрішніх станів q0, q1, …, qn. У кожен даний момент часу машина знаходиться лише в одному із цих станів.
  • Нарешті, є голівка, яка у кожен даний момент часу знаходиться на одній із комірок стрічки. Машина діє не безупинно, а лише у дискретні моменти часу. Якщо у якийсь момент t голівка сприймає комірку (тобто знаходиться на комірці), що містить символ Si, і машина знаходиться у внутрішньому стані qj, то дія машини визначена однією із чотирьох дій,
  • 1. голівка затирає символ Si, і записує у тій же комірці новий символ Sk,
  • 2. голівка пересувається в сусідню ліву комірку,
  • 3. голівка пересувається в сусідню праву комірку,
  • 4. машина зупиняється.
  • У випадках (1)-(3) машина переходить у новий внутрішній стан qr, і готова знову до дії у наступний момент t + 1. Припустимо, що символ S0 представляє порожню комірку, і отже, голівка завжди сприймає деякий символ.
  • Перші три з можливих дій машини можуть бути описані відповідно такими упорядкованими четвірками, які називаються командами,
  • 1.
  • 2.
  • 3.
  • Тут перші два символи -- це відповідно внутрішні стани машини і сприйнятий символ, наступні три визначають дію машини (запис голівкою символу Sk, або переміщення голівки на одну комірку вліво, або переміщення голівки на одну комірку вправо) та новий стан машини. Якщо стрічка вкладена в машину Тюринга, голівка машини встановлена на одну із комірок стрічки і машина приведена в один із своїх внутрішніх станів, то машина починає оперувати на стрічці: її голівка пише і стирає символи і пересувається з однієї комірки в іншу. Якщо при цьому машина колись зупиняється, то стрічка, яка знаходиться в ній в цей момент, називається результатом застосування машини до даної стрічки.
  • Незважаючи на свій простий устрій, машина Тюрінга може виконувати складні перетворення слів. Спочатку, коли стрічка містить вхідне слово, автомат знаходиться проти деякої з комірок і у якомусь стані. У залежності від вибору початкової комірки, утворяться різні результати роботи машини Тюрінга. У процесі своєї роботи машина Тюрінга буде ніби перестрибувати з однієї комірки програми на іншу, відповідно до інформації на стрічці і вказівками в командах програми, поки не дійде до команди, яка переведе автомат у кінцевий стан.
  • 4. Можливості машини Тюрінга,
  • Багатство можливостей конструкції Тюрінга виявляється в тому, що якщо якісь алгоритми A та B реалізуються машинами Тюрінга, то можна будувати програми машин Тюрінга, які реалізують композиції алгоритмів A та B, наприклад, виконати A, потім виконати B або виконати A. Якщо в результаті утворилося слово так, то виконати B. У протилежному випадку не виконувати B або виконувати по черзі A, B, поки B не дасть відповідь ні.
  • У інтуїтивному сенсі такі композиції є алгоритмами. Тому їхня реалізація за допомогою машини Тюрінга служить одним із засобів обґрунтування універсальності конструкції Тюрінга.
  • Реалізованість таких композицій доводиться у загальному вигляді, незалежно від особливостей конкретних алгоритмів A та B. Доведення полягає в тому, що вказується засіб побудови з програм A та B програми потрібної композиції. Нехай, наприклад, потрібно побудувати машину , еквівалентну послідовному виконанню алгоритмів A та B. Поки виконується алгоритм A, у програмі працює частина A без урахування частини B. Коли алгоритм A дійде до кінця, то замість зупинки відбудеться перехід у перший стан частини B, і потім частина B буде працювати звичайним чином, наче частини A і не було.
  • Аналогічно конструюють й інші композиції машин Тюрінга; щораз будуються загальні правила: що на що змінювати у вихідних програмах.
  • Якщо пошук рішення наштовхується на перешкоду, то можна використовувати цю перешкоду для доведення неможливості рішення, спираючись на основну гіпотезу теорії алгоритмів. Якщо ж при доказі неможливості виникає своя перешкода, то вона може допомогти просунутися в пошуку рішення, хоча б частково усунувши стару перешкоду. Так, по черзі намагаючись довести то існування, то відсутність рішення, можна поступово наблизитися до розуміння суті поставленої задачі.
  • Довести тезу Тюрінга не можна, тому що в його формулюванні не визначене поняття всякий алгоритм, тобто ліва частина тотожності. Його можна тільки обґрунтувати, представляючи різноманітні відомі алгоритми у вигляді машин Тюрінга. Додаткове обґрунтування цієї тези складається в тому, що пізніше було запропоновано ще декілька загальних визначень поняття алгоритму і щораз вдавалося довести, що, хоча нові алгоритмічні схеми і виглядають інакше, вони в дійсності еквівалентні машинам Тюрінга,
  • усе, що реалізовано в одній з цих конструкцій, можна зробити і в інших
  • Ці твердження доводяться строго, тому що в них мова йде вже про тотожність формальних схем.
  • Лямбда-числення, або л-числення -- формальна система, що використовується в теоретичній кібернетиці для дослідження визначення функції, застосування функції, та рекурсії. Це числення було запропоноване Алонсо Черчем та Стівеном Кліні в 1930-ті роки, як частина більшої спроби розробити базис математики на основі функцій, а не множин (задля уникнення таких перешкод, як Парадокс Рассела). Однак, Парадокс Кліні-Россера демонструє, що лямбда числення не здатне уникнути теоретико-множинних парадоксів. Не зважаючи на це, лямбда числення виявилось зручним інструментом в дослідженні обчислюваності функцій, та лягло в основу парадигми функціонального програмування. Лямбда числення може розглядатись як ідеалізована, мінімалістича мова програмування, в цьому сенсі лямбда числення подібне до машини Тюринга, іншої мінімалістичної абстракції, здатної визначати будь-який алгоритм. Відмінність між ними полягає в тому, що лямбда числення відповідає функціональній парадигмі визначення алгоритмів, а машина Тюринга, натомість -- імперативній. Тобто, машина Тюринга має певний "стан" -- перелік символів, що можуть змінюватись із кожною наступною інструкцією. На відміну від цього, лямбда числення уникає станів, воно має справу з функціями, котрі отримують значення параметрів та повертають результати обчислень (можливо, інші функції), але не спричиняють до зміни вхідних даних (сталість).
  • Ядро л-числення грунтується трохи більше ніж на визначені змінних, області видимості змінних та впорядкованому заміщенні змінних виразами. л-числення є замкненою мовою, тобто, семантика мови може бути визначена на основі еквівалентності виразів (або термів) самої мови.
  • Вони не такі складні, як здаються на перший погляд. Просто треба трохи звикнути до префіксної форми запису. Більше немає ні інфіксних (), ні постфіксних (x2) операцій. Крім того, аргументи функцій просто записуються в список після функції, розділені пропуском. Тому, всюди де математики пишуть sin(x) в лямбда-численні пишуть sin x (хоча математики самі часто грішать опусканням дужок. Програмісти в цьому плані культурніші). Так само замість пишуть , а замість x2 - .
  • 2. Створення машини тюрінга
  • 2.1 Побудувати МТ для опису алгоритмів арифметичних дій (віднімання) в шістнадцятковій системі числення
  • Арифметичні операції у всіх позиційних системах обчислення виконуються за одними і тими ж правилами:
  • - переповнювання розряду наступає тоді, коли значення числа в ньому стає рівним або завбільшки основи;
  • - складання багаторозрядних чисел відбувається з урахуванням можливих перенесень з молодших розрядів в старші;
  • - віднімання багаторозрядних чисел відбувається з урахуванням можливих заїмок в старших розрядах;
  • - множення багаторозрядних чисел відбувається з послідовним множенням множеного на чергову цифру множника;
  • - перенесення в наступний розряд при складанні і заїмка із старшого розряду при відніманні визначається величиною основи системи обчислення;
  • - для проведення арифметичних операцій над числами, представленими в різних системах обчислення, необхідно заздалегідь перевести їх в одну систему.
  • Складання
  • В основі складання двійкової системи обчислення лежить таблиця складання однорозрядних двійкових чисел:
  • 0 + 0 = 00
  • 0 + 1 = 01
  • 1 + 0 = 01
  • 1 + 1 = 10
  • Як приклад складемо в стовпчик двійкові числа 1102 і 112.
  • 1102
  • +
  • 112
  • ______
  • 10012
  • Віднімання
  • Розглянемо віднімання двійкових чисел. В основі лежить таблиця віднімання однозначних двійкових чисел. При відніманні з меншого числа (0) більшого (1) проводиться заїмка із старшого розряду (в таблиці заімки позначена 1 з межею):
  • 13
  • 0 - 0 = _0
  • 0 - 1 = 11
  • 1 - 0 = 01
  • 1 - 1 = 00
  • Як приклад проведемо віднімання двійкових чисел 1102 і 112.
  • 1102
  • -
  • 112
  • _____
  • 112
  • Множення
  • В основі множення лежить таблиця множення однозначних чисел:
  • 0 · 0 = _0
  • 0 · 1 = 11
  • 1 · 0 = 01
  • 1 · 1 = 0
  • Як приклад проведемо множення двійкових чисел 1102 і 112.
  • 1102
  • х
  • 112
  • ______
  • 110
  • 110
  • _________
  • 100102
  • Ділення
  • Як приклад проведемо розподіл числа 1102 на 112.
  • Аналогічно, можна виконувати арифметичні дії у вісімковій і шістнадцятковій системах обчислення.
  • 2.2 Системи числення, правила переведення чисел з однієї системи числення в іншу
  • Системою числення назива.ться сукупн.сть правил запису чисел. Системи числення
  • п.дрозд.ляються на позиційні і непозиційні. Як позиційні, так і непозиційні системи числення використовують певний набір символів - цифр, послідовне поєднання яких утворю. число. Непозиційні системи числення характеризуються тим, що в них символи, що позначають те або інше число, не змінюють свого значення залежно від місцеположення в записі цього числа.
  • Класичним прикладом такої системи числення і римська. В н.й для запису чисел використовуються букви латинського алфав.ту. При цьому буква I означає одиницю, V - п'ять, Х - десять, L - п'ятдесят, C- сто, D - п'ятсот, M - тисячу. Для отримання кількісного
  • МТ- це машина, яка працює поверх стрічки, яка складається з довгого ряду маленьких клітин, кожна з яких має окремий символ, написані на ній. Машина головок читання / запису, що рухається по стрічці, і який може зберігати декілька біт інформації. Кожен крок, машина дивиться на символ на клітинку під стрічкою голову, і на підставі, що машина бачить там, і все, що трохи інформації, яку вона зберігає, і вирішує, що робити.
  • Далі нижче буде наведено принцип роботи машини Тюрінга.
  • Здвиг праворуч: [ {1}1111111-111= ]"
  • Здвиг праворуч: [ 1{1}111111-111= ]"
  • Здвиг праворуч: [ 11{1}11111-111= ]"
  • Здвиг праворуч: [ 111{1}1111-111= ]"
  • Здвиг праворуч: [ 1111{1}111-111= ]"
  • Здвиг праворуч: [ 11111{1}11-111= ]"
  • Здвиг праворуч: [ 111111{1}1-111= ]"
  • Здвиг праворуч: [ 1111111{1}-111= ]"
  • Здвиг праворуч: [ 11111111{-}111= ]"
  • Здвиг праворуч: [ 11111111-{1}11= ]"
  • Здвиг праворуч: [ 11111111-1{1}1= ]"
  • Здвиг праворуч: [ 11111111-11{1}= ]"
  • Здвиг праворуч: [ 11111111-111{=} ]"
  • Здвиг ліворуч: [ 11111111-11{1} ]"
  • Здвиг ліворуч: [ 11111111-1{1}= ]"
  • Здвиг ліворуч: [ 11111111-{1}1= ]"
  • Здвиг ліворуч: [ 11111111{-}11= ]"
  • Перевірка: [ 1111111{1}-11= ]"
  • Здвиг праворуч: [ 1111111 {-}11= ]"
  • Здвиг праворуч: [ 1111111 -{1}1= ]"
  • Здвиг праворуч: [ 1111111 -1{1}= ]"
  • Здвиг праворуч: [ 1111111 -11{=} ]"
  • Здвиг ліворуч: [ 1111111 -1{1} ]"
  • Здвиг ліворуч: [ 1111111 -{1}= ]"
  • Здвиг ліворуч: [ 1111111 {-}1= ]"
  • Перевірка: [ 1111111{ }-1= ]"
  • Перевірка: [ 111111{1} -1= ]"
  • Здвиг праворуч: [ 111111 { }-1= ]"
  • Здвиг праворуч: [ 111111 {-}1= ]"
  • Здвиг праворуч: [ 111111 -{1}= ]"
  • Здвиг праворуч: [ 111111 -1{=} ]"
  • Перевірка: [ 111111 -{1} ]"
  • Вихід на мінус: [ 111111 {-}= ]"
  • Перевірка: [ 111111 { }-= ]"
  • Перевірка: [ 111111{ } -= ]"
  • Перевірка: [ 11111{1} -= ]"
  • Здвиг праворуч: [ 11111 { } -= ]"
  • Здвиг праворуч: [ 11111 { }-= ]"
  • Здвиг праворуч: [ 11111 {-}= ]"
  • Здвиг праворуч: [ 11111 -{=} ]"
  • Вихід на мінус : [ 11111 {-} ]"
  • Кінець: [ 11111 { }- ]"
  • Машина Тьюрінга
  • Одне з уточнень понять алгоритму було дано Е. Постом і А. Тьюрінгом незалежно один від одного в 1936-1937гг. Основна думка їх полягала в тому, що алгоритмічні процеси - це процеси, які може здійснити відповідним чином влаштована "машина". Ними були описані гіпотетичні (умовні) пристрої, які отримали назву "Машина Поста" і "Машина Тьюрінга" (МТ). Так як в них багато спільного, то розглянемо тільки машину Тьюрінга.
  • Машина Тьюрінга складається з наступних частин:
  • 1. Інформаційної стрічки, що представляє нескінченну пам'ять машини. Це нескінченна стрічка, розділена на осередки. У кожній клітинці можна помістити лише один символ з можливого їх безлічі S = {S 1, S 2, ...., S m}, яка складає зовнішній алфавіт МТ. У цьому алфавіті один з символів (нехай це буде S 1) відповідає порожньому символу.
  • 2. Голівки, що зчитує - чутливого спеціального елемента, здатного оглядати вміст комірок. Стрічка може переміщатися уздовж головки так, що в кожний момент часу головка оглядає одну клітинку.
  • 3. Керуючого пристрою (УУ), яке в кожний момент часу знаходиться в деякому стані. Число станів звичайно. Позначимо множину станів як {q 1, q 2, ..., q n}. Серед станів одне відповідає заключного, при якому МТ зупиняється. УУ пов'язано зі зчитування голівкою.
  • Крім того, УУ виробляє три команди на переміщення стрічки: П, Л, Н, де П - переміститися на сусідню праворуч осередок; Л - переміститися сусідню зліва осередок; Н - продовжувати оглядати ту ж комірку.
  • Сукупність символів {q 1, q 2, ..., q n} і {П, Л, Н} утворюють внутрішній алфавіт МТ.
  • Робота машини відбувається в дискретному часі. У початковий момент часу в обмежений ділянка стрічки записано слово в алфавіті S, що представляє вихідна умова завдання. В інших осередках передбачається записаним порожній символ. Керуючий пристрій знаходиться в початковому стані q 1. На кожному кроці роботи МТ оглядає на стрічці символ S k і залежно від нього і від стану q i, переходить в стан q j, замінює S k на символ S l і пересуває стрічку (або ні) на одну клітинку.
  • Кожна елементарна операція має вигляд
  • q i S k ® q j S l П (Л, Н).
  • Безліч елементарних операцій впорядковано і утворить абстрактну програму, яка представляє алгоритм. Зчитує головка і керуючий пристрій утворюють логічний блок, який представляє собою (2,3)-полюснік.
  • SHAPE \ * MERGEFORMAT S k
  • S 1
  • ЛБ
  • q i
  • q j
  • {П, Л, Н}
  • Структура МТ має наступний вигляд:
  • S 1

    S 2

    ...

    S k

    ...

    S m

    • Q
    • P
    • S l
    • S k
    • q i
    • q j
    • П (Л, Н)
    • У них відбувається затримка даних символів до початку наступного такту.
    • В якості початкової інформації на стрічку можна записати будь-яку кінцеву послідовність символів (вхідний слово) U зовнішнього алфавіту. На початку роботи алгоритму пристрій управління знаходиться в початковому стані, головка оглядає перший зліва непорожній символ вхідного слова U. Якщо після кінцевого числа тактів МТ зупиняється, переходячи в заключне стан, а на стрічці виявляється інформація B, то кажуть, що машина застосовна до послідовності U і переробляє її в послідовність B.
    • Якщо зупинка і сигнал про зупинку ніколи не надходять, то говорять, що МТ не може бути застосована до послідовності U.
    • Розглянемо функціонування МТ на прикладі складання двох чисел, які будемо зображати у вигляді набору одиниць.
    • Зовнішній алфавіт буде складатися з символів: {1, +, U}, де U - порожній символ.
    • Внутрішній алфавіт буде складатися з чотирьох символів {q 1, q 2, q 3,!}, Де символ q 1 означає початковий стан, а! - Заключне стан.
    • Нехай на стрічці записана початкова інформація:
    • Абстрактна програма, що реалізує операцію складання, буде мати вигляд:
    • 5. Основна гіпотеза теорії алгоритмів (теза Черча),
    • Всякий алгоритм може бути заданий за допомогою Тюрінгової функціональної схеми і реалізований у відповідній машині Тюрінга.
    • Обґрунтування гіпотези.
    • Мова не йде про доведення гіпотези, так як вона містить не формалізовані математичні поняття.
    • Впевненість у справедливості гіпотези заснована, головним чином, на досвіді. Усі відомі до цього часу алгоритми можуть бути задані за допомогою тьюрінгових функціональних схем. Крім того, всередині самої теорії алгоритмів основна гіпотеза не застосовується, тобто при доказі теорем цієї теорії посилань на основну гіпотезу не робиться.
    • Машина Тюрінга вкрай примітивна. Але примітивність її не в тому, що вона використовує стрічку і механічний рух голівки, а те, що її набір операцій з пам'яттю дуже простий (запис і читання символів), а доступ до пам'яті в ній відбувається не за адресою, а шляхом послідовного переміщення уздовж стрічки. Тому виконання на ній навіть таких простих функцій як складання і множення вимагає багато кроків. Машина Тьюрінга була придумана не для того, щоб виробляти на ній реальні обчислення, а щоб показати, що як завгодно складний алгоритм можна побудувати з дуже простих операцій, причому самі операції і перехід від однієї операції до іншої виконуються автоматично.
    • 6. Універсальна машина Тюрінга,
    • Універсальна машина дозволяє вирішити будь-яке завдання, якщо поряд з вихідними даними в неї записати алгоритм. Як і будь-яка машина Тьюрінга, універсальна машина повинна мати кінцеві зовнішній і внутрішній алфавіти, в той же час вона повинна мати можливість приймати у якості зовнішнього алфавіту будь-які алфавіти. Це досягається за рахунок кодування зовнішнього алфавіту в алфавіті універсальної машини Тюрінга.
    • Вимоги до кодування:
    • 1. різним буквах повинні зіставлятися різні кодові групи, і одна і та ж буква скрізь замінюється однієї і тієї ж кодової групою;
    • 2. Рядок тексту повинна однозначним чином розбиватися на кодові групи.
    • Складність універсальної машини Тюрінга визначається твором числа символів її зовнішнього алфавіту на число станів пристроєм управління.
    • Теорема Триттера визначає, що мінімальна універсальна машина Тюрінга має 4 символу в зовнішньому алфавіті та її УУ має 6 станів.
    • Застережні СКЛАДНОСТІ Алгоритм
    • Оцінка алгоритму
    • Оцінка алгоритму буває потрібною в тому випадку, коли при вирішенні деякої задачі є кілька різних алгоритмів, і стоїть завдання вибору одного з них для реалізації. Навіть якщо завдання вирішується єдиним алгоритмом, буває потрібно оцінити складність його реалізації і його роботи (обсяг пам'яті, час рішення).
    • Під просторової ефективністю розуміють обсяг пам'яті, необхідної для виконання програми.
    • Тимчасова ефективність програми визначається часом, необхідним для її виконання. При цьому необхідно враховувати наступні моменти.
    • По-перше, час роботи програми може обмежуватися її призначенням. Якщо ця програма реального часу, наприклад, бронювання авіаквитків, то час обробки завдання не повинно перевищувати декількох хвилин. Якщо ця програма автоматичного управління будь-яким пристроєм (наприклад, управлінням літака), то вона повинна "встигати" відпрацьовувати надходить, і своєчасно видавати керуючі впливу.
    • По-друге, буває важливо знати, як змінюється час роботи програми при збільшенні розмірності задачі. Це дозволить оцінити обсяг вихідних даних, які можуть бути оброблені на комп'ютері за прийнятний час.
    • Реальний час роботи програми на комп'ютері залежить не тільки від вибраного алгоритму. Значною мірою воно визначається типом ЕОМ, структурою подання даних, програмною реалізацією.
    • Найпростішим способом оцінити алгоритм - зіставити йому число елементарних операцій в описі. При реалізації це може бути кількість команд у програмі або обсяг пам'яті, яку займає програма. У цьому випадку оцінка d алгоритму A є деяке число k:
    • d (A) = k.
    • Більш цікавою може бути оцінка пари: алгоритму A і конкретного завдання a, яка їм вирішується. Наприклад, оцінкою може бути обсяг пам'яті під програму, вихідні та проміжні дані, необхідні для вирішення даної задачі a, або час для вирішення цього завдання з допомогою алгоритму A. У будь-якому випадку це буде число d (A (a)) = k (a).
    • Властивість масовості алгоритму припускає, що алгоритм буде використовуватися для вирішення класу A подібних завдань, з різними вихідними даними. Тому більш складною оцінкою буде оцінка як функція властивості завдання. Cопоставім кожній задачі з класу задач, що розв'язуються алгоритмом, деякий вектор числових параметрів задачі N = (n1, n2, ..., nt). У цьому випадку оцінка d (A (A)) = k (N), і це вже буде функція від параметрів задачі.
    • Приклад. Необхідно цінувати алгоритм Прима - алгоритм виділення мінімального кістяка. У першому випадку ми розглядаємо число операторів в описі програми, що реалізує алгоритм - число порівнянь, умовних переходів і т.д. У другому випадку аналізується робота алгоритму (програми) виділення кістяка деякого заданого графа і визначається необхідний обсяг пам'яті. В останньому випадку графу припишемо параметри - число вершин у графі і число його ребер, і можна порівняти вирішення завдання функцію від цих параметрів.
    • У багатьох завданнях можливо звести вектор завдання до одного параметру. Так, для графа можливо характеризувати його числом вершин, враховуючи, що число ребер у ньому корельовано з кількістю вершин. Для завдань, пов'язаних з булевими функціями, параметром може бути число аргументів функції.
    • Будемо розглядати тільки такі завдання. У цьому випадку оцінкою алгоритму буде функція від одного параметра. Тимчасова складність алгоритму відображає потрібні для його роботи витрати часу Ця функція вставить кожної вхідний довжині n у відповідність максимальна (за всіма індивідуальним завданням довжини n) час, що витрачається алгоритмом на вирішення індивідуальних завдань цієї довжини.
    • Приклад. Нехай функція оцінки має вигляд як на мал.1. Необхідно вирішувати задачі з параметром n, що лежить в межах від 5 до 15. У цьому випадку необхідно вибрати для реалізації алгоритм A1. Якщо параметр змінюється від 20 до 30, краще використовувати алгоритм A2. Якщо параметр змінюється в межах від 10 до 35, то можливо або вибрати будь-який з даних алгоритмів, або побудувати новий алгоритм, який, наприклад, перевіряє кожен раз значення параметра і вибирає відповідний алгоритм.
    • Висновки
    • Під час проходження курсу з дисципліни "Теорія алгоритмів" я вчився будувати Машину Тюрінга. Переводити систему числення з двійкового в десятковий та навпаки. Основною темую курсу було дослідження роботи МТ та вцілому. Принцип роботи, знаходження комірок лічильника МТ, опис МТ. Найбільш зацікавило мене те, що при виконанні практичних робіт з дисципліни "Теорія алгоритмів" можна регулувати головку лічильника машини Тюрінга, яка виконує пошук символа на стрічці. Якщо вірно знаходить потрібний символ то машина робить перехід до наступної комірки. І таким чином вона повторюється (виконується) до тих пір поки не вийде на $-стоп.
    • Як практично так і теоретично під час проходження курсу я намагався засвоїти ті елементи МТ, які допоможуть мені виконати перехід вад одної системи числення до іншої. Алгоритм дії МТ діє поетапно, тобто принцип роботи полягає у послідовності введення в МТ даних для пошуку символів. МТ можна порівняти з сейфом,тобто якщо крутити кодову ручку сейфа то можна почути "хлопки" що означають, що дана комбінація "вірна" або співпала цифра і така дія триває до тих пір поки останній замок запобіжника не розімкне коло яке блукує замок;Ось по суті МТ і працює маже по такому принципу.
    • Список використаних джерел
    • 1. Енциклопедія кібернетики, т. 2, с. 444--446.
    • 2. Good Math, Basics: The Turing Machine (with an interpreter!), 9 лютого 2007.
    • 3. Henk Barendregt 2007.
    • 4. Kluge 2005, сторінка 51.
    • 5. Raul Rojas, A Tutorial Introduction to the Lambda Calculus(англ.) -(PDF)
    • 6. Wolfengagen, V.E. Combinatory logic in programming. Computations with objects through examples and exercises. -- 2-nd ed. -- M.: "Center JurInfoR" Ltd., 2003. -- x+337 с. ISBN 5-89158-101-9.
    • 7. Навчальний проект з курсу "Основи програмування": Машина Тюрінга.
    • 8. Рощин А.Г., статевої Р.М. Теорія автоматів. Частина I. Тексти лекцій - Москва: МГТУ ГА, 2008. - 76 с.
    • 9. Фалевіч Б.Я. Теорія алгоритмів. - М.: ИНФРА-М, 2010. - С.324.
    • 10. Фаліна М.М. Машина Тьюрінга / / Інформатика. - № 26. - 2005. - С.12-15
    • 11. Теорія алгоритмів Методичний посібник з дисципліни "Математична логіка і теорія алгоритмів" / В.П. Бітюцький, Н.В. Папуловская. Єкатеринбург: ГОУ ВПО УГТУ-УПІ, 2009, с.
    • Додаток
    • У додатку буде представлено Англомовну версію машини Тюрінга. Де буде поетапно описано усі кроки виконання дії машини Тюрінга.
    • Basics: The Turing Machine (with an interpreter!)
    • Category: Basics * Haskell * Programming * programming
    • Posted on: February 3, 2007 6:38 PM, by Mark C. Chu-Carroll
    • As long as I'm doing all of these basics posts, I thought it would be worth explaining just what a Turing machine is. I frequently talk about things being Turing equivalent, and about effective computing systems, and similar things, which all assume you have some clue of what a Turing machine is. And as a bonus, I'm also going to give you a nifty little piece of Haskell source code that's a very basic Turing machine interpreter. (It's for a future entry in the Haskell posts, and it's not entirely finished, but it does work!)
    • The Turing machine is a very simple kind of theoretical computing device. In fact, it's almost downright trivial. But according to everything that we know and understand about computation, this trivial device is capable of any computation that can be performed by any other computing device.
    • The basic idea of the Turing machine is very simple. It's a machine that runs on top of a tape, which is made up of a long series of little cells, each of which has a single character written on it. The machine is a read/write head that moves over the tape, and which can store a little bit of information. Each step, the machine looks at the symbol on the cell under the tape head, and based on what it sees there, and whatever little bit of information it has stored, it decides what to do. The things that it can do are change the information it has store, write a new symbol onto the current tape cell, and move one cell left or right.
    • That's really it. People who like to make computing sound impressive often have very complicated explanations of it - but really, that's all there is to it. The point of it was to be simple - and simple it certainly is. And yet, it can do anything that's computable.
    • To really understand how that trivial machine can do computations, it helps to be a bit formal. In formal terms, we talk about a turing machine as a tuple: (S, s0, A, T), where:
    • S is a finite list of possible states that the machine can be in. The state is the information that the machine can store in the head to make decisions. It's a very limited amount of information; you can think of it as either a specific list of states, or a small set of small numbers. For most Turing machines, we'll use it as a specific list of states. (You'll see what I mean in a minute.)
    • s0 ? S is the initial state - the state that the machine will be in when it starts a computation.
    • A is the machine's alphabet, which is the set of symbols which can appear on the machine's tape.
    • T is the machines transition function. This is the real heart of the machine, where the computation is defined. It's a function from the machine state and the alphabet character on the current tape cell to the action that the machine should take. The action is a triple consisting of a new value for the machine's state, a character to write onto the current tape cell, and a direction to move the tape head - either left or right.
    • So, for example, let's look at a simple machine. This is one of the classic examples: a Turing machine that does subtraction using unary numbers. A unary number "N" is written as a series of N 1s. For the program, we'll give the machine an input in the format "N-M=" written onto the tape; after running the machine, the tape will contain the value of M subtracted from N. So, for example, we could use "1111-11=" as an input; the output would be "11".
    • The alphabet is the characters "1", " " (blank space), "-" (minus sign), and "=" (equal sign). The machine has four states: {"scanright", "eraseone", "subone", "skip"}. It starts in the state "scanright". It's transition function is given by the following table:FromState Symbol ToState WriteChar Dir
    • scanright space scanright space right
    • scanright 1 scanright 1 right
    • scanright minus scanright minus right
    • scanright equal eraseone space left
    • eraseone 1 subone equal left
    • eraseone minus HALT space n/a
    • subone 1 subone 1 left
    • subone minus skip minus left
    • skip space skip space left
    • skip 1 scanright space right
    • What this machine does is move to the right until it sees the equal sign; it erases the equal sign and moves to the left, erases one digit off of the second number, and replaces it with the equal sign (so the second number is reduced by one, and the equal sign is moved over one position). Then it scans back to the minus sign (which separates the two numbers), and erases one digit of the first number, and then switches back to scanning to the right for the equal. So one at a time, it erases one digit from each of the two numbers. When it reaches the equal sign, and starts going back to erase a digit from the second number, and hits the "-" before it finds a digit, that means its done, so it stops. Let's look at a simple execution trace. In the trace, I'll write the machine state, followed by a colon, followed by the tape contents surrounded by "[]", with the current tape cell surrounded by "{}".
    • scanright: [ {1}1111111-111= ]"
    • scanright: [ 1{1}111111-111= ]"
    • scanright: [ 11{1}11111-111= ]"
    • scanright: [ 111{1}1111-111= ]"
    • scanright: [ 1111{1}111-111= ]"
    • scanright: [ 11111{1}11-111= ]"
    • scanright: [ 111111{1}1-111= ]"
    • scanright: [ 1111111{1}-111= ]"
    • scanright: [ 11111111{-}111= ]"
    • scanright: [ 11111111-{1}11= ]"
    • scanright: [ 11111111-1{1}1= ]"
    • scanright: [ 11111111-11{1}= ]"
    • scanright: [ 11111111-111{=} ]"
    • eraseone : [ 11111111-11{1} ]"
    • subone : [ 11111111-1{1}= ]"
    • subone : [ 11111111-{1}1= ]"
    • subone : [ 11111111{-}11= ]"
    • skip : [ 1111111{1}-11= ]"
    • scanright: [ 1111111 {-}11= ]"
    • scanright: [ 1111111 -{1}1= ]"
    • scanright: [ 1111111 -1{1}= ]"
    • scanright: [ 1111111 -11{=} ]"
    • eraseone : [ 1111111 -1{1} ]"
    • subone : [ 1111111 -{1}= ]"
    • subone : [ 1111111 {-}1= ]"
    • skip : [ 1111111{ }-1= ]"
    • skip : [ 111111{1} -1= ]"
    • scanright: [ 111111 { }-1= ]"
    • scanright: [ 111111 {-}1= ]"
    • scanright: [ 111111 -{1}= ]"
    • scanright: [ 111111 -1{=} ]"
    • eraseone : [ 111111 -{1} ]"
    • subone : [ 111111 {-}= ]"
    • skip : [ 111111 { }-= ]"
    • skip : [ 111111{ } -= ]"
    • skip : [ 11111{1} -= ]"
    • scanright: [ 11111 { } -= ]"
    • scanright: [ 11111 { }-= ]"
    • scanright: [ 11111 {-}= ]"
    • scanright: [ 11111 -{=} ]"
    • eraseone : [ 11111 {-} ]"
    • Halt: [ 11111 { }- ]"
    • See, it works!
    • One really important thing to understand here is that we do not have a program. What we just did was define a Turing machine that does subtraction. The machine does not take any instructions: the states and the transition function are an intrinsic part of the machine. So the only thing this machine can do is to subtract.
    • The real genius of Turing wasn't just defining this simple computing machine. It was realizing the concept of the program: you could design a Turing machine whose input tape contained a description of a Turing machine - that is a program - followed by an input to the program. This single machine - the Universal Turing machine - could simulate any other Turing machine; one machine which could perform any computation.
    • Turing machines are a lot of fun to play with. Figuring out how to do things can be fascinating. Figuring out how to define a Universal turing machine's transition function is an amazing thing to do; it's astonishing how simple the universal machine can be!
    • For your enjoyment, I've implemented a Turing machine programming language. You feed it a Turing machine description, and an input string, and it will give you a trace of the machines execution like the one above. Here's the specification of the subtraction machine written in my little Turing language:
    • states { "scanright" "eraseone" "subtractOneFromResult" "skipblanks" } initial "scanright"
    • alphabet { '1' ' ' '=' '-' } blank ' '
    • trans from "scanright" to "scanright" on (' ') write ' ' move right
    • trans from "scanright" to "scanright" on ('1') write '1' move right
    • trans from "scanright" to "scanright" on ('-') write '-' move right
    • trans from "scanright" to "eraseone" on ('=') write ' ' move left
    • trans from "eraseone" to "subtractOneFromResult" on ('1') write '=' move left
    • trans from "eraseone" to "Halt" on ('-') write ' ' move left
    • trans from "subtractOneFromResult" to "subtractOneFromResult" on ('1') write '1' move left
    • trans from "subtractOneFromResult" to "skipblanks" on ('-') write '-' move left
    • trans from "skipblanks" to "skipblanks" on (' ') write ' ' move left
    • trans from "skipblanks" to "scanright" on ('1') write ' ' move right
    • I think it's pretty clear as a syntax, but it still needs explanation.
    • The first line declares the possible states of the machine, and what state it starts in. This machine has four possible states - "scanright", "eraseone", "subtractOneFromResult", and "skipblanks". When the machine starts, it will be in the state "skipright". The second line declares the set of symbols that can appear on the tape, including what symbol will initially appear on any tape cell whose value wasn't specified by the input. For this machine the symbols are the digit 1, a blank space, the equal sign, and the subtraction symbol; the blank symbol is on any tape cell whose initial value wasn't specified. After that is a series of transition declarations. Each declaration specifies what the machine will do for a given pair of initial state and tape symbol. So, for example, if the machine is in state "scanright", and the current tape cell contains the equal-to sign, then the machine will change to state "eraseone", write a blank onto the tape cell (erasing the "=" sign), and move the tape cell one position to the left.
    • Finally, the code. You'll need GHCI to run it; at the moment, it won't work in Hugs (I don't have the parsing library in my version of Hugs), and I haven't worked out the linkage stuff to make it work under the GHC compiled mode.
    • --
    • -- A Simple Turing machine interpreter
    • -- Copyright 2007 by Mark C. Chu-Carroll
    • -- markcc@gmail.com
    • -- http://scienceblogs.com/goodmath
    • --
    • -- You can do anything you want with this code so long as you
    • -- leave this copyright notice intact.
    • --
    • module Turing where
    • import Text.ParserCombinators.Parsec
    • import qualified Text.ParserCombinators.Parsec.Token as P
    • import Text.ParserCombinators.Parsec.Language
    • import System.Environment
    • data Motion = MoveLeft | MoveRight deriving (Show)
    • data Transition = Transition String String [Char] Motion Char deriving (Show)
    • -- from to on move write
    • data TuringMachine = Machine [String] String [Char] Char [Transition] deriving (Show)
    • -- states initial alphabet blank transitions
    • data MachineState = TMState [Char] Char [Char] String deriving (Show)
    • -- tape-left curcell curstate
    • getBlankSym :: TuringMachine -> Char
    • getBlankSym (Machine _ _ _ bl _) = bl
    • findMatchingTransition :: [Transition] -> String -> Char -> Maybe Transition
    • findMatchingTransition [] _ _ = Nothing
    • findMatchingTransition translist state c =
    • let matches = filter (transitionMatches state c) translist
    • in case matches of
    • [] -> Nothing
    • t:[] -> Just t
    • _ -> error "Ambiguous transition"
    • where transitionMatches state c (Transition from to on move write) =
    • (from == state) && (elem c on)
    • runTransition :: TuringMachine -> [Char] -> Char -> [Char] -> String -> Transition -> MachineState
    • runTransition m (l:left) c right state (Transition from tostate on MoveLeft write) =
    • TMState left l (write:right) tostate
    • runTransition m left c [] state (Transition from tostate on MoveRight write) =
    • TMState (write:left) (getBlankSym m) [] tostate
    • runTransition m left c (r:right) state (Transition from tostate on MoveRight write) =
    • TMState (write:left) r right tostate
    • stepMachine :: TuringMachine -> MachineState -> MachineState
    • stepMachine machine@(Machine _ _ _ _ translist) st@(TMState tapeleft c taperight state) =
    • let trans = findMatchingTransition translist state c
    • in case trans of
    • (Just t) -> runTransition machine tapeleft c taperight state t
    • Nothing -> error "No applicable transition from state"
    • getMachineStateString (TMState left c right state) =
    • (state ++ ":[" ++ (reverse left) ++ "{" ++ [c] ++ "}" ++ right ++ "]")
    • runTracedMachine :: TuringMachine -> [Char] -> [String]
    • runTracedMachine tm@(Machine states initial alphabet blank transitions) (t:tape) =
    • runTracedMachineSteps tm (TMState [] t tape initial) where
    • runTracedMachineSteps machine state =
    • let newstate@(TMState left c right st) = stepMachine machine state
    • in if st == "Halt"
    • then [getMachineStateString newstate]
    • else let trace=runTracedMachineSteps machine newstate
    • in ((getMachineStateString newstate):trace)
    • runMachine :: TuringMachine -> [Char] -> [Char]
    • runMachine tm@(Machine states initial alphabet blank transitions) (t:tape) =
    • runMachineSteps tm (TMState [] t tape initial) where
    • runMachineSteps machine state =
    • let newstate@(TMState left c right st) = stepMachine machine state
    • in if st == "Halt"
    • then (concat [(reverse left), [c], right])
    • else runMachineSteps machine newstate
    • ---------------------------------------------------------------------------
    • -- Parsing code - implemented using the Parsec monadic parser library.
    • ---------------------------------------------------------------------------
    • -- Basic setup stuff - use a standard haskell style lexer; set up the reserved words
    • -- and symbols in the lexer.
    • lexer :: P.TokenParser ()
    • lexer = P.makeTokenParser (haskellDef
    • {P.reservedNames = ["states","alphabet","trans","from","to","on","write","move","left","right","initial","blank"]})
    • reserved = P.reserved lexer
    • symbol = P.symbol lexer
    • braces = P.braces lexer
    • parens = P.parens lexer
    • charlit = P.charLiteral lexer
    • strlit = P.stringLiteral lexer
    • ident = P.identifier lexer
    • whitespace = P.whiteSpace lexer
    • states = reserved "states"
    • alphabet = reserved "alphabet"
    • trans = reserved "trans"
    • from = reserved "from"
    • to = reserved "to"
    • on = reserved "on"
    • write = reserved "write"
    • move = reserved "move"
    • initial = reserved "initial"
    • blank = reserved "blank"
    • left = do { reserved "left"
    • ; return MoveLeft
    • }
    • right = do { reserved "right"
    • ; return MoveRight
    • }
    • -- statesDecl ::= "states" "{" strlit+ "}" "initial" strlit
    • statesDecl = do { states
    • ; strlst <- braces (many1 strlit)
    • ; initial
    • ; i <- strlit
    • ; return (i,strlst)
    • }
    • -- alphaDecl ::= "alphabet" "{" charlit+ "}" "blank" charlit
    • alphaDecl = do { alphabet
    • ; charlst <- braces (many1 charlit)
    • ; blank
    • ; bl <- charlit
    • ; return (bl, charlst)
    • }
    • -- transDecl ::= "trans" "from" strlit "to" strlit "on" "(" charlit+ ")" "write" charlit "move" ("left" | "right")
    • transDecl = do { trans
    • ; from
    • ; fromState <- strlit
    • ; to
    • ; targetState <- strlit
    • ; on
    • ; chrs <- parens (many1 charlit)
    • ; write
    • ; wrchar <- charlit
    • ; move
    • ; dir <- ( left <|> right)
    • ; return (Transition fromState targetState chrs dir wrchar)
    • }
    • -- machine ::= statesDecl alphaDecl transDecl+
    • machine = do { (i,sts) <- statesDecl
    • ; (bl,alpha) <- alphaDecl
    • ; trans <- many1 transDecl
    • ; return (Machine sts i alpha bl trans)
    • }
    • run :: (Show a) => Parser a -> String -> IO a
    • run p input
    • = case (parse p "" input) of
    • Left err -> do{ putStr "parse error at "
    • ; print err
    • ; error "Parse error"
    • }
    • Right x -> return x
    • runTParser :: String -> IO TuringMachine
    • runTParser input =
    • run (do { whitespace
    • ; x <- machine
    • ; eof
    • ; return x }) input
    • --------------------------------------------------------------------------
    • -- A sample Turing program - first in the comment, and then coded into
    • -- a string literal, to make it easy to run tests. This sample program
    • -- is a basic Turing subtract - it takes a unary equation "111111-111=",
    • -- and leaves the result of subtracting the second from the first.
    • --
    • -- states { "one" "two" "three" "four" } initial "one"
    • -- alphabet { '1' ' ' '=' '-' } blank ' '
    • -- trans from "one" to "one" on (' ') write ' ' move right
    • -- trans from "one" to "one" on ('1') write '1' move right
    • -- trans from "one" to "one" on ('-') write '-' move right
    • -- trans from "one" to "two" on ('=') write ' ' move left
    • -- trans from "two" to "three" on ('1') write '=' move left
    • -- trans from "two" to "Halt" on ('-') write '-' move left
    • -- trans from "three" to "three" on ('1') write '1' move left
    • -- trans from "three" to "four" on ('-') write '-' move left
    • -- trans from "four" to "four" on (' ') write ' ' move left
    • -- trans from "four" to "one" on ('1') write ' ' move right
    • sampleMachine = concat ["states { \"one\" \"two\" \"three\" \"four\" } initial \"one\"\n ",
    • " alphabet { '1' ' ' '=' '-' } blank ' '\n ",
    • "trans from \"one\" to \"one\" on (' ') write ' ' move right\n ",
    • "trans from \"one\" to \"one\" on ('1') write '1' move right\n ",
    • "trans from \"one\" to \"one\" on ('-') write '-' move right\n ",
    • "trans from \"one\" to \"two\" on ('=') write ' ' move left\n ",
    • "trans from \"two\" to \"three\" on ('1') write '=' move left\n ",
    • "trans from \"two\" to \"Halt\" on ('-') write '-' move left\n ",
    • "trans from \"three\" to \"three\" on ('1') write '1' move left\n ",
    • "trans from \"three\" to \"four\" on ('-') write '-' move left\n ",
    • "trans from \"four\" to \"four\" on (' ') write ' ' move left\n ",
    • "trans from \"four\" to \"one\" on ('1') write ' ' move right" ]
    • runTracedMachineOnString :: String -> String -> IO ([String])
    • runTracedMachineOnString m str =
    • do
    • tm <- runTParser m
    • return (runTracedMachine tm str)
    • runMachineOnString :: String -> String -> IO String
    • runMachineOnString m str =
    • do
    • tm <- runTParser m
    • return (runMachine tm str)
    • sampleInput = " 11111111-111= "
    • ------------------------------------------------------------------------
    • -- Main program execution scaffolding
    • -- main still needs a bit of work so that ghci will link correctly;
    • -- runs fine in GHCI, but linkage errors in GHC. For now, just load
    • -- this file, and then execute "runFromFile" from the command line.
    • ------------------------------------------------------------------------
    • main =
    • do
    • [file] <- getArgs
    • m <- parseFromFile (do { whitespace
    • ; x <- machine
    • ; eof
    • ; return x }) file
    • case m of
    • Right machine -> do
    • print "Enter input for parser:"
    • s <- getLine
    • result <- return (runMachine machine s)
    • print (concat ["Result:[", result, "]"])
    • Left x -> do
    • print (concat ["Parse error"])
    • runFromFile :: String -> IO ()
    • runFromFile filename =
    • do
    • m <- parseFromFile (do { whitespace
    • ; x <- machine
    • ; eof
    • ; return x }) filename
    • case m of
    • Right machine -> do
    • print "Enter input for parser:"
    • s <- getLine
    • result <- return (runMachine machine s)
    • print (concat ["Result:[", result, "]"])
    • Left x -> do
    • print (concat ["Parse error"])
    • Размещено на Allbest.ru

Подобные документы

  • Методи алгоритмiчного описаня задач, програмування на основi стандартних мовних засобiв. Переклад з однієї системи числення в іншу при програмуванні. Системи числення. Двійкові системи числення. Числа з фіксованою і плаваючою комою. Програмна реалізація.

    курсовая работа [164,1 K], добавлен 07.12.2008

  • Алгоритм сортування методом простого вибору. Знаходження найдовшого шляху в графі. Синтез машини Тюрінга, що розмічає послідовність чисел. Порівняння алгоритмів між собою за часом виконання і займаної пам'яті. Алгоритм пошуку мінімального елементу.

    курсовая работа [90,3 K], добавлен 17.05.2011

  • Написання програми для мобільного приладу, яка буде переводити числа з однієї системи числення в іншу. Розробка графічного інтерфейсу, яким зручно буде користуватись. Опис процедур, обробників та мови програмування. Дослідження логічних частин програми.

    курсовая работа [1,2 M], добавлен 27.08.2014

  • Розробка програмного забезпечення для розв’язування задачі обчислювального характеру у середовищі Turbo Pascal 7.0. Розгляд систем числення. Практична реалізація задачі переводу чисел з однієї системи числення у іншу. Процедура зворотного переводу.

    курсовая работа [112,2 K], добавлен 23.04.2010

  • Аналіз математичного підґрунтя двійкової та двійкової позиційної систем числення. Переведення числа з двійкової системи числення в десяткову та навпаки. Арифметичні дії в двійковій системі. Системи числення з довільною основою. Мішані системи числення.

    курсовая работа [149,5 K], добавлен 20.06.2010

  • Функції арифметико-логічного пристрою - виконання операцій над числами, що надходять до нього, за сигналами з пристрою керування. Правила переводу чисел з однієї системи числення в іншу. Розроблення алгоритму; функціональна і принципова електричні схеми.

    курсовая работа [1,0 M], добавлен 27.04.2014

  • Принципи побудови систем числення, основні поняття. Системи числення, вид та тип числа, форма представлення, розрядна сітка та формат, діапазон і точність подання, спосіб кодування від’ємних чисел. Визначення та призначення тригерів, їх класифікація.

    контрольная работа [150,9 K], добавлен 07.10.2009

  • Особливості понять "цифра" и "число". Знакова система оброки інформації комп’ютером. Файл - сукупність байтів, записана на пристрій зберігання інформації. Сутність і властивості алгоритму. Схема - графічне подання алгоритму за допомогою зв’язаних блоків.

    лекция [185,0 K], добавлен 03.10.2012

  • Принципи побудови та функціонування алгоритмів розпізнавання та виправлення помилок в кодових послідовностях. Переклад символів імені у послідовність цифр 16-річної системи числення. Заміна на протилежне значення біту і можливість його виправлення.

    курсовая работа [660,0 K], добавлен 02.10.2010

  • Значимість двійкової системи числення для кодування інформації. Способи кодування і декодування інформації в комп'ютері. Відповідність десятковій, двійковій, вісімковій і шістнадцятковій систем числення. Двійкове кодування інформації, алфавіт цифр.

    презентация [1,4 M], добавлен 30.09.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.