Глава 1. Язык реализации: TSG

advertisement
Глава 1. Язык
реализации: TSG
Структура курса
Область возможных
новых исследований
Иные
методы
Иные
приложения
Методы
Приложения
Базовые
понятия и методы метавычислений метавычислений
метавычислений
Суперint, SR, ptr
Приложения
компиляция
суперкомпиляции,
scp
в том числе
Окрестностный
анализ
nan
Инверсное
вычисление
ura
Специализация
программ
Инверсное
программирование
Окрестностное
тестирование
Реализация
нестандартных
семантик
[1] С.М.Абрамов «Метавычисления и их применения»
[2] Л.В.Парменова «Метавычисления и их применения. Суперкомпиляция»
Язык программирования
 Определение [А. П. Ершов] Язык программирования
L = (PL, DL, SL), где
 PL — синтаксис, множество синтаксически
правильных программ (строк), обычно заданное
грамматикой
 DL — предметная область, множество
данных; иногда определяют еще входные DinL,
выходные DoutL, промежуточные данные DrunL
 SL :: PL×DL→DL — семантика, функция
(частичная и вычислимая), которая определяет,
выдает ли какой-либо результат rDL (или не
выдает) программа pPL на входных данных
dDL:
p d * Lr
SL(p,d) = r
Предметная область
Предметная область D:
D = (ATOM Atoms) | (CONS D D)
 Atoms — конечное множество атомов
(будем использовать строки)
S-выражения — заимствованы из Лиспа.
Стандартное представление строк:
"ABBA"
 (CONS
(ATOM "A") (CONS (ATOM "B")
(CONS (ATOM "B") (CONS (ATOM “A")
(ATOM "Nil")))))
Предметная область
Сокращенная запись атомов:
(ATOM "string") 'string
 "ABBA"
(CONS 'A (CONS 'B (CONS 'B (CONS 'A 'Nil))))

Универсальность D: таких структур достаточно
для представления любых данных
А-значeние — атом, (ATOM a)
Е-значение — любое значение
 либо атом (ATOM a)
 либо CONS-пара e-значений: (CONS е е)
Синтаксис TSG-программ
 prog ::= [def1,... defn]
1≤n
 def ::= (DEFINE fname [parm1,...parmn] term) 0≤n
 term ::= (ALT cond term1 term2 )
| (CALL fname [arg1,... argn])
0≤n
| e-exp
 cond ::= (EQA? a-exp1 a-exp2)
| (CONS? e-exp e-var1 e-var2 a-var)
 a-exp ::= a-val | a-var
 e-exp ::= a-val | a-var
| e-var | (CONS e-exp1 e-exp2)
 parm ::= a-var | e-var
 arg ::= a-exp | e-exp
 a-var ::= (PVA name)
 e-var ::= (PVE name)
Синтаксис TSG-программ
Все имена функций в определениях различны
Каждая вызываемая функция должна быть
определена
Каждая переменная, используемая в выражении,
должна быть определена в окружающем
контексте
 (DEFINE fname [v1,... vn] term)
v1,... vn можно использовать в term
 (ALT (CONS? exp ev1 ev2 av) term1 term2)
ev1 ev2 можно использовать в term1
av можно использовать в term2
Синтаксис TSG-программ
PVA-переменная (PVA "name")
a.name
может принимать только a-значения
PVE-переменная (PVE "name")
e.name
может принимать любые е-значения
Как следствие:
 значением a-выражения может быть только
a-значение
 значением е-выражения может быть только
е-значение
Синтаксис TSG-программ
Совместимость а/е-типов при вызове
функций:
 (DEFINE fname [prm1,...prmn] term)
 (CALL
fname [arg1,... argn ])
 Длины списков параметров и аргументов
должны быть равны
 Если prmk — a-переменная, то
argk — a-выражение (если prmk — епеременная, то argk — е-выражение ...)
Синтаксис TSG-программ
Совместимость а/е-типов при вызове
программы:
 p=[(DEFINE
 dkD:
main[prm1,...prmn] term),…]
p [ d1 ,... dn ] * ...
списков параметров у main и
входных данных должны быть равны
 Если prmk — a-переменная, то
dk — a-значение (если prmk — eпеременная, то dk — е-значение...)
 Длины
Проверка вхождения одной
строки в другую
 match = [
(DEFINE "Match"[e.subs, e.str]
(CALL "CheckPos"[e.subs, e.str, e.subs, e.str])),
(DEFINE "CheckPos"[e.subs, e.str, e.subs1, e.str1]
(ALT (CONS’ e.subs e.subs-head e.subs-tail a._)
(ALT (CONS’ e.subs-head e._ e._ a.subs-head)
’FAILURE
(ALT (CONS’ e.str e.str-head e.str-tail a._)
(ALT (CONS’ e.str-head e._ e._ a.str-head)
’FAILURE
(ALT (EQA’ a.subs-head a.str-head)
(CALL "CheckPos"[e.subs-tail, e.str-tail,
e.subs1, e.str1])
(CALL "NextPos"[e.subs1, e.str1])))
’FAILURE))
’SUCCESS)),
(DEFINE "NextPos"[e.subs, e.str]
(ALT (CONS’ e.str e._ e.str-tail a._)
(CALL "Match"[e.subs, e.str-tail])
’FAILURE)) ]
Определение семантики TSG
SR :: PR×DR→DR — семантика, функция
(частичная и вычислимая), которая
определяет, выдает ли какой-либо
результат rDR (или не выдает)
программа pPR на входных данных
dDR:
pd* Rr
SR(p,d) = r
Подход: определение семантики через
определение интерпретатора
Определение семантики TSG
 Среда — список пар
env = [… (var := value) …]
 Состояние вычисления — пара
s = (term, env)
 Процесс process(p,d) вычисления
программы p над данными d —
последовательность переходов от одного
состояния вычисления программы p к
другому
pd
r
pd* r
process(p,d) = s0 s1 … sn
Вспомогательные функции в
описании интерпретатора
getDef fname prog — в программе prog
находит определение функции с именем fname

getDef fn p =
head[ d | d@(DEFINE fn' _ _)<-p, fn' == fn]
mkEnv vars vals — построение среды по списку
переменных vars и списку значений vals

mkEnv vars vals = zipWith (:=) vars vals
Пример:

mkEnv [a.x, a.y, e.z, e.u] ['A, 'B, (CONS 'D 'E), 'F ]
= [a.x:='A, a.y:='B, e.z:=(CONS 'D 'E), e.u:='F]
Вспомогательные функции в
описании интерпретатора
t /. env —замена в t вхождений переменных на
их значения из env, «посчитать значение
выражения на среде». Пример:

(CONS (CONS a.x e.z) a.y)/.
[a.x:='A, a.y:='B, e.z:='C] =
(CONS (CONS ’A ’C) ’B)
env+.env' — обновление среды env средой
env'. Пример:

[a.x:='A,a.y:='B,e.z:='C] +.
[e.z:=(CONS 'D 'E),e.u:='F] =
[e.z:=(CONS 'D 'E),e.u:='F,a.x:='A,a.y:='B]
Интерпретатор языка TSG (1/2)
 int :: ProgR -> [EVal] -> EVal
int p ds = eval s p
where (DEFINE f prms _) : p' = p
e = mkEnv prms ds
s = ((CALL f prms), e)
 eval :: State -> ProgR -> EVal
eval s@((CALL f args), e) p = eval s' p
where DEFINE _ prms t' = getDef f p
e' = mkEnv prms (args/.e)
s' = (t',e')
eval s@((ALT c t1 t2), e) p = case cond c e of
TRUE ue -> eval (t1,e+.ue) p
FALSE ue -> eval (t2,e+.ue) p
eval s@(exp,e)
p = exp/.e
Интерпретатор языка TSG (2/2)
(функция cond)
 data CondRes = TRUE Env | FALSE Env
 cond :: Cond -> Env -> CondRes
cond (EQA? x y)
e = let x' = x/.e; y' = y/.e in
case (x', y') of
(ATOM a, ATOM b) | a==b -> TRUE [ ]
(ATOM a, ATOM b)
-> FALSE[ ]
cond (CONS? x vh vt va) e = let x' = x/.e in
case x' of
CONS h t
->TRUE [vh:=h,vt:=t]
ATOM a
->FALSE[va:=x']
Глава 1 — обзор и выводы
Предметная область D:
D = (ATOM Atoms) | (CONS D D)
Синтаксис TSG. Плоский функциональный
полный язык, типизированные программные
переменные, два вида условий:
(EQA? a-exp1 a-exp2)
(CONS? e-exp e.i e.j a.k)
Пример программы: проверка вхождения одной
строки в другую
Семантика TSG: предъявлен Haskell-текст
интерпретатора int.
Состояние si вычисления программы p над
данными d:
(term, env)
Глава 1 — обзор и выводы
Процесс process(p,d) вычисления
программы p над данными d —
последовательность переходов от одного
состояния вычисления программы p к
другому
pd
r
pd* r
process(p,d) = s0 s1 … sn
Глава 1 — обзор и выводы
 Трасса tr(p,d) вычисления программы p
над данными d — последовательность
значений (для TSG это логические значения
TRUE и FALSE), описывающих, какие варианты
продолжения (какие ветви в конструкциях
ветвления) избирались в процессе вычисления p
над d в те моменты вычисления, когда в
принципе были возможны различные варианты
продолжения вычисления
tr(p,d) = [ b1, b2, ... ], где bi{TRUE, FALSE}
Глава 1 — Заключение
Фиксация языка реализации для
конкретности изложения, точности
построений и обоснований. Все
построения и рассуждения могут быть
повторены и для любого другого языка
реализации со свойствами:
алгоритмическая полнота и предметная
область языка построена при помощи
некоторого алфавита атомов и конечного
набора жестких конструкторов.
Download