Глава 5. Инверсное программирование Структура курса Область возможных новых исследований Иные методы Иные приложения Методы Приложения Базовые понятия и методы метавычислений метавычислений метавычислений Суперint, SR, ptr Приложения компиляция суперкомпиляции, scp в том числе Окрестностный анализ nan Инверсное вычисление ura Специализация программ Инверсное программирование Окрестностное тестирование Реализация нестандартных семантик [1] С.М.Абрамов «Метавычисления и их применения» [2] Л.В.Парменова «Метавычисления и их применения. Суперкомпиляция» Глава 5. Инверсное программирование Технология программирования, основанная на использовании инверсных вычислений Инверсное программирование: программист вместо того чтобы программировать требуемую в задании функцию f, реализует программу p, функция которой при инверсном вычислении совпадает с функцией f Глава 5. Инверсное программирование С каждым текстом программы p можно связать не одну, а две функции программы: p :: D -> EVal — обычная функция программы (семантика): p d = int p d pinv :: Dinv -> Rinv — инверсная функция (семантика) программы: pinv (x,y) = ura p x y где Dinv=(Class, Eval) — тип запросов на инверсное вычисление; Rinv=[(Subst,Restr)] — тип результатов инверсного вычисления. Перенос инверсных вычислений на произвольный язык L мотивация и варианты переноса инверсных вычислений с языка R на произвольный язык программирования L inv :: ProgR -> D -> Dinv -> Rinv inv intL p (x,y) = ura intL (p.:.x) y where (.:.) :: ProgL->Class -> Class p.:.(ces,r) = ((p:ces),r) Корректность переноса инверсных вычислений Теорема. Пусть L — произвольный язык программирования, p — L-программа, intL — L/R-интерпретатор, x — класс, обобщенное данное для p, y — значение. Тогда вычисление: inv intL p (x, y) * [(s1,r1), (s2,r2),...] реализует инверсное вычисление и выполнено: Корректность переноса инверсных вычислений 1. Классы xi = x/.(S si)/.(R ri) — попарно непересекающиеся подклассы класса x 2. Для любого i и любого данного d <xi> — программа p определена на d и p d * L y 3. Для любого данного d <x>, на котором программа p определена и p d * L y, существует номер i такой, что d <x’i>. Кроме того, в данном случае, префикс длины i списка будет построен inv intL p (x, y) за конечное число шагов Корректность inv (кратко) Пусть L — произвольный язык программирования, p — L-программа, intL — L/R-интерпретатор, x — класс, обобщенное данное для p, y — значение Пусть inv intL p (x, y) * [(s1,r1), (s2,r2),...] Тогда <x> (p-1 y) = { d | d <x>, p d * L y} = i <x/.(S si)/.(R ri)> Доказательство корректности inv inv intL p (x, y) * [(s1,r1), (s2,r2),...] ura intL (p.:.x) y * [(s1,r1), (s2,r2),...] ura intL (p:ces,r) y * [(s1,r1), (s2,r2),...] { pd | pd <p.:.x>, intL pd * R y} = i <p.:.x/.(S si)/.(R ri)> { pd | pd <(p:ces,r)>, intL pd * R y} = i <(p:ces,r)/.(S si)/.(R ri)> Доказательство корректности inv { pd | pd <p.:.x>, intL pd * R y} = i <p.:.x/.(S si)/.(R ri)> { pd | pd <(p:ces,r)>, intL pd * R y} = i <(p:ces,r)/.(S si)/.(R ri)> { p:d | p:d p:<ces,r>, intL p:d * R y} = i p:(<(ces,r)/.(S si)/.(R ri)>) p:{ d | d <x>, p d * L y} = p: i (<x/.(S si)/.(R ri)>) <x> (p-1 y) = { d | d <x>, p d * L y} = i <x/.(S si)/.(R ri)> Доказательство корректности inv inv intL p (x, y) * [(s1,r1), (s2,r2),...] <x> (p-1 y) = { d | d <x>, p d * L y} = i <x/.(S si)/.(R ri)> Глава 5. Инверсное программирование Сравнение логического программирования с инверсным программированием программпредикатов: Свойства инверсного программирования программпредикатов позволяют рассматривать язык Linv, как язык логического программирования. Инверсное программирование программ-предикатов предоставляет больше изобразительных средств в распоряжение программиста, нежели традиционные языки логического программирования. Концепция инверсного программирования не исчерпывается инверсным программированием программ-предикатов. Ее можно использовать для гораздо более широкого класса задач.