Глава 5+. SURA и XURA Структура курса Область возможных новых исследований Иные методы Иные приложения Методы Приложения Базовые понятия и методы метавычислений метавычислений метавычислений Суперint, SR, ptr Приложения компиляция суперкомпиляции, scp в том числе Окрестностный анализ nan Инверсное вычисление ura Специализация программ Инверсное программирование Окрестностное тестирование Реализация нестандартных семантик [1] С.М.Абрамов «Метавычисления и их применения» [2] Л.В.Парменова «Метавычисления и их применения. Суперкомпиляция» 5+.1 MGU и пересечение классов: Небольшое дополнение к средствам SR Most General Unifier Определение: s унификатор для cs1 и cs2 если cs1/.s = cs2/.s Обозначим unf(cs1, cs2) — множество всех унификаторов Свойство 1. s unf(cs1, cs2), s’ Subst: (s.*.s’) unf(cs1, cs2) Свойство 2. Если unf(cs1, cs2) ≠ Ø, то smgu unf(cs1, cs2): s unf(cs1, cs2) s’ Subst: s = smgu.*.s’ Термин: smgu наиболее общий унификатор cs1 и cs2 (Most General Unifier, MGU) unf(cs1, cs2) = {smgu.*.s’ | s’ Subst } Таблица решений (кроме случая «л.ч.==п.ч.») пр. лев. ч. ’А ч. ’B A.j E.j (CONS cy1 cy2) А.i E.i E.i:->пч Nothing А.i:->пч 1 5 occ. check А.j :->лч 2 6 (CONS cx1 cx2) Nothing 7 E.j:->лч,3 occ. check Nothing 4 E.i:->пч 6 occ. check cy1:=:cx1 cy2:=:cx2 8 Алгоритм MGU mgu :: Clashes -> Maybe Subst mgu [] = Just [] mgu (eq:eqs) = case eq of cx1 :=: cx2 | cx1==cx2 -> mgu eqs v@(CVE _):=:cx2 -> mgu' [v:->cx2] `when` (v `notOccursIn` cx2) cx1:=:v@(CVE _) -> mgu' [v:->cx1] `when` (v `notOccursIn` cx1) (CONS cy1 cy2):=:(CONS cx1 cx2) -> mgu [cy1:=:cx1, cy2:=:cx2,]++eqs (CONS _ _):=:_ -> Nothing _ :=: (CONS _ _) -> Nothing (ATOM_):=:(ATOM_) -> Nothing v@(CVA _):=:cx2 -> mgu' [v:->cx2] cx1:=:v@(CVA _) -> mgu' [v:->cx1] where mgu' s = fmap (s.*.) (mgu (eqs/.s)) x `when` p = if p then x else Nothing v `notOccursIn` ce = v `notElem` (cvars ce) Пересечение классов Пусть C1 = (cs1, r1), C2 = (cs2, r2) Предположим (cvars C1) (cvars C2) = [] Пусть d <C1> <C2>. s1: cs1/.s1 = d, r1 /.s1 = RESTR[] s2: cs2/.s2 = d, r2 /.s2 = RESTR[] s: (s= s1++s2) cs1/.s = d = cs2/.s r1 /. s = RESTR[], r2 /. s = RESTR[] (r1 .+ r2) /. s = RESTR[] Пересечение классов d <C1> <C2>. s: cs1/.s = d = cs2/.s r1 /. s = RESTR[], r2 /. s = RESTR[] (r1 .+ r2) /. s = RESTR[] s unf(cs1, cs2): cs1/.s = d = cs2/.s (r1 .+ r2) /. s = RESTR[] s’ Subst: cs0/.s’=d, r0/.s’=RESTR[] где cs0 = cs1/.smgu = cs2/.smgu r0 = (r1 .+ r2) /. smgu d <C0>, где C0 = (cs0, r0) Пересечение классов Пусть C1 = (cs1, r1), C2 = (cs2, r2) Предположим (cvars C1) (cvars C2) = [] Тогда <C1> <C2> = <C0>, где C0 = (cs0, r0), cs0 = cs1/.smgu = cs2/.smgu r0 = (r1.+r2)/.smgu = (r1/.smgu).+(r2/.smgu) C0 ≤ C1, C0 = C1/.(S smgu)/.(R r2’), где r2’ = r2/.smgu C0 ≤ C2, C0 = C2/.(S smgu)/.(R r1’ ), где r1’ = r1/.smgu C1.^.C2 = [], если <C1> <C2>=Ø = [(smgu, r2’)], иначе Пересечение классов (.^.) :: Class -> Class -> [(Subst, Restr)] (cs1,r1).^.(cs’,rs’) = let (cs2,r2) = rename (cs’,rs’) (cs1,r1) in case mgu (zipWith (:=:) cs1 cs2) of Nothing ->[ ] Just s -> case (r1.+r2)/.s of INCONSISTENT ->[ ] _ ->[(s,r2/.s)] Пересечение классов rename :: Class -> Class -> Class rename c1 c2 = c1 /. sr where n = freeindx 0 c2 ns = [ n .. ] vs = cvars c1 sr = zipWith f vs ns f v@(CVA i) j = (v :-> (CVA j)) f v@(CVE i) j = (v :-> (CVE j)) 5+.2 SURA: Симметричный УРА SURA: Симметричный УРА Симметрия входа-выхода в задаче инверсного программирования f :: A → B: f = { …(x, y) … } A×B, такое, что: (x, y1) Обозначение: Обратное f & (x, y2) (x, y) f f y1 = y2 f(x)=y отношение: f(-1) = { (y, x) | (x, y) f } = { (y, x) | f(x) = y } Инверсное вычисление: пересечение графика с множеством поиска io-класс ( ([E.1], y), RESTR[ ]) график p допустимые данные для p Инверсное вычисление: пересечение графика с множеством поиска io-класс <Cio> = < (cxs, y), rs> tab p на <Cin> график p на <Cin> <Cin> = <cxs, rs> допустимые данные для p Инверсное вычисление: вперед к симметрии! <Cio> = <([E.1], E.1), RESTR[ ]> график p допустимые данные для p Инверсное вычисление: вперед к симметрии! <Cio> = <([ce],ce), rs> tab p на <Cin> график p на <Cin> <Cin> = <ce, rs> допустимые данные для p Инверсное вычисление: общий случай <Cio> = <(cxs,cy), rs> tab p на <Cin> график p на <xin> <Cin> = <cxs, rs> допустимые данные для p Инверсное вычисление: частный случай — вычисление <Cio> = <(ds,E.1), RESTR[ ]> tab p на <Cin> { (ds, p ds) } <Cin> = <ds,RESTR[ ]> = {ds} допустимые данные Постановка задачи URA: построение представления множества: <x>p-1y = { d | d <x>, p d * y } = <x> (p-1 y) где p — TSG-программа, x — класс (обобщенное данное для p), y EVal — езначение SURA: построение представления множества: { (d, y) | (d, y) <Cio>, p d * y } = <Cio> { (d,y) | p d * y } где p — TSG-программа, Cio = ((cxs,cy), rs) — io-класс, Cin = (cxs, rs) — обобщенное данное для p Структура решения задачи SURA: Пусть p — TSG-программа, Cio = ((cxs,cy), rs) — io-класс, Cin = (cxs, rs) — обобщенное данное для p. Интересует построение представления множества: { (d, y) | (d, y) <Cio>, p d * { (d,y) | p d * { (d,y) | d <Cin>, p d * y } <[C1io, C2io, C3io …]> <Cio> y} y}= <Cio> = где [C1io, C2io, C3io …] = tab p Cin <Cio> = запрос на инверсное вычисление URA p x ppt перфектное дерево процессов tree y tab’ L табличное представление функции программы urac ans ответ на запрос инверсного вычисления запрос на инверсное вычисление SURA p Cio Cin ppt перфектное дерево процессов tree tab’ L график p на перечисление [C1io, C2io, …] Cin, sura’ ans ответ, пересечение графика и Cio: [(s1,rs1), (s2,rs2)…] SURA sura :: ProgR -> IOClass -> [(Subst,Restr)] sura p cio@((cxs, cy), rs) = concat (map f (tab p cin)) where cin = (cxs, rs) f ((cxs’,rs’),cy’) = (cy:cxs, rs).^.(cy’:cxs’, rs’) 5+.3 XURA: Симметричный УРА для случая неплоских языков NTSG — неплоский TSG (define a2b [x] (if (cons? x h t ) (if (equ? h ’A) ( ’B :(call a2b [t])) ( h :(call a2b [t]))) [ ])) (define ) f [x] ([x, (call a2b [x])]) Выполнение NTSG-программы (a2b [['A, 'B, 'B, 'A, 'C]]) 'B: (a2b [['B, 'B, 'A, 'C]]) 'B: 'B: (a2b [['B, 'A, 'C]]) 'B: 'B: 'B: (a2b [['A, 'C]]) 'B: 'B: 'B: 'B: (a2b [['C]]) 'B: 'B: 'B: 'B: 'C: (a2b [[]]) 'B: 'B: 'B: 'B: 'C: [] = ['B, 'B, 'B, 'B, 'C] XURA: симметричный УРА для неплоского языка Неплоский язык до завершения вычисления может быть частично известен результат Это серьезно (a2b [['A, 'B, 'B, 'A, 'C]])уменьшить ● возможность search у УРА даже изменить 'B: (a2b [['B, 'B, и'A, 'C]]) ●space свойства терминируемости 'B: 'B: (a2b [['B, 'A, 'C]]) ● 'B: 'B: 'B: (a2b [['A, 'C]]) ● Сохраним полноту и 'B: 'B: 'B: 'B: (a2b [['C]]) ● непротиворечивость. 'B: 'B: 'B: 'B: (a2b [[]]) 'C: ● Не приобретем, но улучшим 'B: 'B: 'B: 'B: 'C: [] терминируемость Пример 1: ura a2b C0io, где C0io = (([E1], 'B:[ ]), restr[]) Cio =[E(([E :A*]*], E2:[ ]), restr[E2≠'А]) [E1→ E2 :E3] [([E1→'A:A*], r[ ]), 1→2A (a2b [E1]), restr[ ] 0 Cio.^.C io=[([E2→'B, E1→'B:A*], restr[ ])] ([E1→'B:A*], r[ ])] [ ], restr[ ] (a2b [E2 :E3]), restr[ ] ┐c3 c3 = [E2→'А] E2 :(a2b [E3]), restr[E2≠'А] 'B: (a2b [E3]), restr[ ] [E3→ E5 :E6] [E3→ E5 :E6] [E3→ A*] [E3→ Cio = (([A*], [ ]), restr[ ]) A*] Cio~=~=((['A:E ((['A:E:E 'B:E:(a2b [E])), ])),restr[E restr[E≠'А]) 05:(a2b 5:E 6], 6пересечение 5≠'А]) Cio ], 'B:E [E C .^. C = [ ] — пусто! 5 6 io 5 io 6 5 * E2:[restr[E ], restr[E =((['A:E ((['A:E:E 'B:E:●), 2≠'А] *C io 5:E 6], 5:●), 5≠'А]) C = ], 'B:E restr[E ≠'А]) 66], E2:'B:(a2b 5 CioCio~= (([E :'A:E [E6пусто! ])),5 restr[E2≠'А]) 'B:[ ],.^.C restr[ ] 5] — 0 2=[ пересечение 0 =[ io io ] — пересечение пусто! C * .^.C io io Cio ~= ((['A:'A:E [E6])),2≠'А]) restr[ ]) C = (([E ],],E'B:'B:(a2b io 2:'A:E66 2:'B :●), restr[E 0 =[ [E 'B: (a2b restr[ ] restr[ E2]) :(a2b [E5 :E6]), restr[E2≠'А] Cio*io.^.C = ((['A:'A:E ],6]), 'B:'B:●])), C ]— пусто! 5 :E 6пересечение io 0 =[ ] — пересечение пусто! Ccio6 .^.C = [E5io→'А] ┐c6 ┐c6 [E5→'А] Cio = ((['A:A*], 'B:[c6]),=restr[ ]) Cio .^. C0io = [([E1→'A:A*], restr[ ])] 'B:E5:(a2b [E6]), … E2:E5:(a2b [E6]), … 'B:'B:(a2b [E6]),restr[ ] E2:'B:(a2b [E6]), … Отсечение бесперспективных поддеревьев Пусть заказ на инверсное вычисление p и C0io=((cxs0i, cx0o), rs0) Пусть у текущей вершины k класс достижимости: Ckin = (cxski, rsk) конфигурация: ck = (csk, rsk) аппроксимация io-класса: Ckiо = ((cxski, cxko), rsk), где cxko = skel(csk) Тогда, если Ckiо.^. C0io = [ ], то текущую вершину можно удалить из дерева (с соответствующим поддеревом). cprev ck=(csk,rsk) cprev ck=(csk,rsk) Пример 2: ura f C0io, где C0io = (([[A1,A2,A3]], [[A0,A0,A0],['B,'B,'B]]), restr[]) (f [[A1,A2,A3]]), restr[ ] c1=[A1→'А] ┐c1 [[A1,A2,A3],(a2b [[A1,A2,A3]]), restr[ ] c2=[A2→'А] c3=[A3→'А] ┐c2 ┐c3 c3 [ ['A,A2,A3], 'B:(a2b [[A2,A3]])], … [ ['A,'A,A3], [[A ]])], … [[A'B:'B:(a2b 1,A2,A3],[A1,A32,A3]] … [[A11,A ,'A,'A],[A ,'B,'B]] [[A ,'A,A ,'B,A 2,'A],[A 3],[A1,A 2,'B]] 3]] … Решение: Нет решения! Нет решения! [ ['A,A 2,A [A →'B, A32],→'B, A3→'B, A0→'B] 1 'B:A2:(a2b [[A3]])], … ┐c2 c2 ┐c3 c3 ┐c3 c3 ┐c3 [ [A1,A2,A3], A1:(a2b [[A2,A3]])], … [ [A1,'A,A3], A1:'B:(a2b [[A3]])], [['A,'A,'A],['B,'B,'B]], …… [['A, [['A,'A,A A2,'A],['B,A ,A … … 3],['B,'B,A 3],['B,A 2,'B]], 2,A 3]], 3]]… Решение: Нет[решения! [A1,A2A ,A3→'А, ], [A1→'А, A3→'А, A0 →'А] 2 A1:A2:(a2b [[A3]])], … Пример 2: ura f C0io, где C0io = (([[A1,A2,A3]], [[A0,A0,A0],['B,'B,'B]]), restr[]) (f [[A1,A2,A3]]), restr[ ] c1=[A1→'А] c2=[A2→'А] c3=[A3→'А] ┐c1 [[A1,A2,A3],(a2b [[A1,A2,A3]]), restr[ ] ┐c2 ┐c3 c3 [['A,'A,'A],['B,'B,'B]], … Решение: [ A1→'А, A2→'А, A3→'А, A0 →'А] ┐c2 c2 ┐c3 c3 ┐c3 c3 ┐c3 [[A1,A2,A3],[A1,A2,A3]] … Решение: [A1→'B, A2→'B, A3→'B, A0→'B] Пример 2: ura f C0io, где C0io = (([[A1,A2,A3]], [[A0,A0,A0],['B,'B,'B]]), restr[]) (f [[A1,A2,A3]]), restr[ ] [[A1,A2,A3],(a2b [[A1,A2,A3]])], restr[ ] [([A1→A0, A2→A0, A3→A0],restr[])] c0=[A0→'А] [[A0,A0,A0],(a2b [[A0,A0,A0]])], restr[ ] ┐c0 [['A,'A,'A],(a2b [['A,'A,'A]])], restr[ ] [[A0,A0,A0],(a2b [[A0,A0,A0]])],[A0≠‘A] [['A,'A,'A],'B:(a2b [['A,'A]])], restr[ ] [[A0,A0,A0], A0:(a2b [[A0,A0]])],[A0≠‘A] [['A,'A,'A],'B:'B:(a2b [['A]])], restr[ ] [[A0,A0,A0], A0:A0:(a2b [[A0]])],[A0≠‘A] c1 = ([[A1,A2,A3],(a2b [[A1,A2,A3]]), restr[]) [['A,'A,'A],'B:'B:'B:(a2b ] [[A ,A ,A ],A0:A0:A0:(a2b [[]])],[A0≠‘A] C1in = ([[A1[[]])], ,A2,Arestr[ 3]],restr[])0 0 0 C1io = (([[A1,A2,A3]], [[A1,A2,A3], ●), restr[]) ['B:'B:'B:]], restr[ ] [[A0,A0,A0],[A0,A0,A0]],[A0≠‘A] C0[['A,'A,'A], = (([[A ,A ,A ]], [[A ,A io 1 2 3 0 0,A0],['B,'B,'B]]), restr[]) C1io .^. C0io = [([A1→A0, A2→A0, A3→A0,●→['B,'B,'B]],restr[])] Backpropagation Пусть заказ на инверсное вычисление p и C0io=((cxs0i, cx0o), rs0) Пусть у текущей вершины k класс достижимости: Ckin = (cxski, rsk) конфигурация: ck = (csk, rsk) аппроксимация io-класса: Ckiо = ((cxski, cxko), rsk), где cxko = skel(csk) Тогда, если Ckiо.^. C0io = [(s,rs)], то к текущей вершине можно применить сужение (s,rs) cprev ck=(csk,rsk) cprev ck=(csk,rsk) (s,rs) ck/.s/.rs Отсечение бесперспективных поддеревьев и Backpropagation k 0 k 0 Пусть заказ на инверсное C iо.^.C io=[ ] C iо.^.C io=[(s,rs)] вычисление p и cprev cprev C0io=((cxs0i, cx0o), rs0) Пусть у текущей вершины k класс достижимости: Ckin = (cxski, rsk) ck=(csk,rsk) ck=(csk,rsk) конфигурация: ck = (csk, rsk) аппроксимация io-класса: Ckiо=((cxski, cxko), rsk), cprev cprev где cxko = skel(csk) Рассматриваем результат Ckiо.^.C0io и выполняем соответствующую ck=(csk,rsk) ck=(csk,rsk) операцию над текущей (s,rs) вершиной ck/.s/.rs Выводы В неплоском языке до завершения вычисления может быть частично известен результат Можно серьезно уменьшить search space у УРА и даже изменить свойства терминируемости — за счет отсечения бесперспективных поддеревьев и Backpropagation Как результат: сохраняем полноту и непротиворечивость УРА, не приобретаем, но улучшаем терминируемость УРА Ясная идея (по сравнению с FL-языками) Вне программы: BTI вместо «прямой реализации» Можно «в лоб» реализовать отсечение бесперспективных поддеревьев и Backpropagation Можно использовать идею «BTI», если язык (XSG), для которого реализуется ura, поддерживает: mgu-based операцию равенства (equ? ... ...) ленивую и справедливую семантику Вне программы: BTI вместо «прямой реализации» p Cio: Inv(p, Cio) = Inv(p*, C*io) где Cio = (([d1, ... dn], dout ), rs) C*io = (([d1, ... dn,dout], 'True), rs) p* = [ (define main[in1,... inn, out] (call test [ (call mainfct(p) [in1, ... inn]), out] ) ), (define test [res, out] (if (equ? res out) ’True ’False) ) ] ++ p XSG и XURA: состояние и перспективы Язык XSG — незавершенный проект, с большой перспективой Сделаны сравнения с FL-языками, эксперименты на проверку чистоты реализации тех или иных технических решений: mgu-based операцию равенства (equ? ... ...) ленивую и справедливую семантику отсечение бесперспективных поддеревьев Backpropagation «XSG» и «MC для XSG» — хорошие и перспективные темы для Theoretical Computer Science исследований и разработок