
- •Министерство образования и науки Российской Федерации
- •Цель лекции
- •План лекции
- •1 Происхождение вычислительных машин
- •2 Изучение алгоритмов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Биты и их хранение
- •2 Оперативная память
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Устройства внешней памяти
- •3 Хранение и поиск файлов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление числовых значений
- •2 Хранение целых чисел
- •3 Хранение дробей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление текста
- •2 Представление изображений
- •Достоинства пиксельной графики
- •Недостатки пиксельной графики
- •Достоинства векторной графики
- •Недостатки векторной графики
- •3 Представление звука
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Сжатие изображений
- •2 Ошибки передачи данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Архитектура эвм
- •2 Связь процессора с другими устройствами
- •3 Другие архитектуры
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Машинный язык
- •2 Пример машинного языка
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Выполнение программы
- •2 Пример выполнения программы
- •3 Программы и данные
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Логические операции
- •2 Операции сдвига
- •3 Арифметические операции
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция операционных систем
- •2 Архитектура операционных систем
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие процесса
- •2 Управление процессами
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Классификация сетей
- •2 Сетевые протоколы*
- •3 Безопасность сетей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие алгоритма
- •2 Представление алгоритма
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Теория решения задач
- •2 Общие методы решения задач
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритм последовательного поиска
- •2 Управление циклами
- •3 Алгоритм сортировки методом вставки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритмы поиска и сортировки
- •2 Управление рекурсией
- •3 Разработка рекурсивных процедур
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эффективность алгоритмов
- •2 Верификация программ
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция и классификация языков программирования
- •2 Концепции традиционного программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Процедурные единицы
- •2 Реализация языка программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Объектно-ориентированное программирование
- •2 Декларативное программирование
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структуры данных
- •Integer Scores (2.9).
- •2 Статические и динамические структуры
- •3 Указатели
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Массивы
- •2 Списки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структура и функции стека
- •2 Реализация стека
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Очереди
- •2 Деревья
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Пользовательские типы данных
- •Int Age;
- •2 Классы
- •Int *StackEntries;
- •3 Стандартная библиотека шаблонов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Роль операционной системы
- •2 Последовательные файлы
- •3 Вопросы программирования
- •0000000010000110
- •001100010011001100110100
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения индексации
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения хеширования
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Общие вопросы
- •2 Система управления базой данных
- •3 Поддержка целостности баз данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Модели баз данных
- •2 Реляционная модель баз данных
- •3 Объектно-ориентированные базы данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Интеллект и машины
- •2 Распознавание образов
- •3 Мышление
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Искусственные нейронные сети
- •2 Генетические алгоритмы
- •Контрольные вопросы
- •Невычислимые функции Цель лекции
- •План лекции
- •1 Основы машины Тьюринга
- •2 Невычислимая функция
- •3 Сложность задач
- •Листинг 1. Процедура MergeLists для объединения двух упорядоченных списков
- •Листинг 2. Алгоритм сортировки слиянием, реализованный в процедуре MergeSort
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Шифрование с открытым ключом
- •2 Модульная арифметика
- •Контрольные вопросы
- •Литература
- •Internet-ресурсы
2 Декларативное программирование
Логическая дедукция. Предположим, нам известно, что Кермит либо на сцене, либо болен, и нам сообщают, что Кермит не на сцене. Можно сделать вывод, что Кермит болен. Это пример дедуктивного метода, который называется резолюцией (resolution).
Для того чтобы лучше понять этот метод, прежде всего условимся обозначать простые высказывания заглавными буквами, а отрицание высказывания — символом «¬». Например, обозначим высказывание «Кермит — принц» буквой А, высказывание «Госпожа Пигги — актриса» буквой В. Тогда выражение
A OR В
будет означать: «Кермит — принц, или Госпожа Пигги — актриса». А выражение
В AND ¬A
будет означать: «Госпожа Пигги — актриса и Кермит не принц». Для обозначения импликации (из А следует В) мы будем использовать стрелку. Например, выражение
А В
означает: «Если Кермит — принц, то госпожа Пигги — актриса».
Согласно логической операции резолюции, если у нас есть два высказывания
Р OR Q
и
R OR ¬Q.
то из них следует высказывание
Р OR R.
В таком случае из двух исходных высказываний выводится третье, которое называется резольвентой (resolvent). Обратите внимание на то, что резольвента является логическим следствием исходных высказываний. То есть если исходные высказывания истинны, то и резольвента должна быть истинной. (Если Q истинно, тогда R тоже должно быть истинно; а если Q ложно, тогда Р должно быть истинно. Следовательно, независимо от истинности Q либо Р, либо R должно быть истинным).
Исходные высказывания операции резолюции и их резольвента соединяются линиями (рис. 4). Обратите внимание на то, что операцию резолюции можно применить только к высказываниям, имеющим форму логического выражения, то есть высказываниям, компоненты (предикаты) которых соединены логическим оператором, например OR. Так высказывание Р OR Q является дизъюнкцией, а высказывание Р Q нет. Однако этот факт не создает никаких трудностей, поскольку существует теорема математической логики, согласно которой любое высказывание, состоящее из предикатов первого порядка, можно записать в виде дизъюнкции. Мы не будем рассматривать эту теорему, а только отметим, что высказывание Р Q эквивалентно высказыванию Q OR P.
Рисунок 4 – Резолюция высказываний Р OR Q и R OR ¬Q дает высказывание Р OR R
Набор высказываний называется несовместным, если все высказывания не могут быть истинны одновременно. Другими словами, несовместный набор высказываний является внутренне противоречивым. Самый простой пример — это комбинация высказывания Р и его отрицания ¬Р. Специалисты по логике показали, что доказать несовместность высказываний можно с помощью многократного выполнения операции резолюции. Согласно правилу, если в результате многократного выполнения операции резолюции получается пустое высказывание (результат операции резолюции над высказываниями Р и ¬Р), то исходный набор высказываний является несовместным. Можно доказать (рис. 5) несовместность высказываний
Р OR Q
R OR ¬Q
¬R
¬P
Предположим, нам нужно доказать, что из некоторого набора высказываний следует Р. Доказать истинность Р — то же самое, что доказать ложность высказывания ¬Р. Поэтому, чтобы показать, что из исходного набора высказываний следует Р, нам просто нужно выполнять операцию резолюции над исходными высказываниями и высказыванием ¬P,
Рисунок 5 – Доказательство несовместимости высказываний Р OR Q, R OR ¬Q, ¬R и ¬P
пока мы не получим пустое высказывание. Получив такой результат, можно сделать вывод, что высказывание ¬Р несовместно с исходными высказываниями и, следовательно, из них следует Р.
Прежде чем приступить к рассмотрению операции резолюции в программировании, следует затронуть еще один вопрос. Предположим, у нас есть два высказывания
(Маша находится в X) -» (Машина овечка находится в X),
где X обозначает любое место, и
(Маша находится дома)
В дизъюнктивной форме эти высказывания имеют вид
(Машина овечка находится в X) OR ¬(Маша находится в X)
и
(Маша находится дома)
На первый взгляд может показаться, что над этими высказываниями нельзя выполнить операцию резолюции. В данном случае важно понять, что высказывание (Маша находится в X) является высказыванием о месте вообще и доме в частности. Поэтому над частным случаем первого высказывания
(Машина овечка находится дома) ИЛИ ¬(Маша находится дома)
и высказыванием
(Маша находится дома)
можно выполнить операцию резолюции. В результате мы получим
(Машина овечка находится дома)
Процесс присвоения значений переменным (например, присвоение значения «дом» переменной X) для выполнения операции резолюции называется унификацией (unification). Именно эта операция позволяет применять общие высказывания в отдельных прикладных задачах.
Язык программирования Prolog (PROgramming in LOGic) является декларативным языком программирования, в основе которого лежит многократное выполнение операции резолюции. Программа на этом языке состоит из набора исходных высказываний, на основе которых выводятся дедуктивные умозаключения. Компоненты высказываний называются утверждениями. Утверждение состоит из имени, за которым в скобках помещается список его аргументов. Утверждение является каким-либо высказыванием о его аргументах, и для него обычно выбирается имя, отражающее лежащую в его основе семантику. Например, для того чтобы записать утверждение о том, что Bill является родителем Маrу, можно использовать утверждение parent (bill, mary)
Обратите внимание на то, что аргументы утверждения начинаются со строчной буквы, несмотря на то что они являются именами собственными. Все дело в том, что в языке Prolog внешне константы и переменные различаются тем, что имена констант начинаются со строчной буквы, а переменных — с прописной. Высказывания в Prolog являются либо фактами, либо правилами, и каждое из них заканчивается точкой. Факт состоит из одного утверждения. Например, тот факт, что черепаха передвигается быстрее улитки, можно записать с помощью высказывания faster (turtle, snail)
А тот факт, что кролик передвигается быстрее черепахи, можно записать следующим образом
faster (rabbit, turtle)
Правило в языке Prolog представляет собой высказывание с импликацией. Однако вместо высказывания X Y программист запишет «У если X», используя вместо слова «если» символ «:-» (двоеточие и тире). Например, правило «X пожилой, значит X мудрый» логик запишет как
old (X) wise (X)
а программист вместо этого напишет
wise (X) :- old (X)
Вот еще пример. Правило
(faster (X, Y) AND faster (Y, Z)) faster (X, Z)
в Prolog будет выглядеть как
faster (X, Z) :- faster (X, Y), faster (Y, Z).
Запятая, разделяющая faster (X, Y) и faster (Y, Z), обозначает операцию AND. Хотя подобные правила и не являются выражениями, они разрешены в Prolog, поскольку преобразовать их в дизъюнктивную форму не составляет особого труда.
Не забывайте, что Prolog не знает значения утверждений программы, он просто манипулирует высказываниями согласно заданным правилам. Поэтому программист должен описать все релевантные характеристики утверждения с помощью фактов и правил. Обычно факты используются для обозначения частных случаев утверждения, а правила — для описания общих принципов. Этот же подход использовался в приведенных ранее высказываниях с предикатом faster. Два факта описывают отдельные случаи скорости, а правило описывает общее свойство. Обратите внимание на то, что хотя утверждение, что кролик перемещается быстрее, чем улитка, и выражено эксплицитно, оно является следствием двух фактов, объединенных с правилом.
Используя для создания программного обеспечения язык Prolog, программист должен разработать набор фактов и правил, описывающих известную информацию. Эти факты и правила представляют собой исходные высказывания дедуктивной системы. После того как эти высказывания написаны, системе можно предлагать гипотезы (или целевые утверждения (goal) в терминологии языка Prolog), они обычно вводятся с клавиатуры. Система применяет операцию резолюции, чтобы доказать, что целевое утверждение является следствием исходных высказываний. Например, основываясь на высказываниях, описывающих отношение faster, можно доказать истинность таких целевых утверждений
faster (turtle, snail)
faster (rabbit, turtle)
faster (rabbit, snail)
Первые два утверждения совпадают с исходными высказываниями, а для доказательства третьего потребуются логические выводы.
Больший интерес представляют целевые утверждения, аргументы которых являются переменными, а не константами. В таком случае система пытается вывести целевое утверждение из исходных высказываний, запоминая операции унификации, которые для этого необходимо выполнить. Затем, когда целевое утверждение получено, система выводит на экран все унификации. Например, на целевое утверждение
faster (W, snail)
система ответит
faster (turtle, snail)
И в самом деле, это высказывание является следствием исходных высказываний и может быть получено из целевого утверждения с помощью операции унификации. Более того, если мы запросим у системы больше информации, она найдет и выведет на экран высказывание
faster (rabbit, snail)
Мы также можем с помощью целевого утверждения найти всех животных, которые передвигаются медленнее, чем кролик
faster (rabbit, W)
Если же мы начнем с целевого утверждения
faster (V, W)
система сообщит обо всех отношениях faster, которые можно вывести из исходных высказываний. Таким образом, программу на языке Prolog можно использовать для доказательства того, что одно животное передвигается быстрее другого, чтобы найти, какие животные передвигаются медленнее, чем данное животное, или чтобы найти все возможные отношения скорости передвижения. Такая гибкость представляет огромный интерес для специалистов в вычислительной технике.