Загрузил JopaKonya

Moi Kursach

реклама
Минобрнауки России
Юго-Западный государственный университет
Кафедра вычислительной техники
КУРСОВАЯ РАБОТА
По дисциплине «Программирование»
(наименование дисциплины)
на тему «
\\\\
»
направление подготовки (специальность)
09.03.01 Информатика и вычислительная техника
(код, наименование)
Автор работы
(инициалы, фамилия)
(подпись, дата)
Группа ВМ-31б
Руководитель работы
Э.И. Ватутин
(инициалы, фамилия)
Работа (проект) защищена
(подпись, дата)
(дата)
Оценка
Члены комиссии
(подпись, дата)
(инициалы, фамилия)
(подпись, дата)
(инициалы, фамилия)
(подпись, дата)
(инициалы, фамилия)
Курск 2024г.
Минобрнауки России
Юго-Западный государственный университет
Кафедра вычислительной техники
ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ
Студент
шифр
группа
(фамилия, инициалы)
1. Тема
2. Срок представления работы к защите «
»
20
г.
3. Исходные данные (для научного исследования):
4. Содержание пояснительной записки курсовой работы
4.1.
4.2.
4.3.
4.4.
4.5.
5. Перечень графического материала:
Руководитель работы
(подпись, дата)
(инициалы, фамилия)
(подпись, дата)
(инициалы, фамилия)
Задание принял к исполнению
v
РЕФЕРАТ
Курсовая работа состоит из 18 листов формата A4, включает 7 рисунков.
При написании использовано 5 источников литературы.
Ключевые слова: Дизъюнктивная нормальная форма, ДНФ, Python,
логические выражения, программирование.
Объект: Дизъюнктивная нормальная форма (ДНФ).
Предмет исследования: Разработка программы на языке Python для
поиска выполняющего набора переменных, при котором ДНФ тождественно
равна 0.
Цель: Изучение и реализация алгоритма для поиска такого множества
значений переменных в ДНФ, при котором выражение становится ложным.
Результаты исследования:
1.
Разработана программа на языке Python, которая принимает на
вход логическое выражение в форме ДНФ.
2.
Создано консольное приложение на Python, позволяющее
пользователю находить выполняющий набор значений переменных, при
котором ДНФ равна 0, для всех случаев.
3
СОДЕРЖАНИЕ
ВВЕДЕНИЕ .............................................................................................................. 5
1. ТЕОРЕТИЧЕСКОЕ РЕШЕНИЕ ЗАДАЧИ...................................................... 6
1.1. Исходные данные ....................................................................................... 6
1.2. Общие сведенья .......................................................................................... 6
1.3. Алгоритм решения задачи ......................................................................... 7
1.3.1. Перебор всех возможных значений .................................................... 7
1.3.2. Табличный метод .................................................................................. 7
1.3.3. Метод Куайна-МакКласки ................................................................... 8
1.3.4. Алгоритм Робинсона ............................................................................ 8
1.3.5. Метод Карно .......................................................................................... 9
1.4. Алгоритмы программы ............................................................................ 10
2. РАЗРАБОТКА ПРОГРАММЫ ...................................................................... 12
2.1. Описание интерфейса............................................................................... 12
2.2. Процедуры и функции ............................................................................. 13
2.3. Типы и переменные .................................................................................. 13
3. ПРИМЕР ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ ........................................... 14
3.1. Пример работы при успешном вводе данных ....................................... 14
3.2. Пример работы при 4 и более переменных X........................................ 16
ЗАКЛЮЧЕНИЕ ..................................................................................................... 17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ........................................... 18
ПРИЛОЖЕНИЕ 1. Листинг программы ............................................................. 19
4
ВВЕДЕНИЕ
Дизъюнктивная нормальная форма (ДНФ) является одной из ключевых
форм представления логических выражений. Она широко используется в
различных областях информатики, таких как теория автоматов, цифровая
логика, искусственный интеллект и другие. ДНФ представляет собой
логическое выражение, которое записывается в виде дизъюнкции (логическое
"ИЛИ") нескольких конъюнкций (логическое "И") литералов. Литералы могут
быть либо переменными, либо их отрицаниями.
В данной работе рассматривается задача нахождения такого набора
значений переменных, при котором логическое выражение в ДНФ принимает
значение 0 (ложь). Данная задача имеет важное практическое значение, так как
позволяет анализировать и оптимизировать логические схемы и алгоритмы.
5
1.
ТЕОРЕТИЧЕСКОЕ РЕШЕНИЕ ЗАДАЧИ
1.1.
Исходные данные
Для заданной дизъюнктивной нормальной формы (ДНФ) найти такое
множество значений переменных (выполняющий набор), при котором она
тождественно равна 0. Например, x1 ⋅ x2 V ¬x2 V ¬x3 выполняющим набором
является следующий набор значений: x1 = 0, x2 = 1, x3 = 1
1.2.
Общие сведенья
Дизъюнктивная нормальная форма (ДНФ) в булевой логике —
нормальная форма, в которой булева формула имеет вид дизъюнкции
конъюнкций литералов. Любая булева формула может быть приведена к ДНФ.
Для этого можно использовать закон двойного отрицания, закон де Моргана,
закон дистрибутивности. Дизъюнктивная нормальная форма удобна для
автоматического доказательства теорем.
ДНФ играет большую роль в таких областях как:
Оптимизация логических схем: в проектировании и оптимизации
логических схем важно выявить, при каких значениях переменных схема
работает корректно или не работает вовсе. Это позволяет улучшить
производительность и надежность схем.
Верификация программного обеспечения: надёжность программного
обеспечения требует проверки его логических компонентов на наличие
ошибок. Анализ логических выражений в ДНФ помогает выявлять и устранять
потенциальные проблемы.
Проектирование цифровых устройств: в разработке цифровых устройств
широко применяются логические выражения для определения их работы.
Оптимизация этих выражений способствует созданию более эффективных и
экономичных устройств.
6
Теория автоматов и формальных языков: в этих областях ДНФ помогает
в анализе и синтезе автоматов, что улучшает алгоритмы распознавания и
обработки формальных языков.
1.3.
Алгоритм решения задачи
Существует несколько подходов и методов для решения задач,
связанных с дизъюнктивной нормальной формой (ДНФ). Рассмотрим
основные из них:
1.3.1. Перебор всех возможных значений
Этот метод заключается в проверке всех возможных комбинаций
значений переменных, чтобы найти те, при которых ДНФ принимает нужное
значение (например, 0 или 1). Для выражения с n переменными потребуется
проверить 2n комбинаций.
Преимущества:
Простота реализации.
Гарантированное нахождение решения, если оно существует.
Недостатки:
Долгий по времени, что делает метод неэффективным для большого
числа переменных.
1.3.2. Табличный метод
Этот метод заключается в построении таблицы истинности для всех
возможных значений переменных. Для каждого набора значений переменных
вычисляется значение логического выражения.
Преимущества:
Полное представление всех возможных значений и их результатов.
7
Простота визуализации и анализа.
Недостатки:
Долгий по времени и затратный по памяти, особенно для большого
числа переменных
1.3.3. Метод Куайна-МакКласки
Метод Куайна-МакКласки используется для минимизации логических
выражений ДНФ или КНФ. Этот метод основан на нахождении простейших
импликант и последующей их минимизации.
Преимущества:
Позволяет минимизировать логическое выражение.
Подходит для автоматизации.
Недостатки:
Увеличивается сложность с ростом числа переменных.
1.3.4. Алгоритм Робинсона
Этот метод используется для проверки выполнимости логических
выражений и заключается в применении разрешающих правил для упрощения
логических формул до тех пор, пока не будет найдено противоречие или
доказательство выполнимости.
Преимущества:
Эффективен для проверки выполнимости.
Основан на строгих логических правилах.
Недостатки:
Может быть сложным для реализации и понимания.
8
1.3.5. Метод Карно
Этот метод используется для упрощения логических выражений и
визуализации их минимизации. Карта Карно представляет собой графическое
средство,
облегчающее
нахождение
минимальных
форм
логических
выражений.
Преимущества:
Позволяет наглядно минимизировать логическое выражение.
Эффективен для выражений с небольшим числом переменных.
Недостатки:
Трудно применять для большого числа переменных.
6. Булева алгебра и преобразования
Использование
законов
булевой
алгебры
для
упрощения
и
преобразования логических выражений. Примеры таких законов включают
законы де Моргана, идемпотентность, дистрибутивность и другие.
Преимущества:
Формальный и строгий метод.
Может быть применен для различных типов логических выражений.
Недостатки:
Требует знания и умения применять законы булевой алгебры.
Каждый из этих методов имеет свои преимущества и недостатки, и
выбор метода зависит от конкретной задачи, количества переменных и
требований к эффективности. В случае простых задач часто достаточно
использовать методы перебора или таблиц истинности, тогда как для более
сложных задач может потребоваться применение методов минимизации и
специальных алгоритмов.
Рассмотрим пример: x1 ⋅ x2 V ¬x2 V ¬x3, где
• ⋅ – логическое «И»
• V – логическое «ИЛИ»
• ¬ – логическое отрицание
9
Для данного выражения нужно найти набор значений переменных x1,
x2, x3 при котором оно будет ложным. Примером такого набора является: x1
= 0, x2 = 1, x3 = 1
Проверим, что при этих значениях выражение действительно равно 0:
Подставляем значения в выражение: (0 ⋅ 1) V ¬(1) V ¬(1)
Результаты подвыражений:
0⋅1=0
¬(1) = 0
¬(1) = 0
Тогда выражение примет вид: 0 V 0 V 0 = 0
Таким образом, при x1 = 0, x2 = 1, x3 = 1 выражение действительно равно
0, что и требовалось доказать.
Алгоритмы программы
1.4.
Основным методом данной программы является vichislenie, который
получает выражение из поля ввода, преобразует его для использования в
логических операциях
Python
и проверяет выполнение логического
выражения. Блок-схема метода vichislenie представлена на рисунке 1. На
рисунке
2
представлена
блок-схема
основной
программы,
которая
инициализирует графический интерфейс и вызывает метод vichislenie.
10
Рисунок 4 – Блок-схема
11
2.
РАЗРАБОТКА ПРОГРАММЫ
2.1.
Описание интерфейса
В качестве языка программирования для разработки программы был
выбран Python.
Программа
представляет
собой
графическое
приложение,
реализованное с использованием библиотеки tkinter.
На главном экране отображается поле для ввода выражения, поле
результата в котором выводится значения переменных, при которых ДНФ
равна 0, а также кнопка вычислить.
Рисунок 2 – Разработанное оконное приложение
12
2.2.
Процедуры и функции
Процедуры и функции, созданные при разработке программы:

def vichislenie – отвечает за вычисление и отображение
результатов логического выражения, введённого пользователем через GUI
приложение на tkinter.
2.3.
Типы и переменные
При разработке были созданы следующие типы:

okno – Это объект главного окна приложения, созданный с
использованием библиотеки tkinter

text – Переменная, используемая для создания виджетов меток,
содержащих
текстовую
информацию,
например,
для
отображения
обозначений операторов.

vvod – Переменная, связанная с виджетом ввода текста,
предназначенным для пользовательского ввода логического выражения.

vivod: Переменная, связанная с виджетом текстового поля,
используемым
для
вывода
результатов
вычислений
или
другой
виджетом
кнопки,
многострочной информации.

knopka:
Переменная,
связанная
с
предназначенной для запуска функции вычисления при клике на неё.
13
3.
ПРИМЕР ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ
3.1.
Пример работы при успешном вводе данных
Рассмотрим случай, когда, запустив программу, мы ввели пример x1 ⋅ x2
V ¬x2 V ¬x3. В окне результата выведется значения переменных x при которых
ДНФ будет равно 0.
Рисунок 5 - Пример ввода x1 ⋅ x2 V ¬x2 V ¬x3
14
Рассмотрим другой пример x1 V x2 V x3, где ДНФ будет равен 0, при
этом без изменения количества x.
Рисунок 6 - Пример ввода x1 V x2 V x3
15
3.2.
Пример работы при 4 и более переменных X
Рассмотрим другой пример (¬x1 V ¬x2) V ((x2 ⋅ x3) V (x3 ⋅ x4)), где
используется 4 x
Рисунок 7 – Пример ввода (¬x1 V ¬x2) V ((x2 ⋅ x3) V (x3 ⋅ x4))
16
ЗАКЛЮЧЕНИЕ
В ходе выполнения данной работы была решена задача нахождения
набора значений переменных для логического выражения в дизъюнктивной
нормальной форме (ДНФ), при котором это выражение тождественно равно 0.
Для решения задачи был выбран метод перебора всех возможных значений
переменных, также известный как метод полного перебора. Этот метод был
реализован на языке программирования Python.
Использование метода перебора позволило гарантированно найти все
возможные наборы значений переменных, при которых ДНФ принимает
значение ложь. Хотя данный метод имеет экспоненциальную сложность и
может быть неэффективен для выражений с большим числом переменных, он
был выбран за простоту реализации и надежность для относительно
небольшого числа переменных.
Методы, использованные в данной работе, могут быть расширены и
модифицированы для более сложных задач, требующих эффективных
алгоритмов минимизации и проверки логических выражений.
В заключение, можно отметить, что выполнение данной работы
позволило не только решить поставленную задачу, но и продемонстрировать
важность и практическую применимость методов анализа логических
выражений в форме ДНФ.
17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1.
Disjunctive normal form [Электронный ресурс] // Википедия URL:
en.wikipedia.org/wiki/Disjunctive_normal_form.
2.
Дизъюнктивная нормальная форма [Электронный ресурс] //
Википедия URL:
ru.wikipedia.org/wiki/Дизъюнктивная_нормальная_форма
3.
ПДНФ и ПКНФ — Введение в математическую логику
[Электронный ресурс] // Hexlet URL:
ru.hexlet.io/courses/logic/lessons/pdnf_and_pcnf/theory_unit?ysclid=lxkpglo3nw8
8699692
4.
ДНФ [Электронный ресурс] // Ifmo URL:
neerc.ifmo.ru/wiki/index.php?title=ДНФ
5.
Совершенная дизъюнктивная нормальная форма и совершенная
конъюнктивная нормальная форма [Электронный ресурс] // StudFiles URL:
studfile.net/preview/5251334/page:2/
18
ПРИЛОЖЕНИЕ 1. Листинг программы
import tkinter
import re
def vichislenie():
virag = vvod.get()
virag = virag.replace('&', 'and').replace('V', 'or').replace('!', 'not')
srtvirag = sorted(set(re.findall(r'x\d', virag)))
vivod.delete('1.0', tkinter.END)
vivod.insert(tkinter.END, 'x1 x2 x3 x4 x5 x6\n')
for x1 in range(2):
for x2 in range(2):
for x3 in range(2):
for x4 in range(2):
for x5 in range(2):
for x6 in range(2):
perm = {'x1': x1, 'x2': x2, 'x3': x3, 'x4': x4, 'x5': x5, 'x6': x6}
if not eval(virag, perm):
result = ' '.join(str(perm[var]) for var in srtvirag)
vivod.insert(tkinter.END, result)
return
okno = tkinter.Tk()
text = tkinter.Label(okno, text="Обозначения:")
text.pack(pady=10)
text = tkinter.Label(okno, text="& - 'И', V - 'ИЛИ', ! - 'НЕ', Равно - '==', Не равно
- ':='")
text.pack(pady=10)
19
vvod = tkinter.Entry(okno, width=50)
vvod.pack(pady=10)
text = tkinter.Label(okno, text="Результат:")
text.pack(pady=10)
vivod = tkinter.Text(okno, width=50, height=10)
vivod.pack(pady=10)
knopka = tkinter.Button(okno, text="Вычислить", command=vichislenie)
knopka.pack(pady=10)
okno.mainloop()
20
Скачать