Глава 4. Универсальный решающий алгоритм Структура курса Область возможных новых исследований Иные методы Иные приложения Методы Приложения Базовые понятия и методы метавычислений метавычислений метавычислений Суперint, SR, ptr Приложения компиляция суперкомпиляции, scp в том числе Окрестностный анализ nan Инверсное вычисление ura Специализация программ Инверсное программирование Окрестностное тестирование Реализация нестандартных семантик [1] С.М.Абрамов «Метавычисления и их применения» [2] Л.В.Парменова «Метавычисления и их применения. Суперкомпиляция» Глава 4. Универсальный решающий алгоритм УРА — один из методов метавычислений, позволяющий выполнять инверсное вычисление программ Проблема инверсного вычисления программы — построение представления множества: <x>p-1y = { d | d <x>, p d * <x> (p-1 y) y}= где p — TSG-программа, x — класс (обобщенное данное для p), y EVal — езначение Глава 4. Универсальный решающий алгоритм Актуальность проблемы: вычисление функции, обратной к функции заданной программы построение множества истинности программы-предиката обработка сложных запросов к базе знаний решение уравнений, без разработки специальных методов и алгоритмов их решений Структура URA запрос на инверсное вычисление p x ppt перфектное дерево процессов tree y tab’ L табличное представление функции программы urac ans ответ на запрос инверсного вычисления Глава 4. Универсальный решающий алгоритм Алгоритм tab приведения функции программы к табличной форме tab p x * L = [(x1,cex1), (x2,cex2),...] где xi — непересекающиеся подклассы x, cexi — cвыражения Для любого d <x> выполнено: cexi/.s — если d <xi> и s — подстаpd= новка, xi/.s = (d,RESTR[]) undefined — если нет i такого, что d <xi> Глава 4. Универсальный решающий алгоритм Две модификации ura’ и ura универсального решающего алгоритма: ura’ p x y * L’ = [x1, x2,...] ura p x y * L = [(s1,r1), (s2,r2),...] ura’ перечисляет подклассы xi класса x, на которых вычисление p приводит к результату y: p <xi> = {y} ura перечисляет значения c-переменных из x, при которых вычисление p приводит к результату y: p <x/.(S si)/.(R ri)>={y} Глава 4. Универсальный решающий алгоритм «Естественность» перечисления В некоторых случаях ura’ позволяет построить конечное представление множества <x>p-1y — список L’ может быть пустым или конечным Примеры инверсного вычисления для языка TSG Обзор иных подходов к инверсии программ 4.1 Приведение программы к табличной форме type TLevel = [(Class,Tree)] type Tab = [(Class, CExp)] tab :: ProgR -> Class -> Tab tab p x = tab’ [ (x,tree) ] [ ] where tree = xptr p x 4.1 Приведение программы к табличной форме tab’ :: TLevel -> TLevel -> Tab tab’ ((xi, LEAF c):lv1) lv2 = (xi,cex):(tab’ lv1 lv2) where ((exp,ce),_) = c cex = exp/.ce tab’ ((xi, NODE _ bs):lv1) lv2 = tab’ lv1 lv2’ where lv2’ = tabB xi bs lv2 tab’ [ ] []=[] tab’ [ ] lv2 = tab’ lv2 [ ] 4.1 Приведение программы к табличной форме tabB :: Class -> [Branch] -> TLevel ->TLevel tabB xi ((cnt,tree):bs) lv = tabB xi bs ((xi/.cnt,tree):lv) tabB xi [ ] lv = lv 4.1 Приведение программы к табличной форме Теорема 12 Пусть p — произвольная программа на языке TSG, x — класс, обобщенное данное для p. Тогда алгоритм tab по заданным p и x строит перечислениe — то есть список L=[(x1,cex1),(x2,cex2),...], возможно бесконечной длины: tab p x * L где xi — класс, cexi — c-выражение над переменными из класса xi. При этом выполнено следующее: 4.1 Приведение программы к табличной форме 1. Классы xi — попарно непересекающиеся подклассы класса x 2. Для любого i и любого d <xi> — программа p определена на d 3. Для любого данного d <x>, на котором программа p определена — p d * res — существует i такой, что d <xi>, и если подстановка s такая, что xi/.s=(d, RESTR[]), то выполнено res=cexi/.s. Кроме того, в данном случае, префикс длины i списка L будет построен алгоритмом tab за конечное число шагов. 4.2 Алгоритм инверсного вычисления программ ura’ :: ProgR -> Class -> EVal -> Classes ura’ p x y = urac (tab p x) y urac :: Tab -> EVal -> Classes urac ((xi, cex):ptab’) y = case (unify [cex] [y]) of (False,_) -> tail (True, s) -> case xi’ of (_, INCONSISTENT) -> tail _ -> xi’:tail where xi’ = xi/.s where tail = urac ptab’ y urac [ ] y=[] 4.2 Алгоритм инверсного вычисления программ Теорема 13 Пусть p — произвольная программа на языке TSG, x — класс, обобщенное данное для p, y — eзначение (y Eval). Тогда алгоритм ura’ по заданным p, x, y строит перечислениe — то есть список L’=[x’1,x’2,...], возможно бесконечной длины: ura’ p x y * L’ При этом выполнено следующее: 4.2 Алгоритм инверсного вычисления программ 1. Классы x’i — попарно непересекающиеся подклассы класса x 2. Для любого i и любого данного d <x’i> — программа p определена на d и p d = y 3. Для любого данного d <x>, на котором программа p определена и p d = y, существует номер i такой, что d <x’i>. Кроме того, в данном случае, префикс длины i списка будет построен алгоритмом ura’ за конечное число шагов Теорема 13 кратко Пусть p — произвольная программа на языке TSG, x — класс, c-данное для p, y — e-значение (y Eval). Пусть ura’ p x y * [x’1,x’2,...] Тогда <x> (p-1 y) = { d | d <x>, p d * i <x’i> y} = 4.3 Альтернативное представление результатов инверсного вычисления ura :: ProgR -> Class -> EVal -> [(Subst,Restr)] ura p x y = map altRepr (ura’ p x y) where altRepr:: Class -> (Subst,Restr) altRepr xi = subClassCntr x xi 4.3 Альтернативное представление результатов инверсного вычисления subClassCntr :: Class -> Class -> (Subst,Restr) subClassCntr x@(cesx,rx) x’@(cesx’,rx’) = (s, r) where (True,s) = unify cesx cesx’ RESTR ineqs = rx/.s r = case rx’ of INCONSISTENT -> INCONSISTENT RESTR ineqs’ -> RESTR [ ineq | ineq<-ineqs’, not(ineq‘elem‘ineqs)] Корректность ura (кратко) Пусть p — произвольная программа на языке TSG, x — класс, c-данное для p, y — e-значение (y Eval). Пусть ura p x y * [(s1,r1), (s2,r2),...] Тогда <x> (p-1 y) = { d | d <x>, p d * y} = i <x/.(S si)/.(R ri)> 4.4 Универсальный решающий алгоритм. Примеры str = CONS ’A(CONS ’B(CONS ’C ’NIL)) x = ( [E.1,str], RESTR[]) aaa = CONS ’A(CONS ’A(CONS ’A ’NIL)) xa = ( [E.1,aaa], RESTR[]) true = ’SUCCESS false = ’FAILURE 4.4 Универсальный решающий алгоритм. Примеры ura prog x true = [([E.1 :-> A.4],RESTR[]), ([E.1 :-> CONS ’A A.10],RESTR[]), ([E.1 :-> CONS ’A (CONS ’B A.16)],RESTR[]), ([E.1 :-> CONS ’B A.10],RESTR[]), ([E.1 :-> CONS ’A (CONS ’B (CONS ’C A.22))], RESTR[]), ([E.1 :-> CONS ’B (CONS ’C A.16)],RESTR[]), ([E.1 :-> CONS ’C A.10],RESTR[])] 4.4 Универсальный решающий алгоритм. Примеры ura prog xa true = [ ([E.1 :-> A.4],[]), ([E.1 :-> CONS ’A A.10],[]), ([E.1 :-> CONS ’A (CONS ’A A.16)],[]), ([E.1 :-> CONS ’A (CONS ’A (CONS ’A A.22))],[]) ] ura prog x false = … класс, какой результат? ... 4.4 Универсальный решающий алгоритм. Примеры ura prog x false = [ ([E.1:->CONS (CONS E.13 E.14) E.11],[]), ([E.1:->CONS ’A (CONS (CONS E.19 E.20) E.17)],[]), ([E.1:->CONS ’A (CONS ’B (CONS (CONS E.25 E.26) E.23))],[]), ([E.1:->CONS ’B (CONS (CONS E.19 E.20) E.17)],[]), ([E.1:->CONS ’A (CONS ’B (CONS ’C (CONS (CONS E.31 E.32) E.29)))],[]), ([E.1:->CONS ’A (CONS ’B (CONS ’C (CONS E.33 E.29)))],[]), ([E.1:->CONS ’B (CONS ’C (CONS (CONS E.25 E.26) E.23))],[]), ([E.1:->CONS ’B (CONS ’C (CONS A.27 E.23))],[]), ([E.1:->CONS ’C (CONS (CONS E.19 E.20) E.17)],[]), ([E.1:->CONS ’C (CONS A.21 E.17)],[]), ([E.1:->CONS A.15 E.11], [A.15:≠:’A, A.15:≠:’B, A.15:≠:’C]), ([E.1:->CONS ’A (CONS A.21 E.17)], [A.21:≠:’B]), ([E.1:->CONS ’B (CONS A.21 E.17)], [A.21:≠:’C]), ([E.1:->CONS ’A (CONS ’B (CONS A.27 E.23))], [A.27:≠:’C]) ] 4.4 Универсальный решающий алгоритм. Примеры Когда (критерий!) ura завершает свою работу за конечное число шагов? (Аудитория отвечает!) p x ppt tree y tab’ L urac ans Критерий Пусть p — произвольная программа на языке TSG, x — класс, c-данное для p, y — e-значение (y Eval). Тогда следующие условия равносильны ura p x y терминируется xptr p x — конечное дерево xptr p x имеет конечную глубину L L: d <x> вычисление p d * … завершается не более чем за L шагов Различные подходы к инверсному вычислению и инверсии программ «Прочтение в обратном порядке» программы (или графа программы) Не всегда это возможно Reversible programming Трансформационный подход (Burstall, Darlington) «Анализ грамматики» — терминируемость, полнота, но нет непротиворечивости УРА — не единственный подход к проблеме,— доказательство существования решения полного и непротиворечивого (без терминированности). Глава 4. Универсальный решающий алгоритм УРА — один из методов метавычислений, позволяющий выполнять инверсное вычисление программ Проблема инверсного вычисления программы — построение представления множества: <x>p-1y = { d | d<x>, p d * <x> (p-1 y) y}= где p — TSG-программа, x — класс (обобщенное данное для p), y EVal — езначение Глава 4. Универсальный решающий алгоритм Актуальность проблемы: вычисление функции, обратной к функции заданной программы построение множества истинности программы-предиката обработка сложных запросов к базе знаний решение уравнений, без разработки специальных методов и алгоритмов их решений Структура URA запрос на инверсное вычисление p x ppt перфектное дерево процессов tree y tab’ L табличное представление функции программы urac ans ответ на запрос инверсного вычисления Глава 4. Универсальный решающий алгоритм Алгоритм tab приведения функции программы к табличной форме tab p x * L = [(x1,cex1), (x2,cex2),...] где xi — непересекающиеся подклассы x, cexi — cвыражения Для любого d <x> выполнено: cexi/.s — если d <xi> и s — подстаpd= новка, xi/.s = (d,RESTR[]) undefined — если нет i такого, что d <xi> Глава 4. Универсальный решающий алгоритм Две модификации ura’ и ura универсального решающего алгоритма: ura’ p x y * L’ = [x1, x2,...] ura p x y * L = [(s1,r1), (s2,r2),...] ura’ перечисляет подклассы xi класса x, на которых вычисление p приводит к результату y: p <xi> = {y} ura перечисляет значения c-переменных из x, при которых вычисление p приводит к результату y: p <x/.(S si)/.(R ri)>={y} Глава 4. Универсальный решающий алгоритм «Естественность» перечисления В некоторых случаях ura’ позволяет построить конечное представление множества <x>p-1y — список L’ может быть пустым или конечным Примеры инверсного вычисления для языка TSG Обзор иных подходов к инверсии программ