Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры к ГОСАМ (все билеты).doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.56 Mб
Скачать

Вопрос 1. Конкретные реализации языков функционального программирования: язык программирования Лисп, основные объекты, примитивы, списки, правила составления программ.

Основная особенность ЛИСПа – в нем поддерживается один составной тип данных списки. Самый популярный диалект языка лисп common lisp. В основе языка Lisp лежит использование двух основных конструкций - списков и атомов. Атомом в языке Lisp называется имя, состоящее из букв, цифр и специальных знаков. Атом, не являющийся числом, называется символом (т.е. атом a10 это символ, а атом 10 - не символ). Обычно интерпретатор Lisp не делает разницы между прописными и строчными буквами. Иными словами, символы Atom, ATOM или atom эквивалентны .Как уже было сказано, наряду с символами в Lisp также используются числа, которые также представляют собой ограниченную пробелами последовательность знаков. Основными типами чисел являются целые и дробные. Все числа в Lisp являются константами, в то время как символы являются по умолчанию переменными.

Другой важной конструкцией языка являются списки. Список – это структура, которая либо пуста, либо состоит из головы и хвоста. Хвост также является списком. Список представляет собой заключённый в скобки набор атомов или списков, разделённых пробелами. Примером списка может быть, например, (a b) или ((a) (b)). Списки предназначены для хранения структурированной (в общем случае древовидной) информации и могут использоваться для хранения сложных данных. В языке Lisp также имеется специальный символ для представления пустого списка, т.е. (). Это символ NIL, также означающий логическую ложь. Соответственно, логическую истину обозначает символ T.

В Лиспе принята единообразная префиксная нотация. Вычисляя значение вводимого выражения, интерпретатор по первому символу определяет, что оно представляет собой – функция или данные. Для запрета на вычисления используется функция quote, возвращающая аргумент. Вычисление функции в программе представляет собой замену её вызова на её результат.

Лисп определяют как беззнаковый язык программирования, тип определяется во время выполнения программы. Определение анонимной функции представляет собой лямбда выражение в виде (lambda (p1...pn) F), где p – список формальных параметров, F – тело лямбда-выражения. Для связывания символа с лямбда-выражением в коммон лиспе существует функция defun (defun symbol (p1...pn) F).

Вопрос 2. Семантическая теория программ. Вычислимость и разрешимость

Некоторые вопросы семантической теории программ.

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

Т.п. сформировалось на основе двух моделей вычислений:

  • последовательных программ с памятью или операторных программах;

  • рекурсивных программ.

Обе модели строятся над абстрактной алгебраической системой <D,,>, образованной предметной областью D, конечным набором (сигнатурой) функциональных  = {1, 2, … , m} и предикатных ={1,… n} символов с заданным для каждого символа числом его аргументов (арностью).

Определение класса программ слагается из трех частей:

  • схемы программ (синтаксиса)

  • интерпретации;

  • семантики.

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

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

Семантика – это способ сопоставления каждой программе результата ее выполнения.

Как правило, с программами связывают вычисляемые ими функции.

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

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

Каждому распознавателю сопоставляется некоторый предикатный терм, а преобразователю – оператор присваивания, имеющий вид y =, где y – символ переменной, а  - функциональный терм.

Конечная совокупность всех переменных в схеме образуют ее память.

Интерпретация в дополнение к конкретезации базовых операций предписывает каждой переменной область ее изменения, а каждой константе – ее значния.

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

Для программ с памятью обычна т.н операционная семантика,состоящая из алгоритма выполнения программы на заданном состоянии памяти.

  • Программа выполняется при движении по графу переходов:

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

++ при попадании на преобразователь с оператором x := a вычисляется значение a и присваевается переменной x.

  • Результат выполнения программы – состояние памяти при попадании на выходную вершину.

Схема рекурсивной программы, или рекурсивная схема, использует кроме функциональных т.п. условные термы, образуют вместо (первыми (функциональными) множество вычислительных термов, если задаем условный терм в виде (|1 | 2), где  - предикатный терм, а 1 и 2 – вычислительные термы.

n! = n(n-1)! = n(n-1)(n-2)!

Указанные формализмы отмечают уровни изобразительных средств языков программирования:

++ если операторные схемы близки к структуре машинной программы

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

Исследования по теоретическому программированию несут в себе отпечаток общематематических средств, используемых при изучении моделей программы.

++ формально-комбинаторные методы формируют теорию схем программ, которая изучает свойства программ, инвариантные относительно выбора интерпретации базовых операций.

++ логические методы изучают способы определения семантики программы, а так же ищут закономерность в процессе построения программы.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]