Основные положения программирования на Лиспе
МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ
По выполнению лабораторных работ
По дисциплине
ДЕКЛАРАТИВНЫЙ ПОДХОД В ИС
Направление подготовки 230000 — | Информатика и вычислительная техника |
230400 — | Информационные системы и технологии |
Иркутск - 2014
Введение
В грамматике различает три наклонения предложений: изъявительное (повествовательное), вопросительное и императивное (повелительное). И если в обычной речи преобладают повествовательные предложения, то в программировании повелительные. В традиционном представлении программа - последовательность команд, выполняемых компьютером. Но существует и другой стиль программирования, программирование в повествовательном наклонении, при котором программа - просто совокупность утверждений. Этот стиль (или, как сейчас модно говорить, парадигма) получил название декларативное программирование. В противоположность первый стиль называют императивным программированием. Соответственно и языки программирования делят на императивные и декларативные. Наиболее важными разновидностями декларативного программирования, являются функциональное и логическое (или реляционное) программирование.
Решая достаточно сложную задачу, мы обычно сначала создаем модель в некоторой формальной системе, а затем переписываем найденное решение в виде программы, то есть, переводим с одного формального языка на другой. Этот второй этап не имеет отношения собственно к процессу решения, и в то же время требует большого количества усилий и специальных навыков. Возникло даже разделение труда среди программистов: одни (аналитики) думают, как решить задачу, а другие (кодировщики) записывают найденное первыми решение на языке программирования. В основе декларативных языков лежит не какая-то машинная модель, а логика и математика. Рассмотрим уравнение "Алгоритм = Логика + Управление". При программировании на императивном языке, эти две составляющих переплетены и у программиста нет выбора, кроме как вникать в низкоуровневые подробности выполнения программ. В декларативных языках, логика и управление разделены. Необходимость иметь дело только (или главным образом) с логическим компонентом значительно упрощает программирование. Декларативную программу, вообще говоря, проще написать и, что немаловажно, легче понять, чем соответствующую императивную программу. Кроме того, возникает возможность передачи ответственности за создание управления компьютеру. Часто наличие наиболее эффективного алгоритма не настолько уж важно и можно удовлетвориться разумно эффективным алгоритмом, который находит сама система. Более того, появляются интересные возможности использовать нетривиальные алгоритмы управления, такие как недерминированные, "ленивые" и параллельные вычисления.
Цель изучения дисциплины: расширение кругозора специалиста в области разработки программно-информационных систем путем изучения двух важных стилей программирования: функционального и логического, выяснение взаимосвязи математической логики и программирования, изучение средств программирования второго порядка и основных приемов программирования систем искусственного интеллекта.
По результатам изучения дисциплины студент должен знать:
· математические основы функционального и логического программирования;
· синтаксис описания программ в функциональном стиле;
· приемы программирования в функциональном стиле;
· синтаксис языка Пролог;
· операционную и декларативную семантику языков логического вывода;
· приемы логического программирования;
· основы программирования для задач искусственного интеллекта.
должен уметь:
· писать программы в строго функциональном стиле;
· использовать в работе концепции функционального программирования;
· писать программы на языке Пролог;
· создавать простейшие экспертные системы на основе баз знаний и логического вывода.
Раздел 1. Функциональное программирование
Лабораторная работа № 1.
Тема: Ознакомительная работа в среде MuLisp. Базовые функции Лиспа. Символы, свойства символов. Средст-ва языка для работы с числами.
Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.
Основные положения программирования на Лиспе.
Загрузка системы, системный редактор.
Базовые функции языка. Символы, свойства символов.
Средства языка для работы с числами.
Задание к лабораторной работе.
Вопросы.
Основные положения программирования на Лиспе.
n Лисп ориентирован на обработку нечисловых задач. Он основан на алгебре списочных структур, лямбда-исчислении и теории рекурсий.
n Язык имеет функциональную направленность, т. е. любое предложение заключенное в скобки, введенное вне редактора считается функцией и выполняется сразу после нажатия «ENTER».
n Чтобы предотвратить вычисление значения выражения, нужно перед этим выражением поставить апостроф «’». Апостроф перед выражением - это на самом деле сокращение лисповской функции QUOTE.
n В Лиспе формы представления программы и обрабатываемых ею данных одинаковы. И то и другое представляется списочной структурой имеющей одинаковую форму.
n Типы данных не связаны с именами объектов данных, а сопровождают сами объекты. Переменные могут в различные моменты времени представлять различные объекты.
n Основные типы данных языка - атомы и списки.
Атомы - это символы и числа.
Список - упорядоченная последовательность, элементами которой являются атомы либо списки. Списки заключаются в круглые скобки, элементы списка разделяются пробелами. Несколько пробелов между символами эквивалентны одному пробелу. Первый элемент списка называется «головой», а остаток , т. е. список без первого элемента, называется «хвостом. Список в котором нет ни одного элемента, называется пустым и обозначается «()» либо NIL.
n Символ - это имя, состоящее из букв, цифр и специальных знаков, которое обозначает какой-нибудь предмет, объект, действие. В Лиспе символы обозначают числа, другие символы или более сложные структуры, программы (функции) и другие лисповские объекты. Символы могут состоять как из прописных, так и из строчных букв, хотя в большинстве Лисп-систем, как и в описываемой здесь версии MuLisp, прописные и строчные буквы отождествляются и представляются прописными буквами.
n Символы T и NIL имеют в Лиспе специальное назначение: T - обозначает логическое значение истина, а NIL - логическое значение ложь.
n При генерации или считывании MuLispом нового символа, за его величину принимается он сам. Такая ссылка символа на себя называется автоссылкой.
n Создание программы на Лиспе - написание некоторой функции, возможно сложной, при вычислении использующей другие функции либо рекурсивно саму себя. На практике, написание программ осуществляется записью в файл определений функций, данных и других объектов с помощью имеющегося в программном окружении редактора. Файлу присваивается расширение LSP.
n Необязательно делать отступы в строках выражений, входящих в ваши функции. На самом деле, по желанию, вы можете написать всю программу в одну строку. Однако отступы в строках и пустые строки делают структуру программы понятней и более читабельней. Так же выравнивание начальных и конечных скобок основных выражений помогают убедиться в балансе ваших скобок.
n Определения функций могут храниться в файлах и загружаться используя функцию LOAD:
(load <имя файла>)
Эта функция загружает файл выражений и выполняет эти выражения. <Имя файла> - это строковая константа, которая представляет собой имя файла без расширения (подразумевается расширение ".lsp"). Если операция успешно завершена, LOAD возвращает имя последней функции, определенной в файле. Если операция не выполнена, LOAD возвращает имя файла в виде строкового выражения.
Функция LOAD не может вызываться из другой функции LISP. Она должна вызываться непосредственно с клавиатуры, в то время как ни одна другая функция LISP не находится в процессе выполнения.
n Интерпретатор считает файлами, содержащими исходные тексты программ на Лиспе, все файлы, имеющие расширение LSP.
n В связи с тем, что диалект MuLisp включает в себя сравнительно небольшой набор базовых функций, указанная Лисп-система обеспечивается библиотеками Лисп-функций, дополняющими базовый набор функциями, имеющимися в Common Lisp-е и других диалектах(Common.lsp, Array.lsp и т. д. ...).
Загрузка системы.
Запуск системы MuLisp осуществляется командой:
MuLisp87.com
Для загрузки библиотеки с базовыми функциями необходимо набрать следующую команду:
(LOAD Common.lsp)