НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ФАКУЛЬТЕТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ «УТВЕРЖДАЮ» Декан АВТФ д.т.н., проф. В.В. Губарев ______________________ 31 августа 2005 г. РАБОЧАЯ ПРОГРАММА УЧЕБНОЙ ДИСЦИПЛИНЫ «ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ» Основная образовательная Направление 230100 – программа: вычислительная техника» (бакалавриат) Направление 654600 – вычислительная техника» (инженерная подготовка) «Информатика и «Информатика и Специализация: 230105 – «Программное обеспечение вычислительной техники и автоматизированных систем» Факультет: автоматики и вычислительной техники (очная форма обучения) 3 5 51 час 17 часов 5 семестр 72 часа 5 семестр 8 семестр 140 часов Курс: Семестр: Лекции: Лабораторные занятия: Курсовой проект: Самостоятельная работа: Экзамен: Государственный экзамен: Всего: Новосибирск 2005 г. Рабочая программа составлена на основании Государственного образовательного стандарта высшего профессионального образования (ГОСВПО) по направлению 230100 (654600) – «Информатика и вычислительная техника». Регистрационный номер и дата утверждения ГОСВПО по направлению 230100 (654600) – «Информатика и вычислительная техника»: 35 тех/бак, 13 марта 2000 г. (224 тех/дс, 27 марта 2000 г.) Индекс дисциплины в ГОСВПО - СД.00 (СД.02) Компонент – национально-региональный (вузовский) Цикл СД – Специальные дисциплины Учебный план по направлению 230100 – «Информатика и вычислительная техника», специализация 230105 – «Программное обеспечение вычислительной техники и автоматизированных систем» (набор 2001 г. и последующие) Рабочая программа обсуждена на заседании кафедры вычислительной техники 31 августа 2005 г., протокол №7. Программу разработала ст. преп. кафедры ВТ Ю.В. Новицкая Зав. кафедрой ВТ, ответственный за основную образовательную программу по направлениям 230100 и 654600, д.т.н., проф. В.В. Губарев 1. ВНЕШНИЕ ТРЕБОВАНИЯ Квалификационные требования ГОСВПО по направлению 230100 – «Информатика и вычислительная техника»: 1.3.5. Квалификационные требования Для компетентного и ответственного решения профессиональных задач бакалавр: готов участвовать во всех фазах проектирования и разработки объектов профессиональной деятельности; готов участвовать в разработке всех видов документации на программные, аппаратные и программно-аппаратные комплексы; способен использовать современные методы, средства и технологии разработки объектов профессиональной деятельности; готов участвовать в проведении научных исследований и выполнении технических разработок в своей профессиональной области; способен изучать специальную литературу и другую научно-техническую информацию, достижения отечественной и зарубежной науки и техники в области своей профессиональной деятельности; взаимодействует со специалистами смежного профиля при разработке методов, средств и технологий применения объектов профессиональной деятельности в научных исследованиях и проектно-конструкторской деятельности, в управлении технологическими, экономическими, социальными системами и в гуманитарных областях деятельности человека; готов к кооперации с коллегами и работе в коллективе при разработке объектов профессиональной деятельности; умеет на научной основе организовать свой труд, владеет современными информационными технологиями, применяемыми в сфере его профессиональной деятельности; способен в условиях развития науки и изменяющейся социальной практики к переоценке накопленного опыта, анализу своих возможностей, умеет приобретать новые знания, используя современные информационные образовательные технологии; методически и психологически готов к изменению вида и характера своей профессиональной деятельности, работе над междисциплинарными проектами. Бакалавр должен знать: методические и нормативные материалы по проектированию и разработке объектов профессиональной деятельности; технологию проектирования и разработки объектов профессиональной деятельности; перспективы и тенденции развития информационных технологий; технические характеристики и экономические показатели лучших отечественных и зарубежных образцов объектов профессиональной деятельности; порядок, методы и средства защиты интеллектуальной собственности; методы анализа качества объектов профессиональной деятельности; современные средства вычислительной техники, коммуникаций и связи; основные требования к организации труда при проектировании объектов профессиональной деятельности; правила, методы и средства подготовки технической документации; основы экономики, организации труда, организации производства и научных исследований; основы трудового законодательства; правила и нормы охраны труда. Требования ГОСВПО к обязательному минимуму содержания по направлению 654600 – «Информатика и вычислительная техника»: Индекс Наименование дисциплины и ее основные разделы Часы СД.02 Функциональное и логическое программирование: 140 рекурсивные функции и лямбда-исчисление А.Черча; программирование в функциональных обозначениях; функциональные языки; строго функциональный язык; приемы программирования; представление и интерпретация функциональных программ; отладка программ; конкретные реализации языков функционального программирования; соответствие между функциональными и императивными программами; применения функционального программирования; логическая программа: основные конструкции, операционная и декларативная семантика, интерпретация, корректность; программирование баз данных; рекурсивное программирование; вычислительная модель; анализ структуры термов; металогические предикаты; внелогические предикаты; недетерминированное программирование; неполные структуры данных; программирование второго порядка; методы поиска; обработка нечетких данных; Constraint–Пролог: операционная семантика; применение логического программирования в задачах искусственного интеллекта. 2. ОСОБЕННОСТИ (ПРИНЦИПЫ) ПОСТРОЕНИЯ ДИСЦИПЛИНЫ В основу дисциплины «Функциональное программирование» положены следующие принципы: и логическое дисциплина входит в число дисциплин, включенных в учебный план на основании Государственного образовательного стандарта высшего профессионального образования по направлению 230100 (654600) – «Информатика и вычислительная техника»; основной целью дисциплины является формирование и закрепление системного подхода при разработке программ с применением языков логического и функционального программирования, в дисциплине рассматриваются средства и методы создания таких программ; ядро дисциплины составляют средства и приемы создания программ с использованием языков логического и функционального программирования; для успешного изучения дисциплины студенту необходимо знать основы математической логики; в дисциплине выделены две родственные составляющие: логическое программирование и функциональное программирование, соответственно рассматриваются средства и методы создания программ для каждой составляющей; в дисциплине закрепляются такие общепредметные умения, как выбор язык программирования для решения поставленной задачи, выбор способа представления исходных данных и выбор метода решения поставленной задачи; дисциплина имеет практическую часть (лабораторные работы - 17 часов и курсовое проектирование - 5 семестр). Студенты применяют теоретические знания для создания программ с использованием логического и функционального стилей программирования. Задания для лабораторных занятий и курсового проектирования имеют проблемный характер, наиболее типичный для задач, решаемых методами и средствами логического и функционального стилей программирования; для проведения лабораторных занятий и курсового проектирования используются методические указания; оценка знаний и умений студентов проводится с помощью экзамена в 5 семестре и государственного экзамена в 8 семестре, экзаменационные вопросы охватывают основные проблемы дисциплины. 3. ЦЕЛИ УЧЕБНОЙ ДИСЦИПЛИНЫ После изучения дисциплины студент будет № цели Содержание цели иметь представление: 1 о множестве задач, решаемых с применением логического и функционального подходов к программированию, и о методах их решения с использованием языков логического и функционального программирования, о разделах дисциплины «Функциональное и логическое программирование», ее структуре; 2 о месте и роли, о состоянии развития современных логических и функциональных языков, о проблемах и направлениях развития этого раздела программирования; 3 о различиях в подходах к решению задач логического и функционального программирования, о вопросах представления данных для решения задач логического и функционального программирования, о приемах разработки программ с применением языков логического и функционального программирования; 4 о проблемах и направлениях развития современных программных средств логического и функционального программирования, об основных методах и средствах автоматизации проектирования, используемых в программных средствах; 5 об основах построения сложных программ. знать: 6 объект дисциплины (системы разработки программ с использованием языков логического и функционального программирования), предмет дисциплины (методы программирования с использованием языков логического и функционального программирования), задачи дисциплины (разработка программ с применением языков логического и функционального программирования); 7 проблематику дисциплины «Функциональное и логическое программирование» и ее основные разделы; 8 базовые понятия и определения, используемые в логическом и функциональном программировании; 9 методы и уровни представления данных, способы обработки и хранения данных; 10 основы технологии программирования в программных средствах, используемых в современных языках логического и функционального программирования. уметь: 11 ориентироваться в современных языках логического и функционального программирования, их возможностях; 12 обосновать выбор языка (языка логического или функционального программирования) для решения конкретных задач; 13 14 15 16 обосновать выбор представление данных для решения поставленной задачи; обосновать выбор методов обработки данных для решения поставленной задачи; разрабатывать и тестировать программы с применением программных средств, используемых в современных языках логического или функционального программирования; использовать специальную литературу в изучаемой предметной области. 4. СОДЕРЖАНИЕ И СТРУКТУРА УЧЕБНОЙ ДИСЦИПЛИНЫ Содержание учебной дисциплины: Ссылки Часы Темы лекционных занятий на цели 1, 2, 3, 2 Функциональное и логическое программирование как научная 11 дисциплина. Структура дисциплины. Ее связь с другими дисциплинами учебного плана. Особенности предмета дисциплины. Понятие декларативного программирования. Логическая программа: основные конструкции, операционная и декларативная семантика, интерпретация, корректность. 1, 2, 3, 2 Общие сведения о языках логического программирования. 11 Constraint–Пролог: операционная семантика. Области применения языка логического программирования PROLOG. Основные элементы языка. Предикаты. Арность предикатов. Металогические предикаты. Внелогические предикаты; Предложения: факты и правила. Переменные. Анонимные переменные. Оформление комментариев. Запросы. Цели. 7, 8, 9, 2 Простые объекты данных. Согласование целевых 10 утверждений. Сопоставление и унификация. Равенство и предикат равенства. Основные секции программы. Основные стандартные домены. Объявление нестандартных доменов. Детерминизм. 7, 8, 9, 2 Методы поиска. Недетерминированное программирование. 10 Обработка нечетких данных. Основные принципы поиска с возвратом. Поиск всех решений. Стандартный предикат fail. Прерывание поиска с возвратом – отсечение (стандартный предикат !). Способы использования отсечения. «Зеленое» и «красное» отсечения. 7, 8, 9, 2 Использование поиска с возвратом в детерминированных 10 предложениях. Отладка программ. Стандартные предикаты ввода и вывода. Арифметические вычисления. 7, 8, 9, 2 Составные объекты данных. Функторы. Многоуровневые 10 составные объекты данных. Вычислительная модель; анализ структуры термов. Объявление составных объектов данных. Использование предиката равенства для унификации составных объектов. 7, 8, 9, 2 Рекурсивное программирование. Достоинства и недостатки 10 рекурсии. Хвостовая рекурсия. Способы задания хвостовой рекурсии. 7, 8, 9, 2 Рекурсивные структуры данных – списки. Объявление 10 списков. Составные списки. Голова и хвост списка. Примеры работы со списками. Ссылки Часы Темы лекционных занятий на цели 7, 8, 9, 2 Рекурсивные структуры данных – деревья. Объявление 10 деревьев. Упорядоченные и неупорядоченные деревья. Бинарные поисковые деревья. Способы обхода дерева. Создание дерева. Создание дерева с сохранением упорядоченности. 7, 8, 9, 2 Программирование баз данных Динамические базы данных. 10 Программная секция базы данных. Объявление динамической базы данных. Добавление и удаление фактов в динамическую базу данных во время выполнения программы. Сохранение фактов в файле во время выполнения программы. Загрузка фактов из файла во время выполнения программы. 7, 8, 9, 2 Обработка строк. Стандартные предикаты для работы со 10 строками. Анализ потока параметров. Контроль потока параметров. 7, 8, 9, 2 Файлы. Работа с текстовыми и бинарными файлами. 10 Открытие и закрытие файлов. Стандартные предикаты для работы с файлами. 7, 8, 9, 2 Стандартный предикат not. Контроль конца файла. 10 Расширение динамической базы данных с помощью файлов. Работа с фактами динамической базы данных, как с термами. Работа с клавиатурой. Чтение и распознавание клавиш. 7, 8, 9, 2 Составные структуры данных – графы. Представление графов. 10 Действия с графами. Ориентированные и неориентированные графы. Поиск ациклического пути в графе. 7, 8, 9, 2 Действия с графами. Поиск Гамильтонова пути в графе. 10 Построение остовного дерева графа. 5 2 Стиль программирования на языке PROLOG. Язык PROLOG с процедурной точки зрения. Представление фактов и правил в виде процедур. Использование правил для организации ветвления. Отсечение как оператор безусловного перехода. 5 2 Модульное программирование. Проекты. Примеры использования языка логического программирования PROLOG для решения задач искусственного интеллекта. Неполные структуры данных. Программирование второго порядка. 1, 2, 3, 2 Общие сведения о языках функционального 11 программирования. Соответствие между функциональными и императивными программами. Функциональные языки, строго функциональный язык. Конкретные реализации языков функционального программирования. Области применения языка функционального программирования LISP. Основы языка: рекурсивные функции и лямбда-исчисление А.Черча. Ссылки Часы Темы лекционных занятий на цели 7, 8, 9, 2 Основные особенности языка LISP. Элементарные понятия. 10 Символьные выражения: атомы и списки. Функции. Инфиксная и префиксная нотация. Программирование в функциональных обозначениях. 7, 8, 9, 2 Приемы программирования; представление и интерпретация 10 функциональных программ. Базовые функции. Предикаты. Псевдофункции. Определение функций. Задание параметров функции в лямбда-списке. Передача параметров и область их действия. Отладка программ. 7, 8, 9, 2 Вычисления в языке LISP. Управляющие структуры языка 10 LISP. Работа с контекстом. 7, 8, 9, 2 Предложения. Локальное присваивание. Последовательное 10 исполнение. Ветвление вычислений. Условное предложение. 7, 8, 9, 2 Циклические вычисления. Внутреннее представление списков. 10 Вычисления, изменяющие и не изменяющие структуру выражений. Свойства символа. 7, 8, 9, 2 Простая рекурсия. Рекурсия по значению. Рекурсия по 10 аргументу. Параллельная рекурсия. Взаимная рекурсия. 7, 8, 9, 2 Рекурсия более высокого порядка. Функциональные 10 аргументы. Функциональное значение функции. Применяющие функционалы. Отображающие функционалы. Массивы. Макросы. 4, 11, 12 1 Обзор основных вопросов, рассмотренных в дисциплине. Перспективы дальнейшего развития теории и практики функционального и логического программирования, применения функционального программирования, применение логического программирования в задачах искусственного интеллекта. Ссылки Темы лабораторных Часы Учебная деятельность на цели занятий 13, 14, 4 Знакомство с изучает возможности программной 15, 16 основами языка оболочки; логического использует способы представления программирования данных в виде фактов и правил PROLOG. вывода для записи программы на языке PROLOG; используя возможности, предоставляемые программной оболочкой, проверяет правильность работы созданной программы; оформляет результаты работы программы; оценивает полученные результаты. Ссылки Темы лабораторных Часы Учебная деятельность на цели занятий 13, 14, 4 Разработка использует способы представления 15, 16 программ, данных в виде фактов и правил использующих для вывода для записи программы на нахождения решений языке PROLOG; рекурсию и поиск с проверяет правильность работы возвратом. созданной программы; исследует различия в двух методах нахождения решений: рекурсии и поиске с возвратом; оформляет результаты работы программы; оценивает полученные результаты. 13, 14, 4 Разработка программ использует способы представления 15, 16 для работы с данных в виде фактов и правил рекурсивными вывода для записи программы на структурами данных языке PROLOG; (списками и проверяет правильность работы деревьями) созданной программы; исследует методы работы с рекурсивными структурами данных (списками и деревьями); оформляет результаты работы программы; оценивает полученные результаты. 13, 14, 4 Знакомство с использует способы представления 15, 16 основами языка данных в виде функций для записи функционального программы на языке LISP; программирования проверяет правильность работы LISP. созданной программы; оформляет результаты работы программы; оценивает полученные результаты. Структура учебной дисциплины: Блок 1. Рассмотрение круга задач, решаемых с применением языков логического и функционального программирования, рассмотрение особенностей декларативных языков программирования (вводная часть). (Цели 1-5) Язык логического программирования PROLOG Язык функционального программирования LISP Блок 2. Рассмотрение синтаксиса языков логического и функционального программирования. (Цели 6, 7, 8) Блок 3. Рассмотрение способов представления данных, методов и приемов логического и функционального программирования. (Цели 9, 10) Блок 4. Разработка программ для решения конкретных задач различных типов с выбором языка программирования, способов представления данных, методов и приемов логического и функционального программирования. (Цели 11-16) 5. УЧЕБНАЯ ДЕЯТЕЛЬНОСТЬ В течение семестра студентами выполняется курсовой проект. В рамках курсового проекта студентам предлагается реализовать программу с использованием языка логического или функционального программирования, в ходе курсового проектирования студенты разрабатывают программу на языке логического или функционального программирования, проверяют правильность работы программы, оценивают полученные результаты, оформляют пояснительную записку. Цель курсового проектирования – обобщить и структурировать знания, полученные в рамках дисциплины «Функциональное и логическое программирование», научить студентов разрабатывать и отлаживать программы с использованием языков логического или функционального программирования. Образец задания: Разработать программу для работы с бинарными упорядоченными деревьями. Реализовать следующие функции: создание дерева, загрузку дерева из файла, сохранение дерева в файле, добавление вершины с сохранением упорядоченности, удаление вершины, все виды обхода дерева, просмотр дерева в традиционном представлении (корень вверху, листьевые вершины внизу.) Требования к оформлению пояснительной записки: Пояснительная записка к курсовому проекту должна содержать: титульный лист, задание на курсовой проект, назначение программного продукта, описание данных, описание методов решения, описание разработанного программного продукта, описание пользовательского интерфейса, список использованной литературы и/или адресов www, приложение – исходные тексты с комментариями. 6. ПРАВИЛА АТТЕСТАЦИИ СТУДЕНТОВ ПО УЧЕБНОЙ ДИСЦИПЛИНЕ По окончании учебной дисциплины проводится устный экзамен. Экзаменационный билет включает два теоретических вопроса и одну практическую задачу. Для получения оценки «отлично» требуется правильно (75-100%) ответить на теоретические вопросы экзаменационного билета и дополнительные вопросы, правильно решить практическую задачу. Для получения оценки «хорошо» требуется правильно (50-75%) ответить на теоретические вопросы экзаменационного билета и дополнительные вопросы, правильно решить практическую задачу. Для получения оценки «удовлетворительно» требуется правильно (не менее 50%) ответить на теоретические вопросы экзаменационного билета и дополнительные вопросы, правильно решить практическую задачу. 7. СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ Основная литература: 1. 2. 3. 4. 5. 6. 7. 8. 9. Адаменко А.Н., Кучуков А.М. Логическое программирование и Visual Prolog. – СПб.: БХВ-Петербург, 2003. – 992 С. Братко И. Программирование на языке Пролог для искусственного интеллекта. – М.: Мир, 1990. – 560 С. Ин Ц., Соломон Д. Использование Турбо-Пролога. – М.: Мир, 1993. – 608 С. Клоксин У., Меллиш Д. Программирование на языке Пролог. – М.: Мир, 1987. – 336 С. Стерлинг Л., Шапиро Э. Искусство программирования на языке Пролог. – М.: Мир, 1990. – 235 С. Доорс Дж. и др., Рейблейн А.Р., Вадера С. Пролог - язык программирования будущего. – М.: ФиС, 1990. – 144 С. Стобо Дж. Язык программирования Пролог. – М.: Мир, 1993. – 368 С. Хювёнен Э., Сеппянен Й. Мир Лиспа. - М.: Мир, 1990. – 447 С. Хендерсон П. Функциональное программирование: применение и реализация. - М.: Мир, 1983. – 349 С. Дополнительная литература: 10. Новицкая Ю.В. Основы логического и функционального программирования (учебное пособие). – http://ermak.cs.nstu.ru/flp/ 11. Сырецкий Г.А. Информатика. Часть III. Основы логического программирования на PDC Prolog (учебное пособие). – Новосибирск: НГТУ, 1994. – 93 С. 12. Малпас Дж. Реляционный язык Пролог и его применение. – М.: Наука, 1990. – 463 С. 13. Янсон А. Турбо-Пролог в сжатом изложении. – М.: Мир, 1991. – 94 С. 14. Маурер У. Введение в программирование на языке ЛИСП. – М.: Мир, 1978. – 104 С. 8. КОНТРОЛИРУЮЩИЕ МАТЕРИАЛЫ ДЛЯ АТТЕСТАЦИИ СТУДЕНТОВ ПО ДИСЦИПЛИНЕ Список экзаменационных вопросов: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Сравнительная характеристика декларативных и процедурных языков программирования. Языки PROLOG и LISP как языки декларативного и функционального программирования. Основные отличия, области применения. Предикаты. Предложения: факты и правила. Запросы (цели). Переменные. Основные секции программы. Основные стандартные домены. Сопоставление и унификация. Предикат равенства. Основные принципы поиска с возвратом. Управление поиском решений (предикат fail). Управление поиском решений (предикат !). Управление поиском решений (динамическое отсечение). Детерминизм. Анализ и контроль потока параметров. Простые объекты данных. Составные объекты данных. Многоуровневые составные объекты данных. Аргументы множественных типов. Предикат repeat. Рекурсия. Хвостовая рекурсия. Деревья: объявление и обход. Списки: объявление и примеры работы. Составные списки: объявление и примеры работы. Динамические базы данных: объявление и использование. Динамические базы данных: загрузка и сохранение фактов. Динамические базы данных: добавление и удаление фактов. Стандартные предикаты ввода и вывода. Работа со строками. Работа с файлами: чтение и запись. Графы: представление графов. Графы: действия над графами. Обработка ошибок и исключительных ситуаций. Основы языка LISP. Лямбда-выражение и лямбда-вызов. Символьные выражения: атомы и списки. Функции, определение функций. Параметры функции: передача и область действия. Базовые функции. Списки: работа со списками. Управляющие структуры. Структуроразрушающие функции. Внутреннее представление списков. Точечная пара. Свойства символа. Действия со списком свойств символа. 39. 40. 41. 42. 43. 44. Простая рекурсия. Рекурсия по значению и рекурсия по аргументу. Параллельная рекурсия. Взаимная рекурсия. Рекурсия более высокого порядка Применяющие функционалы. Отображающие функционалы. Ассоциативные списки. Примеры экзаменационных задач: 1. Написать программу для вычисления xn только с помощью умножения (построить дерево целей). 2. Написать программу для циклического сдвига списка на n элементов влево (построить дерево целей). 3. Имеется база данных, содержащая факты numbers(n1, n2), где n1 и n2 – целые числа. Написать программу для удаления всех фактов, где n1=n2. 4. Написать программу для перевода списка чисел, записанных с использованием римских цифр, в список чисел, записанных с использованием арабских цифр. Использовать факты вида trans(“I”, 1). 5. Написать программу для нахождения числа вершин с положительными значениями в дереве целых (построить дерево целей).