Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экз языки.docx
Скачиваний:
20
Добавлен:
20.09.2019
Размер:
67.44 Кб
Скачать

Ответы на экз. вопросы по языкам

  1. Формальные системы и языки

Формальные системы (ФС)

а) ППФ – правильно построенные формулы в алфавите А,

б) ; А* – множество слов построенное в алфавите А.

в) – аксиомы являются подмножеством ППФ.

г) ПВ – правила вида , что означает, из совокупности ППФ выводима ППФ. В любой ФС множество формул ППФВ выводятся из ППФА с помощью правил ПВ. При этом {ППФВ}{ППФ}, – называются выводимыми формулами. Например, исчисление высказываний является формальной системой, где ППФ являются формулы, построенные из имён переменных, знаков операций ( – конъюнкция,  – дизъюнкция,  – отрицание,  – импликация) и скобок. Выделяются ППФ, которые объявляются аксиомами и единственное правило вывода «modus ponens». В исчислении высказываний порождаются только такие ППФ, которые могут интерпретироваться как тождественно истинные формулы (тавтологии) и только они.

Формальные системы (ФС) – это совокупность абстрактных объектов, не связанных с внешним миром, в котором представлены правила оперирования множеством символов в строго синтаксической трактовке без учета смыслового содержания. (А никто и не говорил, что будет легко :)

Признаки формальной системы:

Наличие конечного алфавита (словарь).

Правило построений формул. Формулы не могут быть неправильно построенными, но могут быть неверными.

Должно быть задано конечное число аксиом. Аксиома – это формула, считающейся истинной без доказательства.

Правила вывода. Позволяют выводить теоремы из аксиом или других теорем. Теорема – формула, истинность которой доказана с помощью правил вывода из аксиом или других теорем.

Множество символов и множество формул в совокупности определяют язык или сигнатуру формальной теории.

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

Формула называется теоремой, если существует вывод, в котором эта формула является последней.

В общем случае язык – это заданный набор символов и правил, устанавливающих способы комбинации этих символов между собой для записи осмысленных текстов. Основой любого естественного или искусственного языка является алфавит, определяющий набор допустимых символов языка.

Алфавит – это счётное множество допустимых символов языка. Будем обозначать это множество символом V. Интересно, что согласно формальному определению, алфавит не обязательно должен быть конечным (перечислимым) множеством, но реально все существующие языки строятся на основе конечных алфавитов.

Языком L над алфавитом V: L(V) называется некоторое счетное подмножество цепочек конечной длины из множества всех цепочек над алфавитом V. Из этого определения следуют два вывода: во-первых, множество цепочек языка не обязано быть конечным; во-вторых, хотя каждая цепочка символов, входящая в язык, должна иметь конечную длину; эта длина может быть сколь угодно большой и формально ничем не ограничена.

Способы задания языков

Каждый язык – это множество цепочек символов над некоторым алфавитом. Но кроме алфавита язык предусматривает и задание правил построения допустимых цепочек, поскольку обычно далеко не все цепочки над заданным алфавитом принадлежат языку. Символы могут объединяться в слова или лексемы – элементарные конструкции языка. На их основе строятся предложения – более сложные конструкции. И те и другие, в общем виде, являются цепочками символов, но предусматривают некоторые правила построения. Таким образом, необходимо указать эти правила, или, строго говоря, задать язык.

Язык задать можно тремя способами:

– перечислением всех допустимых цепочек языка: является чисто формальным и на практике не применяется

– указанием способа порождения цепочек: предусматривает некоторое описание правил, с помощью которых строятся цепочки языка (грамматика)

– определением метода распознавания цепочек языка: построение некоторого логического устройства (распознавателя) – автомата, который на входе получает цепочку символов, а на выходе выдает ответ: принадлежит или нет эта цепочка заданному языку.

Синтаксис и семантика языка

Синтаксис языка – это набор правил, определяющий допустимые конструкции языка. Синтаксис определяет «форму языка» – задает набор цепочек символов, которые принадлежат языку. Чаще всего синтаксис языка можно задать в виде строгого набора правил, но полностью это утверждение справедливо только для чисто формальных языков.

Семантика языка определяет значение предложений языка. Семантика определяет «содержание языка» – задает значение для всех допустимых цепочек языка. Семантика для большинства языков определяет неформальными методами (отношения между знаками и тем, что они обозначают, и изучаются семиотикой). Чисто формальные языки лишены какого-либо смысла.

Лексика – это совокупность слов (словарный запас) языка. Слово или лексическая единица (лексема) языка – это конструкция, которая состоит из элементов алфавита языка и не содержит в себе других конструкций. Иначе говоря, лексическая единица может содержать только элементарные символы и не может содержать других лексических единиц.

2. Теория моделей

Теория моделей — раздел математической логики, который занимается изучением связи между формальными языками и их интерпретациями, или моделями.

Классическая теория моделей первого порядка

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

Теорема компактности (Мальцева)

Множество формул первого порядка имеет модель тогда и только тогда, когда модель имеет каждое его конечное подмножество.

6. Лисп. Файлы, Базы данных

Common Lisp предоставляет мощную библиотеку для работы с файлами. Средства Common Lisp, предназначенные для ввода/вывода, аналогичны имеющимся в других языках программирования. Common Lisp предоставляет потоковую абстракцию операций чтения/записи, а для манипулирования файловыми объектами в независимом от операционной системы формате - абстракцию файловых путей. Кроме того, Common Lisp предоставляет некоторое количество уникальных возможностей, такие как чтение и запись s-выражений.

Самая фундаментальная задача ввода/вывода - чтение содержимого файла. Для того, чтобы получить поток, из которого вы можете прочитать содержимое файла, используется функция OPEN. По умолчанию, OPEN возвращает посимвольный поток ввода данных, который можно передать множеству функций, считывающих один или несколько символов текста: READ-CHAR считывает одиночный символ; READ-LINE считывает строку текста, возвращая ее как строку без символа конца строки; функция READ считывает одиночное s-выражение, возвращая объект Lisp. Когда работа с потоком завершена, вы можете закрыть его с помощью функции CLOSE.

До сих пор мы использовали строки для представления имен файлов. Однако, использование строк как имен файлов привязывает код к конкретной операционной и файловой системам. Точно так же, если конструировать имена в соответствии правилам конкретной схемы именования (скажем, разделение директорий знаком "/"), то вы также привязаны к одной определенной файловой системе.

Для того, чтобы избежать подобной непереносимости программ, Common Lisp предоставляет другое представление файловых имен: объекты файловых путей. Файловые пути представляют собой файловые имена в структурированном виде, что делает их использование легким без привязки к определенному синтаксису файловых имен. А бремя по переводу между строками в локальном представлении – строками имен – и файловыми путями ложится на плечи реализаций Lisp.

Как правило, когда возникает необходимость в файловом имени, вы можете использовать как строку имени (namestring), так и файловый путь. Выбор зависит от того, откуда произошло имя. Файловые имена, предоставленные пользователем – например, как аргументы или строки конфигурационного файла – как правило, будут строками имен, так как пользователь знает какая операционная система у него запущена, поэтому не следует ожидать, что он будет беспокоиться о представлении файловых имен в Lisp. Но следуя общепринятой практике, файловые имена будут представлены файловыми путями, так как они переносимы. Поток, который возвращает OPEN, также представляет файловое имя, а именно, файловое имя, которое было изначально использовано для открытия этого потока. Вместе эти три типа упоминаются как указатели файловых путей. Все встроенные функции, ожидающие файловое имя как аргумент, принимают все три типа указателя файловых путей.

Файловый путь – это структурированный объект, который представляет файловое имя, используя шесть компонентов: хост, устройство, каталог, имя, тип и версия. Большинство из них принимают атомарные значения, как правило, строки; только директория – структурный компонент, содержащий список имен каталогов (как строки) с предшествующим ключевым словом: :absolute (абсолютный) или :relative (относительный).

Использование баз данных и информационных систем становиться неотъемлемой составляющей деловой деятельности современного человека и функционирования преуспевающих организаций. В связи с этим большую актуальность приобретает освоение принципов построения и эффективного применения соответствующих технологий и программных продуктов: систем управления базами данных, CASE-систем автоматизации проектирования, средств администрирования и защиты базы данных и других.

Классической моделью создания больших систем в рамках Лиспа является итеративная разработка, ставящая себе целью постепенное «сближение» программы с предметной областью. Она включает в себя такие подходы, как метапрограммирование, т. е. программирования самого языка; проблемно-ориентированное программирование, подразумевающее адаптацию языка к предметной области; и, наконец, т. н. разработка «от данных» (data-driven design).

Redis — это одна из новых баз данных нереляционного типа, которая по сути представляет собой персистентную хеш-таблицу. Кроме того в ней поддерживается работа с данными как со списками, множествами и отсортированными множествами (единственное, что не поддерживается — это вложенность этих структур). Эти базовые структуры данных являются родными и для Лиспа, поэтому Redis выглядит очень естественным дополнением к Лисп-среде.

Redis — документо-ориентированное сетевое журналируемое хранилище данных типа «ключ-значение» с открытым исходным кодом. Хранит базу данных в оперативной памяти, снабжена механизмами снимков для обеспечения постоянного хранения. Имеет библиотеки для работы со многими существующими языками программирования, такими как C, C++, C#, Clojure, Common Lisp и др.

Высокоуровневый язык должен позволять напрямую оперировать такой сущностью, как функция, а не требовать для этого задействовать другие сущности такого же уровня абстракции, скажем, классы. Подход к созданию высокоуровневого языка можно увидеть на примере Common Lisp, в котором для каждой задачи выбирается подходящая концепция, будь то объект, сигнал или место.

Примерами использования мета-объектного протокола также являются инфраструктурные системы языка, реализованные в виде библиотек:

object-persisance: Elephant, AllegroCache

работа с БД: CLSQL

интерфейс пользователя: Cells

Библиотека CLSQL создана для унификации работы с различными SQL базами данных. Кстати, на ее примере можно увидеть проявление мультипарадигменности Common Lisp: у библиотеки есть как объектно-ориентированный интерфейс (ORM), реализованный на основе CLOS, так и функциональный (на основе функций и макросов чтения). С помощью мета-объектного протокола стандартный класс языка расширяется специальным параметром — ссылкой на таблицу БД, к которой он привязан, а описания его полей (в терминологии Lisp: слотов) — дополнительными опциональными параметрами, такими как: ограничение уникальности, ключа, функция-преобразователь при записи и извлечении значения из БД и т.д.