Вы находитесь на странице: 1из 10

Кыргызско-Германский Институт прикладной информатики (INAI.

kg)

«Java-
приложение для
машины
Тьюринга»
Документация

Февр, 2020 Кыдырбек уулу Бакай, Нурманбетов Бекболот


Оглавление
1 Введение 2

2 Класс TuringMachine 3

2.1 Данные класса TuringMachine 3

2.2 Конструкторы TuringMachine 4

2.3 Методы TuringMachine 4

3 Класс Controller 4

3.1 Данные класса Controller 4

3.2 Конструкторы Controller 4

3.3 Методы Controller 5

4 Класс View 5

4.1 Данные экземпляра ленты 5

4.2 Методы экземпляров ленты 6

4.3 Конструкторы ленты 7

5 Запуск машины (класс Main) 8

6 Инструкции 9

1
1 Ознакомление
Реализованная Машина Тьюринга была написана как самостоятельная работа
студента по теоретической информатике на Java. Этот Java-апплет примет элементы
машины Тьюринга и позволит этой машине Тьюринга работать на входе. Машина
Тьюринга представляет собой набор из пяти вещей. Это:

 входной алфавит
 лента ввода
 ленточная головка
 выходной алфавит
 набор правил.

Входной алфавит (обычно тот же, что и выходной алфавит) - это набор символов,
которые можно прочитать с ленты. Выходной алфавит - это набор символов, которые
можно прочитать с ленты.

Лента ввода - это "виртуальная" лента, которая в этой реализации бесконечна


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

Ленточная головка - это индикатор состояния ленты. Она может смещаться


согласно заданному правилу, в нашем случае, она может налево, направо или стоять на
месте.(Left, Right, Stop)

Выходной алфавит – это результат, который мы получим после остановки машины


Тьюринга.

Правила определяют действия машины Тьюринга. Правила TM показывают, что


при текущем состоянии и входе из входного набора на ленту можно записать новое
значение, головка ленты сдвинулась на один шаг в заданном направлении, а также
выполнить переход в новое состояние.

2
2 Класс Turing Machine
Наше приложение написано на Java, с использованием шаблона MVC(Model-View-
Controller). Класс TuringMachine выступает в качестве самой модельки(Model).
Определение или спецификация Java-класс можно разделить на 5 частей (не все из
которых обязательны или даже, как правило, присутствуют), а именно:

Экземпляры класса - "поля", которые определяются для каждого объекта в классе,


которые, в свою очередь, определяют этот объект.

Методы - процедуры, которые действуют на объекты и их поля, как

например, T .proverka( )проверяет, как должна работать машина.

Конструкторы - код, описывающий, как создается объект класса.

Методы класса - подпрограммы, не относящиеся к конкретному объекту в классе,

как, например, основная рутина, необходимая в любом приложении Java.

Данные класса – данные(переменные), разделяемые всеми объектами класса, как,


например, постоянные определения действий leftValues, znachenie, rightValues ,sostoyanie
и тд.

2.1 Данные класса TuringMachine(переменные класса или же свойства)

private String leftValues = "";


private String znachenie = "";
private String rightValues = "";
private String sostoyanie = "q0";
private ArrayList<String> program;
private View view;

Инкапсулированные поля: leftValues, znachenie, rightValues ,sostoyanie типа String, АrrayList


program с генерик типом String и переменная view типа View.

3
2.2 Конструкторы TuringMachine

Конструктор класса TuringMachine принимает в качестве параметров переменную типа


View, затем переменной класса view присваивает ее.

public TuringMachine(View view){


this.view = view;
}

2.3 Методы TuringMachine

В классе TuringMachine есть 5 методов: doAction, oneStep, proverka, sdelatShag,loadFile

3 Класс Controller
Класс Controller является мостом между Model и View. Controller отправляет команду
обновляя Model, а Model, в свою очередь, обновляет View.

3.1 Данные класса Controller(переменные класса или же свойства)

private TuringMachine model;

Инкапсулированное единственное поле model типа TuringMachine. Стоит упомянуть то, что класс
Controller реализует интерфейс ActionListener.

public class Controller implements ActionListener {

Вот что написано в официальной документации этого интерфейса:

Интерфейс приемника(ActionListener) для получения событий действия.

Класс, заинтересованный в обработке события действия, реализует этот интерфейс, а объект,


созданный с помощью этого класса, регистрируется компонентом, используя метод компонента

4
{@code addActionListener}. При наступлении события действия вызывается метод объекта {@code
actionPerformed}.

3.2 Конструкторы Controller

Конструктор класса Controller так же принимает в качестве параметров переменную типа View, но
теперь его присваивает не к переменной класса view, а к переменной типа TuringMachine, то есть
(Model).

public Controller(View view){


model = new TuringMachine(view);
}

3.3 Методы TuringMachine

В классе Controller только 1 метод реализация метода интерфейса ActionListener

actionPerformed, обработчик событий действия.

4 Класс View
4.1 Данные класса View(переменные класса или же свойства)

Класс View отвечает за GUI поэтому в основном все то, что относится к классу View связано с
библиотеками.

С полями класса то же самое,в основном, инкапсулированные переменные для создания графики,


такие как JLabel, JTextField, JTextArea.

private JLabel values;


private JTextField alfavit;
private JTextArea pravila;
private JTextField na4Sost;
private JLabel info;
private JLabel info1;

5
4.2 Конструкторы View

Конструктор класса View ничего не принимает в качестве параметров. Но в теле конструктора


происходит много процессов, так как, при запуске приложения, мы создаем объект View. В
конструкторе создается JFrame, JPanel на нем кнопки JButton и JTextArea с JtextField с
соответствующими размерами и названиями (ширина, высота). Еще одна отличительная
особенность в конструкторе мы создаем объект Controller и в конструкторе передаем этот View с
помощью this.

public View() {
Controller controller = new Controller(this);
JFrame jFrame = new JFrame();
jFrame.setSize(500, 600);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setTitle("Машина Тьюринга");
jFrame.setLayout(new BorderLayout());
JPanel panel1 = new JPanel();

values = new JLabel();


values.setFont(new Font("Monospaced", Font.BOLD, 24));
values.setForeground(Color.GREEN);
panel1.add(values);

JPanel panel2 = new JPanel();


JButton btnStep = new JButton("Шаг");
btnStep.addActionListener(controller);
panel2.add(btnStep);

JPanel panel3 = new JPanel();


panel3.setBounds(100, 50, 300, 380);
alfavit = new JTextField("алфавит");
alfavit.setBounds(0,0,300, 40);
na4Sost = new JTextField("начальное состояние");
na4Sost.setBounds(0,40,300, 40);
pravila = new JTextArea("правила");
pravila.setBounds(0,80,300, 300);
info = new JLabel();
info.setFont(new Font("Monospaced", Font.BOLD, 17));
info.setForeground(Color.BLACK);
info.setBounds(0,390, 500, 50);
info1 = new JLabel();

6
info1.setFont(new Font("Monospaced", Font.BOLD, 17));
info1.setForeground(Color.BLACK);
info1.setBounds(0,440, 500, 50);
panel3.add(alfavit);
panel3.add(pravila);
panel3.add(na4Sost);
panel3.add(info);
panel3.add(info1);
panel3.setLayout(null);

JButton btnLoad = new JButton("Добавить данные");


btnLoad.addActionListener(controller);
panel2.add(btnLoad);

jFrame.add(panel1, BorderLayout.PAGE_END);
jFrame.add(panel2, BorderLayout.PAGE_START);
jFrame.add(panel3, BorderLayout.CENTER);
jFrame.setVisible(true);
}

4.3 Методы View

В классе View сгенерированы обычные геттеры и сеттеры, а также главный метод updateDisplay,
который ничего не возвращает. В качестве параметров принимает переменную values типа String
и обновляет событии действий.

public void updateDisplay(String values) {


System.out.println(values);
this.values.setText(values);
}

7
5 Запуск машины (класс Main)
Каждое Java-приложение должно иметь, по крайней мере, один метод класса, а именно
main() программа. Как видим, это просто точка входа для машины Тьюринга, создает
машину и запускает ее.

public static void main(String[] args) {


View view = new View();
}

1. Метод doAction ничего не возвращает. В качестве параметров принимает command


типа String ,внутри в блоке switch обрабатывает ее и вызывает методы oneStep и
loadFile соответственно условию.
2. Метод oneStep ничего не возвращает. В параметры ничего не принимает, в теле, в
условии if проверяет команду на соответствие и обрабатывает ленту согласно
заданным правилам. В конце происходит вызов метода из View updateDisplay,
который обновляет Viewer. Если условия не соблюдены останавливает машину и
заканчивает работу.
3. Метод proverka ничего не возвращает. В качестве параметров принимает rule типа
String. Главный процесс работы происходит этом методе, он управляет старыми и
новыми значениями, задает значения и выявляет состояние головки согласно
заданному правилу. Также управляет шагами, проверяет если шаг равна L,то
смещение налево, если R, то направо, а иначе S остановка машины, работа
закончена.
4. Метод sdelatShag ничего не возвращает. В качестве параметров принимает
direction типа String. Этот метод ответственен за направление(смещение головки)
согласно правилу. Есть три состояния шага Left, Right и Stop.
5. Метод loadFile ничего не возвращает. В параметры ничего не принимает. Это
метод для добавления данных в машину Тьюринга. Принимает алфавит, все
значения: левое, начальное, правое. Прочитав алфавит вносит его в массив типа
String, иначе выкидывает исключение.

8
6 Инструкции

Правила ввода

Ввод данных происходит через панель.

 В поле алфавит вводим входной алфавит.


 В поле начальное состояние вводим положение головки ленты.
 В поле правила вводим набор правил.

Затем нажимаем на кнопку Добавить данные. Если вы введете правило, которое


имеет такое же текущее состояние и символ чтения, что и существующее правило, то
новое правило заменит существующее правило.

И затем кнопка Шаг - пошаговое выполнение задачи. Этап чтения и замены происходит
моментально, по прохождении всего входного алфавита и выполнения всех правил
машина остановится, а мы получим наш выходной алфавит.