Глава 1. Язык реализации: TSG Структура курса Область возможных новых исследований Иные методы Иные приложения Методы Приложения Базовые понятия и методы метавычислений метавычислений метавычислений Суперint, SR, ptr Приложения компиляция суперкомпиляции, scp в том числе Окрестностный анализ nan Инверсное вычисление ura Специализация программ Инверсное программирование Окрестностное тестирование Реализация нестандартных семантик [1] С.М.Абрамов «Метавычисления и их применения» [2] Л.В.Парменова «Метавычисления и их применения. Суперкомпиляция» Язык программирования Определение [А. П. Ершов] Язык программирования L = (PL, DL, SL), где PL — синтаксис, множество синтаксически правильных программ (строк), обычно заданное грамматикой DL — предметная область, множество данных; иногда определяют еще входные DinL, выходные DoutL, промежуточные данные DrunL SL :: PL×DL→DL — семантика, функция (частичная и вычислимая), которая определяет, выдает ли какой-либо результат rDL (или не выдает) программа pPL на входных данных dDL: 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 dkD: 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 — семантика, функция (частичная и вычислимая), которая определяет, выдает ли какой-либо результат rDR (или не выдает) программа pPR на входных данных dDR: 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 — Заключение Фиксация языка реализации для конкретности изложения, точности построений и обоснований. Все построения и рассуждения могут быть повторены и для любого другого языка реализации со свойствами: алгоритмическая полнота и предметная область языка построена при помощи некоторого алфавита атомов и конечного набора жестких конструкторов.