Научная статья на тему 'Ослабление утверждений корректности аргументов функции'

Ослабление утверждений корректности аргументов функции Текст научной статьи по специальности «Математика»

CC BY
69
27
i Надоели баннеры? Вы всегда можете отключить рекламу.
Область наук
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Ослабление утверждений корректности аргументов функции»

По определенной в результате исследования совокупности характеристик и конечных элементов СДО для образования в области медицины выбрана open-source СДО Moodle, удовлетворяющая предъявляемым требованиям.

Внедрение проводится в Санкт-Петербургской медицинской академии последипломного образования.

Список литературы

1. Микитенко Д.А., Калягин А.Н. Обучающие информационные технологии в дистанционном медицинском образовании. // Украинский журнал телемедицины. - 2005. - Т. 3. - № 2. - С. 184189.

2. Саати Т. Принятие решений. Метод анализа иерархий. -М.: Радио и связь, 1993.

3. Справочник по прикладной статистике. В 2 т. / Под ред. Э. Ллойда, У. Ледермана, Ю. Тюрина. - М., 1989.

4. Айвазян С.А. и др. Прикладная статистика. Классификация и снижение размерности. - М., 1989.

ОСЛАБЛЕНИЕ УТВЕРЖДЕНИЙ КОРРЕКТНОСТИ АРГУМЕНТОВ ФУНКЦИИ

Д.Д. Еловков; С.Л. Сергеев, к.ф.-м.н. (Санкт-Петербургский государственный университет)

Рассмотрим задачу верификации корректности выражения в языке программирования Хаскел с точки зрения правильности использования некоторой функции. Здесь под правильным использованием понимается применение функции лишь к аргументам, удовлетворяющим определенному предикату Р-логики. Данная задача состоит в том, чтобы удостовериться, что в процессе вычисления выражения эта функция не будет применена к неправильным аргументам. Частным случаем здесь является полный запрет на вызов определенной функции. Например, для кода, полученного из ненадежного источника, может потребоваться гарантия того, что в нем не вызывается функция завершения программы. Предикат Р-логики, соответствующий данному частному случаю, будет просто тождественно ложен.

Рассмотрим такой простой пример, как насыщенное применение функции к аргументам Гег..еп (в Хаскеле применение функции записывается без скобок). Помимо очевидного требования РР (е1 ,...,еп), когда мы проверяем правильность

использования именно функции f с точки зрения связанного с ней предиката РР, нужно также удостовериться в корректности выражений е, . Пусть

на использование функции f не накладывается никаких ограничений, тогда нужно сосредоточиться только на корректности аргументов. Об этом и пойдет речь в данной работе. Прямолинейный подход будет заключаться в том, чтобы требовать корректности всех е, в том же контексте, что и всего выражения в целом:

Е(р -еп>)=Е(е, )д...д Е(еп),

где через Е будем обозначать функцию, ставящую в соответствие Хаскел-выражению утверждение его корректности. Не будем при этом описывать конкретный критерий корректности. Полученное утверждение несомненно является пра-

вильным, однако в ряде случаев оно может оказаться сильнее, чем необходимо.

Поясним это на примере следующих Хаскел-определений:

f xy=if x>0 then y else 0, hz=f z (gz).

Пусть функция g может применяться только к положительному числу. Проверяя корректность выражения в правой части определения h в соответствии с описанным выше простым подходом,

мы получим: E({fz(gz)}) =E({z})a E({gz}) = z> 0.

Однако можно видеть, что значение функции f зависит от ее второго аргумента (y) (а точнее, равняется ему) только в случае, когда первый (x) положителен. В определении h функции f передаются аргументы z и (gz). Таким образом, про-

верямое выражение будет зависеть от (gz) только

в случае, если z положительно. Это позволяет сделать вывод, что правая часть определения h корректна с точки зрения использования функции g независимо от значения z .

Необходимо привести некоторые соображения, чтобы обосновать справедливость приведенных рассуждений. Многие, посмотрев на выражение fz(gz), сразу же подумают, что вычисление этого выражения начинается с вычисления аргументов. При этом аргумент (gz) должен быть вычислен независимо от того, положительно z или нет. Это на самом деле так для многих языков программирования, но в случае Хаскела мы имеем иную ситуацию. Хаскел, являясь чистым функциональным языком, не специфицирует порядок вычисления выражений. Более того, Хаскел обладает нестрогой семантикой [1], моделировать которую проще всего с помощью ленивых вычисле-

ний [2]. Именно такого подхода придерживается подавляющее большинство Хаскел-компиляторов. Ленивое вычисление применения функции к аргументам вызывает функцию с невычисленными аргументами, которые вычисляются только по мере необходимости. В приведенном примере второй аргумент будет вычисляться, если первый будет положительным.

Однако стоит еще раз подчеркнуть, что Хас-кел обладает нестрогой семантикой, а способ ее реализации спецификацией языка никак не навязывается. Помимо ленивого вычисления, было также предложено оптимистичное вычисление [3], которое может иногда вычислять подвыражения до того, как их значения фактически понадобятся. Тем не менее приведенные выше соображения корректны вне зависимости от механизма вычисления выражений. Дело в том, что Хаскел - безопасный язык. Система типов уже гарантирует, что программа не завершится с критической ошибкой. Таким образом, не важно, будет ли фактически вызвана функция с неправильными аргументами, главное - то, чтобы значение верифицируемого выражения не зависело от результата этого неправильного применения.

Для того чтобы формулировать более слабые утверждения корректности аргументов функции, построим шаблон высказывания на основе определения данной функции. После этого в полученный шаблон подставляются выражения аргументов и их собственные утверждения корректности. Таким образом учитывается структура функции. Данный шаблон будет содержать в себе потенциал для получения более слабого утверждения.

Это можно описать следующим образом: пусть Т = Т^) - шаблон утверждения функции £ Тогда подстановка будет иметь вид: Б^ва)}) = Tf ЫА/Б({а}),Су /Б(^})].

То есть высказывание Т будет содержать переменные х и у, соответствующие параметрам функции £ а также переменные-высказывания Сх и Су, которые будут соответствовать утверждениям корректности выражений, стоящих на месте параметров х и у.

Задача сводится к определению функции Т^). Ее можно определять по-разному, используя

возможности для ослабления утверждений. В частности, описанному выше прямолинейному подходу будет соответствовать тривиальное определение: Т({Гх1...хп =...})=С^ л...лСХп.

В приведенном примере с функциями f и Ь мы показали, опираясь только на здравый смысл, что аргументы, к которым в данном случае применяется £ всегда корректны. Определим теперь функцию Т^) таким образом, чтобы иметь воз-

можность проделывать эту процедуру автоматически и формально. Будем рассматривать T(f) как функцию, определенную для различных видов Хаскел-выражений. При этом вычисление T(f)

для функции f будет заключаться в вычислении функции T для ее тела, которое, конечно же, является выражением. Запишем это в виде T({fx1...xn= expf}) = T(expf).

Несколько упрощая задачу, а именно, не рассматривая рекурсию и функции высшего порядка, достаточно определить T лишь для следующих видов выражений: условные выражения, применения функций, переменные и все остальные.

Самое существенное здесь - условные выражения, поскольку они являются прямым показателем зависимости результата от входных данных. Операционно это выражается в том, что исследуемое выражение вычисляется тогда, когда нужно вычислить значение всего условного выражения: T({if eif thenet elseef})=T(eif )ле1Г::: True ^

^T(et)л^ :::False^T(ef).

Здесь для построения шаблона высказывания мы рекурсивно используем T(e) для подвыражений. Шаблон представляет собой конъюнкцию корректности исследуемого выражения eif и корректности обеих ветвей. Главное то, что корректность каждой ветви утверждается лишь при условии, что была выбрана именно она, то есть лишь при определенном, истинном или ложном значении eif .

В правой части выражение eif присутствует и

само по себе, не как аргумент T. Его свободные переменные - свободные переменные получившегося шаблона. На их место будут подставлены аргументы, к которым применяется функция.

Для выражения, представляющего собой применение функции к аргументам, нужно опять решить ту самую задачу, которая ставится в данной работе. Очевидно, T для таких выражений будет определяться рекурсивно. Сначала для применяемой функции вычисляется шаблон высказывания, после чего в него подставляются фактические аргументы и утверждения их корректности. Однако надо понимать, что подставляемые утверждения на данном этапе сами являются шаблонами, поскольку это происходит также внутри функции T.

T({gei...en})=

= T(g)[xi /e ,...,Xn /en ,Cx1 /Ce1 ,...,Cxn /Cen ],

Cei=T(ei ),T(g)=T(eg ^...x^e,.

Для всех остальных выражений T(e) можно определить как

T(e) = T(e^..^T(ek), где {e r..,ek}=Exps(e).

Здесь Ехрэ(е) - подвыражения е. Таким образом, для выражения, которое не является условным или применением функции, просто берется конъюнкция утверждений корректности его подвыражений.

И, наконец, выражению, представляющему собой просто переменную х, функция Т ставит в соответствие переменную-высказывание Сх. На ее место в дальнейшем будет подставлено утверждение корректности выражения, передаваемого функции на месте параметра х: Т({х}) = Сх.

Такого тривиального определения функции Т для нескольких видов выражений оказывается достаточно для того, чтобы получать существенно более слабые утверждения корректности во многих случаях. Данная техника может применяться к выражениям произвольной вложенности, в том числе к многократно вложенным условным выражениям. В этом случае шаблон высказывания будет включать вложенные импликации.

При решении задачи определения корректности программы с точки зрения правильности ис-

пользования определенных функций можно получать различные утверждения логики. Все они будут верными в том смысле, что их истинность соответствует корректности программы. Однако при тривиальном подходе получаемые утверждения в большинстве случаев слишком сильны. Следовательно, во-первых, их сложнее доказывать и, во-вторых, большее множество программ будет признано некорректными. Предложенная методика позволяет получать более слабые утверждения корректности программ. Таким образом, корректность становится легче доказуемой, и множество доказуемо корректных программ лучше аппроксимирует множество действительно корректных.

Список литературы

1. Peyton Jones S. и др. Report on the programming language Haskell 98, a non-strict, purely functional language, http://haskell.org, 1999.

2. Augustsson L. Compiling lazy functional languages, part II, Chalmers University, 1987.

3. Ennals R., Peyton Jones S. Optimistic evaluation: an adaptive evaluation strategy for non-strict programs, International Conference on Functional Programming, 2003.

ПРИНЯТИЕ ПРОЕКТНЫХ РЕШЕНИИ НА ОСНОВЕ АНАЛИЗА НЕЧЕТКИХ ТЕНДЕНЦИЙ ВРЕМЕННЫХ РЯДОВ

А.А. Стецко, к.т.н. (НПО «Марс», г. Ульяновск)

Сложные технические системы, такие как вычислительные сети, обладают объективной неопределенностью, что требует дальнейшего расширения инструментария прогностики. Все чаще используются интеллектуальные методы, которые расширяют классическую классификацию прогностических методов и представляют собой сочетание формализованных процедур обработки информации, полученной по оценкам специалистов-экспертов. Исследования данных и методов анализа в последние десятилетия оформились в виде отдельного направления, называемого TimesSeries Data Mining. В работах ряда зарубежных и российских ученых [1, 7-10] исследованы методы нечеткой регрессии, анализа данных нечетких временных рядов (НВР).

Нечеткое преобразование (F-преобразование) - методика, разработанная И. Перфильевой [4], которая может быть отнесена к методикам нечеткого приближения. Нечеткое преобразование позволяет провести фильтрацию исходного временного ряда (ВР) и выделить тренд. Если полученный в результате F-преобразования тренд разложить на нечеткие тенденции (НТ) методом скользящего окна, то полученный итог позволяет

принять управленческое или проектное решение на основе знаний о значимости тенденций.

В данной статье предложен гибридный метод, сочетающий F-преобразования и НТ для принятия решений, и его применение для задач анализа эффективности эксплуатации информационных систем на основе исходных данных системных журналов.

Основные определения анализа НВР. Для

описания развития моделируемого процесса в лингвистических терминах введем понятие временного ряда нечетких тенденций (ВРНТ). Выделим базовые операции обработки НТ.

Определение 1. НТ. Пусть yд= {y 1v..,ym} -

НВР лингвистической переменной (Y ,Ty,Uy,

GyMy), Уд = {y д} - множество НВР одинаковой

длины. Тогда НТ т, определенная на Уд, есть совокупность упорядоченных пар T={yд (yд)}, где цт (yд) представляет собой степень принадлежности y д к НТ.

Если говорить о тенденции как лингвистической переменной, терм-множеством которой явля-

i Надоели баннеры? Вы всегда можете отключить рекламу.