Русский
Русский
English
Статистика
Реклама

Формальная верификация

Анализ кода систем повышенной надежности

21.07.2020 14:09:04 | Автор: admin
Привет Хабр! В этой статье я хочу поговорить о достаточно мало рассматриваемой теме анализа кода систем повышенной надежности. На хабре много статей о том, что такое хороший статический анализ, но в этой статье я бы хотел рассказать о том, что такое формальная верификация кода, а также объяснить опасность бездумного применения статических анализаторов и стандартов кодирования.

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

Краткий экскурс завершен, и давайте посмотрим как доказывается надежность кода. Сначала надо разобраться с характеристиками кода, соответствующего требованиям по надежности. Сам термин надежность кода выглядит достаточно расплывчато и противоречиво. Поэтому я предпочитаю ничего не придумывать, и при оценке надежности кода руководствуюсь отраслевыми стандартами, например ГОСТ Р ИСО 26262 или КТ-178С. Формулировки в них разные, но идея одинакова: надежный код разработан по единому стандарту (так называемому стандарту кодирования) и количество ошибок времени исполнения в нем минимизировано. Однако, тут не все так просто стандартами предусмотрены ситуации, когда например соблюдение стандарта кодирования не представляется возможным и такое отступление требуется задокументировать

Опасная трясина MISRA и подобных


Стандарты кодирования предназначены для того, чтобы ограничить использование конструкций языка программирования, которые могут быть потенциально опасны. По идее, это должно повышать качество кода, верно? Да, это обеспечивает качество кода, но всегда важно помнить, что 100% соответствие правилам кодирования не является самоцелью. Если код на 100% соответствует правилам какой-нибудь MISRA, то это совсем не значит, что он хороший и правильный. Можно потратить кучу времени на рефакторинг, вычищение нарушений стандарта кодирования, но все это будет впустую если код в итоге будет работать неправильно или содержать ошибки времени исполнения. Тем более, что правила из MISRA или CERT это обычно только часть стандарта кодирования, принятого на предприятии.

Статический анализ не панацея


Стандарты предписывают проведение систематических код-ревью для того, чтобы найти дефекты в коде и проанализировать код на стандарты кодирования.

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

Формальная верификация кода


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

Прежде всего требуется понять, что же это за зверь? Формальная верификация это доказательство безошибочности кода при помощи формальных методов. Звучит страшно, но на самом деле это как доказательство теоремы из матана. Никакой магии тут нет. Данный метод отличается от традиционного статического анализа, так как используется абстрактная интерпретация, а не эвристики. Это дает нам следующее: мы можем доказать, что в коде нет определенных ошибок времени исполнения. Что это за ошибки? Это всякие выходы за границы массива, деление на ноль, переполнение целых и так далее. Их подлость заключается в том, что компилятор соберет код, содержащий такие ошибки (так как такой код синтаксически корректен), но зато при запуске этого кода они проявятся.

Посмотрим на пример. Ниже в спойлерах представлен код для простого ПИ-регулятора:

Посмотреть код
pictrl.c
#include "pi_control.h"/* Global variable definitions */float inp_volt[2];float integral_state;float duty_cycle;float direction;float normalized_error;/* Static functions */static void pi_alg(float Kp, float Ki);static void process_inputs(void);/* control_task implements a PI controller algorithm that ../  *  * - reads inputs from hardware on actual and desired position  * - determines error between actual and desired position  * - obtains controller gains  * - calculates direction and duty cycle of PWM output using PI control algorithm  * - sets PWM output to hardware  *  */void control_task(void){  float Ki;  float Kp;  /* Read inputs from hardware */  read_inputs();  /* Convert ADC values to their respective voltages provided read failure did not occur, otherwise do not update input values */  if (!read_failure)  {    inp_volt[0] = 0.0048828125F * (float) inp_val[0];    inp_volt[1] = 0.0048828125F * (float) inp_val[1];  }    /* Determine error */  process_inputs();    /* Determine integral and proprortional controller gains */  get_control_gains(&Kp,&Ki);    /* PI control algorithm */  pi_alg(Kp, Ki);  /* Set output pins on hardware */  set_outputs();}/* process_inputs  computes the error between the actual and desired position by  * normalizing the input values using lookup tables and then taking the difference */static void process_inputs(void){  /* local variables */  float rtb_AngleNormalization;  float rtb_PositionNormalization;  /* Normalize voltage values */  look_up_even( &(rtb_AngleNormalization), inp_volt[1], angle_norm_map, angle_norm_vals);   look_up_even( &(rtb_PositionNormalization), inp_volt[0], pos_norm_map, pos_norm_vals);   /* Compute error */  normalized_error = rtb_PositionNormalization - rtb_AngleNormalization;}/* look_up_even provides a lookup table algorithm that works for evenly spaced values.  *   * Inputs to the function are...  *     pY - pointer to the output value  *     u - input value  *     map - structure containing the static lookup table data...  *         valueLo - minimum independent axis value  *         uSpacing - increment size of evenly spaced independent axis  *         iHi - number of increments available in pYData  *         pYData - pointer to array of values that make up dependent axis of lookup table   *   */void look_up_even( float *pY, float u, map_data map, float *pYData){  /* If input is below range of lookup table, output is minimum value of lookup table (pYData) */  if (u <= map.valueLo )   {    pY[1] = pYData[1];  }   else   {    /* Determine index of output into pYData based on input and uSpacing */    float uAdjusted = u - map.valueLo;    unsigned int iLeft = uAdjusted / map.uSpacing;/* If input is above range of lookup table, output is maximum value of lookup table (pYData) */    if (iLeft >= map.iHi ) {      (*pY) = pYData[map.iHi];    } /* If input is in range of lookup table, output will interpolate between lookup values */else {      {        float lambda;  // fractional part of difference between input and nearest lower table value        {          float num = uAdjusted - ( iLeft * map.uSpacing );          lambda = num / map.uSpacing;        }        {          float yLeftCast;  // table value that is just lower than input          float yRghtCast;  // table value that is just higher than input          yLeftCast = pYData[iLeft];          yRghtCast = pYData[((iLeft)+1)];          if (lambda != 0) {            yLeftCast += lambda * ( yRghtCast - yLeftCast );          }          (*pY) = yLeftCast;        }      }    }  }}static void pi_alg(float Kp, float Ki){  {    float control_output;float abs_control_output;    /*  y = integral_state + Kp*error   */    control_output = Kp * normalized_error + integral_state;/* Determine direction of torque based on sign of control_output */    if (control_output >= 0.0F) {      direction = TRUE;    } else {      direction = FALSE;    }/* Absolute value of control_output */    if (control_output < 0.0F) {      abs_control_output = -control_output;    } else if (control_output > 0.0F) {  abs_control_output = control_output;}    /* Saturate duty cycle to be less than 1 */    if (abs_control_output > 1.0F) {  duty_cycle = 1.0F;} else {  duty_cycle = abs_control_output;}    /* integral_state = integral_state + Ki*Ts*error */    integral_state = Ki * normalized_error * 1.0e-002F + integral_state;    }}


pi_control.h
/* Lookup table structure */typedef struct {  float valueLo;  unsigned int iHi;  float uSpacing;} map_data;/* Macro definitions */#define TRUE 1#define FALSE 0/* Global variable declarations */extern unsigned short inp_val[];extern map_data angle_norm_map;extern float angle_norm_vals[11];extern map_data pos_norm_map;extern float pos_norm_vals[11];extern float inp_volt[2];extern float integral_state;extern float duty_cycle;extern float direction;extern float normalized_error;extern unsigned char read_failure;/* Function declarations */void control_task(void);void look_up_even( float *pY, float u, map_data map, float *pYData);extern void read_inputs(void);extern void set_outputs(void);extern void get_control_gains(float* c_prop, float* c_int);



Запустим проверку при помощи Polyspace Bug Finder, сертифицируемого и квалифицируемого статического анализатора и получим такие результаты:



Для удобства, сведем результаты в таблицу:

Посмотреть результаты
Дефект
Описание
Строка
Non-initialized variable
Local variable 'abs_control_output' may be read before being initialized.
159
Float division by zero
Divisor is 0.0.
99
Array access out of bounds
Attempt to access element out of the array bounds.
Valid index range starts at 0.
38
Array access out of bounds
Attempt to access element out of the array bounds.
Valid index range starts at 0.
39
Pointer access out of bounds
Attempt to dereference pointer outside of the pointed object at offset 1.
93


А теперь верифицируем этот же код при помощи инструмента формальной верификации Polyspace Code Prover:


Зеленый цвет в результатах это код, для которого отсутствие ошибок времени выполнения было доказано. Красный доказана ошибка. Оранжевый инструменту не хватило данных. Результаты, помеченные зеленым цветом самые интересные. Если для части кода доказано отсутствие ошибки времени выполнения, то для этой части кода можно значительно сократить объем тестирования (например, тестирование на робастность уже можно не проводить) А теперь, посмотрим на сводную таблицу потенциальных и доказанных ошибок:

Посмотреть результаты
Проверка
Строка
Описание
Out of bounds array index
38
Warning: array index may be outside bounds: [array size undefined]
Out of bounds array index
39
Warning: array index may be outside bounds: [array size undefined]
Overflow
70
Warning: operation [-] on float may overflow (on MIN or MAX bounds of FLOAT32)
Illegally dereferenced pointer
93
Error: pointer is outside its bounds
Overflow
98
Warning: operation [-] on float may overflow (result strictly greater than MAX FLOAT32)
Division by zero
99
Warning: float division by zero may occur
Overflow
99
Warning: operation [conversion from float32 to unsigned int32] on scalar may overflow (on MIN or MAX bounds of UINT32)
Overflow
99
Warning: operation [/] on float may overflow (on MIN or MAX bounds of FLOAT32)
Illegally dereferenced pointer
104
Warning: pointer may be outside its bounds
Overflow
114
Warning: operation [-] on float may overflow (result strictly greater than MAX FLOAT32)
Overflow
114
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
115
Warning: operation [/] on float may overflow (on MIN or MAX bounds of FLOAT32)
Illegally dereferenced pointer
121
Warning: pointer may be outside its bounds
Illegally dereferenced pointer
122
Warning: pointer may be outside its bounds
Overflow
124
Warning: operation [+] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
124
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
124
Warning: operation [-] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
142
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
142
Warning: operation [+] on float may overflow (on MIN or MAX bounds of FLOAT32)
Non-uninitialized local variable
159
Warning: local variable may be non-initialized (type: float 32)
Overflow
166
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
166
Warning: operation [+] on float may overflow (on MIN or MAX bounds of FLOAT32)



Эта таблица говорит мне о следующем:

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

Может показаться что формальная верификация это очень круто и следует неудержимо верифицировать весь проект. Однако, как и у любого инструмента тут есть ограничения, касающиеся в первую очередь временных затрат. Если коротко формальная верификация это медленно. Очень медленно. Быстродействие упирается в математическую сложность как самой абстрактной интерпретации, так и объема верифицируемого кода. Поэтому не стоит пытаться с наскоку верифицировать ядро Linux. Все проекты верификации в Polyspace могут быть разбиты на модули, которые могут быть верифицированы независимо друг от друга, а также у каждого модуля есть своя конфигурация. То есть мы можем настраивать тщательность верификации для каждого модуля отдельно.


Доверие к инструментам


Когда вы имеете дело с отраслевыми стандартами, типа КТ-178С или ГОСТ Р ИСО 26262, то вы постоянно сталкиваетесь с такими штуками как доверие к инструменту или квалификация инструмента. Что же это такое? Это такой процесс, в ходе которого вы показываете, что результатам работы инструментов разработки или тестирования, которые были использованы в проекте можно доверять и их ошибки задокументированы. Этот процесс тема отдельной статьи, так как не все очевидно. Главное здесь следующее: инструменты, применяющиеся в индустрии всегда идут вместе с набором документов и тестов которые помогают в этом процессе.

Итоги


На простом примере мы посмотрели на различие между классическим статическим анализом и формальной верификацией. Можно ли применять ее вне проектов требующих следования отраслевым стандартам? Да, конечно, можно. Можно даже попросить пробную версию тут.

К слову, если вам интересно, можно сделать отдельную статью про сертификацию инструментов. Напишите в комментариях, нужна ли такая статья.
Подробнее..

Семинары лаборатории языковых инструментов JetBrains Research

29.10.2020 20:09:21 | Автор: admin
Лаборатория языковых инструментов совместная инициатива JetBrains и математико-механического факультета СПбГУ.

Сотрудники лаборатории исследуют:
  • формализацию и верификацию семантики языков программирования в контексте слабых моделей памяти;
  • логическое и реляционное программирование;
  • теорию формальных языков и ее применения;
  • метапрограммирование, специализацию и частичные вычисления;
  • формальную верификацию и применение SMT-решателей.

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



Прошедшие доклады:

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

Первым шагом к решению этой проблемы является формализация файловых систем. В докладе мы рассмотрим Linux ext4 и её формальную модель, интегрированную с моделью памяти C/С++11. Кроме того, обсудим адаптацию алгоритма проверки моделей GenMC для верификации программ, работающих с файлами. В конце будут приведены примеры ошибок, которые удалось найти с помощью адаптированного GenMC в текстовых редакторах, таких как vim и nano.

Докладчик: Илья Кайсин

Ссылка

Реализация сжатия ссылок в кучу в GraalVM Native Image
В некоторых приложениях размер адресного пространства существенно превышает размер области памяти, на которую может ссылаться указатель. Сжатие ссылок позволяет уменьшить размер приложения и ускорить его выполнение и старт. Рассматриваются варианты реализации сжатых ссылок. Демонстрируется способ легкого введения сжатия ссылок в хорошо организованную реализацию языков программирования.

Докладчик: Олег Плисс

Ссылка

Слегка субкубический алгоритм для задачи поиска путей с контекстно-свободными ограничениями
Все мы так или иначе сталкиваемся с задачами, решаемыми за полиномиальное время. Но есть такие задачи, для которых кубическое или, например, квадратичное время работы является слишком неэффективным для использования на практике. Возникает вопрос, может ли конкретная задача быть решена немного быстрее, например, хотя бы за субкубическое (n^{3-e}) (или субквадратичное) время? Если нет, то как показать, что такое время работы оптимально?

В докладе будет рассмотрена одна из таких задач задача поиска путей с контекстно-свободными ограничениями (CFL-reachability), к которой сводится большое количество задач анализа программ. Вопрос о существовании субкубического алгоритма для решения этой задачи является открытым уже более 30 лет. Оптимально ли классическое кубическое решение? Мы попробуем ответить на этот вопрос, используя инструменты современного направления теории сложности fine-grained complexity. Также будет показано, как ускорить время решения на логарифмический фактор, получив тем самым "слегка субкубический" алгоритм для задачи CFL-reachability.

Докладчик: Екатерина Шеметова

Ссылка

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

Докладчик: Екатерина Вербицкая

Ссылка

Проверка моделей в слабых моделях памяти
Проверка моделей это метод автоматической формальной верификации программ. На сегодняшний день большинство инструментов для проверки моделей либо не учитывают эффекты, возникающие в слабых моделях памяти, либо работают только с некоторой фиксированной моделью. Среди этих инструментов выделяется GenMC, который не привязан к конкретной модели памяти. GenMC может работать с широким классом моделей (в который входят, например, модели RC11 и IMM). Тем не менее наиболее сложные и интересные модели (Promising, Weakestmo) не поддерживаются, так как эти в этих моделях не выполняются некоторые свойства, подразумеваемые GenMC. Кроме того, оказывается что и сами эти модели (Promising, Weakestmo), настолько слабые, что какой-либо алгоритм их проверки может оказаться неприменимым на практике.

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

Докладчик: Евгений Моисеенко

Ссылка

Логическое программирование высшего порядка
В докладе мы познакомимся с языком программирования Prolog. Объединяя логическое программирование с программированием высшего порядка, Prolog позволяет естественным образом поддерживать HOAS для описания языков, избавляя программиста от необходимости ручной работы со связываниями переменных. В случае с отношениями высшего порядка унификация является неразрешимой, однако существует некоторое подмножество языка, на котором унификацию всегда можно выполнить. Я расскажу про то, зачем нужно логическое программирование высшего порядка и как в нем реализовать унификацию.

Докладчик: Екатерина Вербицкая

Ссылка

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

Докладчик: Даниил Березун

Ссылка

Переоснащение параллелизма для OCaml
Сейчас ведется работа на новой реализацией среды исполнения программ на языке OCaml, с улучшенной поддержкой параллелизма. В докладе будут рассмотрены выдвинутые требования и инженерные решения, которые были приняты, чтобы удовлетворить этим требованиям

Докладчик: Дмитрий Косарев

Ссылка

О представимости инвариантов программ с алгебраическими типами данных
Со времён появления логики Хоара принято выражать свойства и сертификаты корректности программ на языках первого порядка. Современные методы автоматического вывода индуктивных инвариантов программ ориентированы на представление инвариантов также в логике первого порядка. Хотя такие представления очень выразительны для некоторых теорий (LIA, LRA BV, теория массивов), они не позволяют выразить многие интересные свойства программ над алгебраическими типами данных (АТД).

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

Докладчик: Юрий Костюков

Ссылка

Разработка компиляторов предметно-ориентированных языков для спецпроцессоров
В составе современных вычислительных систем все чаще используются аппаратные спецпроцессоры, программируемые на предметно-ориентированных языках. Популярность набирает подход compiler-in-the-loop, предполагающий совместную разработку спецпроцессора и компилятора. При этом традиционный инструментарий, GCC и LLVM, оказывается недостаточным для быстрой разработки оптимизирующих компиляторов, порождающих целевой код нетрадиционной, нерегулярной архитектуры со статическим параллелизмом операций.

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

Докладчик: Пётр Советов

Ссылка

Логика некорректности
Всем хорошо известна так называемая логика корректности Хоара, позволяющая формально доказать, что программа работает правильно. А что если мы захотим формально доказать, что в программе есть баг? Например, что программа упадет, если дать ей на вход очень большую строку, при этом не уточняя, какая именно это строка. Оказывается, процесс доказательства наличия бага в программе можно формализовать так же, как мы формализуем доказательство корректности с помощью логики Хоара, используя Логику Некорректности В докладе мы поговорим про Логику Некорректности: обсудим ее связь с логикой корректности Хоара, посмотрим на ее натуральный вывод и семантику, отловим пару багов и, наконец, рассмотрим, как она связана с Динамической Логикой и Relation Algebra.

Докладчик: Владимир Гладштейн

Ссылка

Семантика рекурсивных типов с индексацией шагов исполнения
Стандартным подходом для задачи написания и проверки безопасности ненадежного кода является построение системы типов, выделяющей безопасные программы. При этом обосновывать корректность системы типов можно двумя принципиально разными путями: синтаксически (доказывая прогресс и сохранение типа напрямую по правилам типизации) и семантически (используя некоторую математическую модель для типов). Appel и McAllester предложили метод построения семантической модели на базе аппроксимаций результата исполнения программы для заданного числа шагов. В отличие от других известных конструкций, такая семантика не полагается на понятия из теории решеток или теории рекурсии, поэтому проста для формализации. В то же время, она позволяет описывать нетривиальные и полезные расширения, такие как рекурсивные типы.

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

Докладчик: Дима Розплохас

Ссылка

Ближайший доклад 2 ноября сделает Антон Трунов по теме Неразличимые доказательства: по определению, но без аксиомы К. Присоединяйтесь в 17:30 в Google Meet по ссылке.

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

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

Чтобы получать анонсы наших семинаров:
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru