
- •Факультет информационных технологий ю.П.Кораблин Денотационная семантика языков программирования
- •Денотационная семантика языков программирования
- •Семантические определения
- •Циклические конструкции и их семантика
- •Методы доказательства свойств программ
- •Метод доказательства, основанный на свойстве фиксированных точек
- •Метод численной индукции
- •Метод индукции фиксированной точки
- •Свойства условного оператора
- •Примеры решения задач методами денотационной семантики
РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ СОЦИАЛЬНЫЙ УНИВЕРСИТЕТ
Факультет информационных технологий ю.П.Кораблин Денотационная семантика языков программирования
Методические указания для самостоятельной работы студентов
специальностей 230100.62 и 230105.65
Москва 2010
Денотационная семантика языков программирования
В этом пособии будет рассмотрена стандартная денотационная семантика языков программирования императивного типа, т.е. языков, в которых имеется концепция машинного состояния, которое изменяется командами.
Семантические определения
Вначале мы определим простейший язык программирования, и зададим его семантику с помощью семантических функций, отображающих конструкции языка в некоторую семантическую область. В дальнейшем мы будем постепенно расширять язык, вводя в него новые конструкции, добавляя, соответственно, и новые семантические определения. На первых порах нас не будут интересовать детали изменения состояния. Кроме того, не будет в языке определяемых программистом имен. Прежде чем определить язык программирования L, введем следующие синтаксические области:
С
Cmd
( команды )
E
Exp
( выражения )
c Com ( примитивные команды )
p Prе ( примитивные предикаты )
Тогда синтаксис языка L, может быть задан следующим образом:
C ::= c | e | if E then C0 else C1 fi | C0; C1
E ::= p | true | false | if E0 then E1 else E2 fi.
Результатом выполнения команды является изменение состояния, и в качестве подходящего значения команды мы будем брать функции изменения состояния. Таким образом, если S - множество состояний, то значением команды будет элемент из области S → S.
Предположим, что выражение не имеет побочного эффекта, т.е. вычисление выражения не производит изменения состояния. Ограничим также область значений выражений областью истинностных значений
Т = {true,false, ⊥}.
Результат выражения зависит от состояния. Таким образом, значением выражения будет элемент из области S → T. Из вышесказанного следует, что семантическими областями (областями значений) для языка L являются:
t T ( истинностные значения )
σ S ( машинные состояния )
γ (S → S) ( значения команд )
ω (S → T) ( значения выражений )
Прежде, чем задать семантические функции, определим условный оператор и введем понятие строгой функции.
Определение Для x P, где P - область, содержащая Т как слагаемое (P = P1+P2+... +Pn), и z, y D, где D – некоторая область значений.
Определение Функция f: A → B называется строгой (записывается strict f), если для ⊥∈ A f(⊥) = ⊥ ∈ B, т.е.
Семантические функции команд ℂ: Cmd ⟶ (S ⟶ S) определяются следующим образом:
,
где -
функция, ассоциируемая с командой "c";
-
тождественная функция, (т.е. I ≡ λσ.σ);
ℂ
=
λσ.𝔼
σ
⟶
ℂ
σ,
ℂ
σ;
ℂ
= ℂ
∘
ℂ
.
Здесь и далее двойные скобки " " и " " используются для выделения синтаксических конструкций, к которым применяется семантическая функция. Семантическая функция 𝔼, определяющая значения выражений языка L, будет определена ниже.
Для лучшего понимания пункта, определяющего семантику условной команды, зададим состояние σ, к которому применяется соответствующая функция. Тогда:
ℂ
=
𝔼
σ
⟶
ℂ
σ,
ℂ
σ,
т.е.
функция 𝔼
применяется к состоянию σ,
и результат используется для выбора
альтернатив ℂ
σ,
i=0,1.
ℂ
σ
означает применение соответствующей
функции ℂ
к состоянию σ.
Запись вида γ1∘γ0 в последнем пункте семантического определения означает функциональную композицию, т.е. (γ1∘γ0) = γ1(γ0σ).
Семантические функции для выражения языка L имеют аналогичное функциональное определение.
𝔼 : Exp → (S → T) и задается следующим образом:
𝔼
= strict
ω,
где ω
– функция, ассоциированная с “p”;
𝔼
= strict(λσ.true);
𝔼
= strict(λσ.false);
𝔼
= λσ.
𝔼
σ
⟶
𝔼
σ,
𝔼
σ.
Пусть,
например, σ
- подходящее состояние, т.е. σ
≢
⊥.
Тогда 𝔼
σ
= true.
Если же σ
≡ ⊥,
то
𝔼
σ
= ⊥.
Отметим, что в наших определениях используются семантические области, образованные из базисных областей значений, таких как целостные, истинностные и т.д., являющиеся п.ч.п.