juan_gandhi: (Default)
[personal profile] juan_gandhi
Тут в разговоре про очередного, имхо, шарлатана, профессора Шалыто, выяснилось, что есть такая идея, будто для верификации программ достаточно FSM, конечного автомата.

Вот скажите мне, возьмём такой пример: даден алфавит, {a, b}, и две программы, одна генерирует все палиндромы в этом алфавите, вторая проверяет, что данная строка является палиндромом.

Скажите, какой конечный автомат может верифицировать эти программы?

Date: 2010-05-08 11:00 pm (UTC)
From: [identity profile] panchul.livejournal.com
А что, формальная верификация софтверных программ имеет реальное применение? В какой области? Я знаком только с формальной верификацией хардвера (поверхностно), и с динамической верификацией хардвера (coverage-driven constraint-random verification, SystemVerilog/VMM).

Date: 2010-05-08 11:15 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Это мой следующий вопрос: а что, собственно, это за штука такая, верификация программ? Верификация хардвера, для меня по крайней мере, имеет какой-то смысл, потому что хардвер конечен.

Date: 2010-05-09 12:23 am (UTC)
From: [identity profile] panchul.livejournal.com
Хардвер не совсем конечен. Хотя пространство состояний принципиально меньше, чем у софтвера, перебрать все пространство состояний и переходов даже простого устройства нереально. Именно для этого изобретены методологии с комбинацией динамической симуляции, формальной верификации, coverage и constraint random. Кроме этого в хардвере везде параллельность, что усложняет дело.

То, что верификация хардвера существует (как распостраненное занятие), а верификация софтвера - нет, объясняется не только "конечностью" хардвера, но и более высокими требованиями к качеству, чем у софтвера (после отправления дизайна на фабрику его не поменяешь (за исключением FPGA)). Верификация софтвера (I guess) наверное имеет практический смысл только для RTOS, которые маленькие, сильно параллельные, и имеют четко определенные абстракции (threads, mailbox, semaphore) и т.д.

Date: 2010-05-09 12:32 am (UTC)
From: [identity profile] vit-r.livejournal.com
Грубо говоря, по стандартам весь mission critical софт должен верифицироваться. В большинстве случаев, правда, это некий ручной процесс, близкое знакомство с которым лишает всяческих светлых иллюзий.

Date: 2010-05-10 07:09 pm (UTC)
From: [identity profile] 99f.livejournal.com
А вы пишете бесконечные программы? :-)

Date: 2010-05-10 07:43 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Можете поискать мою имплементацию аксиоматики Цермело-Френкеля. На джаве.

Date: 2010-05-10 08:01 pm (UTC)
From: [identity profile] 99f.livejournal.com
Могу конечно, но смысла не вижу. Уверен что ваша программа конечна. Вряд ли грамматика языка Java допускает бесконечные программы.

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

Верификация программ (а не их исполненений) рассматривает программу как математический объект - формулу, конечной длины, и доказывает о нем некоторые теоремы. Никакой разницы с верификацией аппаратуры в принципе нет.
(deleted comment)

Date: 2010-05-09 12:41 am (UTC)
From: [identity profile] panchul.livejournal.com
По ссылке написано в основном про хардвер (combinational circuits, digital circuits with internal memory) и специальные случаи софтвера (cryptographic protocols, ..., and software expressed as source code.) Программные продукты для верификации хардвера на рынке существуют (например программы, которые доказывают те или иные свойства для RTL (register-transfer-level) дизайнов на Verilog, или которые определяют эквивалентность двух дизайнов, или верификация с помощью симуляции с хитрыми методами генерации случайных транзакций, подсчета покрытия и state space exploration. См. http://pikibook.com/electrical-engineering/digital-electronics/verilog-hdl/advanced-verification-techniques-summary

А вот программные продукты для верификации софтвера я не знаю, поэтому и спрашиваю. Я предполагаю, что они должны существовать для RTOS, которые маленькие, сильно параллельные, и имеют четко определенные абстракции (threads, mailbox, semaphore) и т.д. Но тогда встает вопрос - что для таких программ верификации является входным языком, который они парсируют? С/C++/Java? Эти языки труднее верифицировать, чем RTL-подмножество верилога ИМХО, ибо в них главную роль играют всякие динамические структуры (деревья с поинтерами), семантика которые на уровне языка не особенно видна (в то время как из кода на верилоге можно извлечь state machine).
(deleted comment)

Date: 2010-05-09 12:53 am (UTC)
From: [identity profile] panchul.livejournal.com
О, спасибо, это я и спрашивал

Date: 2010-05-09 01:31 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Второй линк особенно прикольный. Сейчас, 14 лет спустя, было бы интересно вернуться к этому вопросу, действительно ли они что-то доказали в системе предотвращения наводнений в Голландии.
(deleted comment)

Date: 2010-05-09 01:32 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Вот и у меня такое же впечатление. :)

Date: 2010-05-09 12:07 am (UTC)
From: [identity profile] vit-r.livejournal.com
"Нет такой буквы в этом слове."

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

Приличные системные требования, что я видел, описывались в таблицах переходов. (Хотя, софтверные люди и утверждали, что это прошлый век и не модно.) Естественно, размеры таблиц очень невелики.
(deleted comment)

Date: 2010-05-09 12:29 am (UTC)
From: [identity profile] vit-r.livejournal.com
и выдаст правильное значение

Ну я ж русским языком пишу "практически"

В большинстве случаев она выдаёт правильное значение. В остальных - падает кверху лапками и производит перезапуск. Если может.

(deleted comment)

Date: 2010-05-09 12:43 am (UTC)
From: [identity profile] vit-r.livejournal.com
В принципе, у оператора есть кнопка горячего перезапуска. Ну, или детонатор для автономной системы.
(deleted comment)

Date: 2010-05-09 01:00 am (UTC)
From: [identity profile] vit-r.livejournal.com
Уважаемый, писать что-то для такого софта можно не на языке С, С++ или Паскале, а только на строго ограниченном подмножестве.
Тут в каждой строчке нарушены базовые требования любого стандарта на кодирование.
(deleted comment)

Date: 2010-05-09 01:12 am (UTC)
From: [identity profile] vit-r.livejournal.com
Первым делом, в приличных системах не одна программа, а минимум две, работающих параллельно.

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

Весёлым же местом в таких системах являются не зацикливания, а дидлоки. Беда в том, что о существовании асинхронных не все специалисты подозревают. А оттестировать такое дело очень и очень сложно.
(deleted comment)

Date: 2010-05-09 01:43 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
У меня такое ощущение, что собеседник немножко поплыл.

Date: 2010-05-09 02:06 am (UTC)
From: [identity profile] vit-r.livejournal.com
Я не поплыл. Тут просто четыре часа ночи и мне очень влом.

Date: 2010-05-09 02:13 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Ну можно же и не спешить вступать в бой в 4-то часа ночи, а? :)

Date: 2010-05-09 02:31 am (UTC)
From: [identity profile] vit-r.livejournal.com
Естественно, я параллельно что-то другое делаю. А завтра будет просто не интересно.

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

Но спор как-то перекинулся на "теория против практики". Ш. упирал именно на практику. Если у Ш. есть какие-то теории, я априори не очень верю, но искать блох мне влом.

Date: 2010-05-09 02:27 am (UTC)
From: [identity profile] vit-r.livejournal.com
Мы говорим о верифицированном компиляторе или о верифицированной системе управления?

1) если заменять на полностью систему, то туда придётся включать железо. Так что кнопка "рестарт" входит.

2) в общем случае верификация является утверждением, а не доказательством.
Теоретическое доказательство я видел только в очень редких случаях. Точнее, не видел, а читал отчёты об успешном проведении. Судя по тому, что делал в одном проекте математик, у меня в успешности большие сомнения.

3) работает фактор ответственности. То есть, выдача неправильного ответа - это провал. Невыдача ответа - срабатывание защиты.

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

Про лайвлоки - да. Но, подозреваю, условия в реальности для них возникают очень редко.
(deleted comment)

Date: 2010-05-09 09:21 am (UTC)
From: [identity profile] vit-r.livejournal.com
а о верификации исходного кода в системе тира spin.

Как сравнивается объём кода известных систем этого тира с теми системами, которые делает Ш.? Решают ли эти системы те же задачи?

является доказательством
...но во многих практических случаях она решается с применением разных эвристических методов.


Не понял. Также не понял, как мы будем это рассматривать в реалтайме для взаимодействия двух систем.

невыдача ответа вовремя в системе реального времени - это по определению провал.
Я тоже так думал. В документах, что я видел, стоит иное. Система несколько раз перезапускается. Если неудачно, то просто вырубается.

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

Ладно. Это был мой последний выпад.

Date: 2010-05-09 01:13 am (UTC)
From: [identity profile] vit-r.livejournal.com
На всякий случай:
Любой тезис можно доказать, приведя левый, не относящийся к делу аргумент.

Date: 2010-05-09 01:42 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
О! Вы переводите разговор на совершенно несущественные рельсы. Этот пример, выше - прекрасный пример, очень содержательный. И разговаривать о нём надо по существу.

Date: 2010-05-09 02:04 am (UTC)
From: [identity profile] vit-r.livejournal.com
совершенно несущественные рельсы

По существу, верифицировать можно только вполне определённый класс задач на вполне определённом множестве. Кстати, палиндромов это тоже касается.

Короче говоря, если мы говорим о поезде, то он ездит по рельсам. Если не по рельсам, то это уже не поезд.

А так, да. Разговор идёт мимо.

Date: 2010-05-09 12:39 am (UTC)
From: [identity profile] mr-aleph.livejournal.com
м, непонятно что значит верифицировать программу конечным автоматом.

Date: 2010-05-09 01:44 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Мне тоже, на самом деле.

Date: 2010-05-09 08:37 am (UTC)
From: [identity profile] dtim.livejournal.com
Там как бы не совсем обычные автоматы, там автоматы, работающие с бесконечными цепочками (например, Büchi automaton). Но количество состояний конечно, да. При этом нет задачи смоделировать поведение программы конечным автоматом: вместо этого поведение системы представляется в виде цепочки символов, и множества таких цепочек задаются с помощью автоматов.

Идея примерно такая. Сначала формулируем свойство, которое хочется проверить. Затем, ориентируясь на это свойство, строим модель программы, которая отражает все, что важно с точки зрения нашего свойства, а все остальное игнорирует. Модель может быть в разных формах, на практике чаще всего используют Spin, который тут уже упоминали, и описывают поведение программы на языке Promela. Потом по этому описанию строится структура Крипке: набор логических переменных, набор состояний, о каждом из которых известно, истинна или ложна в нем каждая переменная, и набор переходов между состояниями. Свойство, которое хочется проверять, записываем формально в какой-нибудь темпоральной логике (автоматный подход используется обычно для логики LTL). Берем отрицание полученной формулы. Дальше по структуре Крипке строим автомат Бюхи, он будет допускать возможные в системе (бесконечные) последовательности интерпретаций набора переменных. По LTL-формуле отрицания свойства тоже строим автомат Бюхи, он будет допускать такие последовательности интерпретаций переменных, которые нарушают интересующее нас свойство. Проверяем, что произведение этих автоматов допускает пустой язык. Это значит, что ни одна траектория в структуре Крипке не нарушает интересующего нас свойства. Если язык не пуст - это множество контрпримеров. Входными символами для автоматов являются интерпретации логических переменных структуры Крипке, которые обычно вычисляются на основе входов, выходов и иногда состояний анализируемой системы, так что можно потом по набору значений этих переменных определить, какие собственно входные воздействия имели место - каждый контрпример оказывается воспроизводимым багом.

Формально любой компьютер, выполняющий любую программу - это конечная система, но состояний там слишком много. Поэтому верифицируют (как и в случае с железом) не реальный код, а его модель. Хочется строить такие модели с как можно меньшими затратами человеческого труда, но здесь, мне кажется, еще работать и работать. До промышленного повседневного применения далеко, хотя есть интересные результаты (Java PathFinder (http://babelfish.arc.nasa.gov/trac/jpf), например).

Date: 2010-05-09 04:22 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Огромное спасибо! Узнал много новых слов и понятий.

Date: 2010-05-09 01:05 am (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Хм. Вот есть программа
ispal x = x == reverse x
Можно ли верифицировать ее правильность конечным автоматом? Это же практически определение палиндрома, доказывать нечего. Может ли конечный автомат проверить, правильно ли записано определение? Хрен его знает, почему бы и нет? Во всяком случае, к какому классу относится язык, принимаемый программой, здесь вроде бы не играет роли. Нам больше интересен язык, на котором она написана.

Date: 2010-05-09 01:44 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Да. Хороший вопрос. Можно?

Date: 2010-05-09 02:28 am (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Да вот непонятно. С одной стороны вроде нельзя, надо хотя бы уметь имена переменных запоминать и потом сравнивать. С другой стороны, это тривиальная надстройка над конечным автоматом. Может, можно препроцессинг какой запустить и избавиться от таких переменных, а потом уже верифицировать. Содержательная часть — это доказательство некоторого утверждения о программе. Доказательства каких-то тривиальных утверждений можно породить конечным автоматом. Может быть, можно придумать язык, на котором легко писать так, чтобы большинство интересных нам утверждений были в нужном смысле тривиальными (типа «определение записано правильно»). Я не знаю.

Date: 2010-05-09 03:34 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Язык вроде Агды?

Date: 2010-05-09 05:12 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Я тут посмотрел комменты и понял, что очень мало об этом понимаю. Наверное, классическим FSM это делать если и можно, то слишком сложно и непонятно зачем. Но утверждать наверняка не берусь.

Date: 2010-05-10 02:36 am (UTC)
From: [identity profile] cadadr.livejournal.com
Я знаю больше Coq, его язык можно считать чем-то подходящим.

Всё опирается как раз на логику и типы,
это не бином Ньютона конечные автоматы.

http://adam.chlipala.net/cpdt/

Date: 2010-05-10 01:04 pm (UTC)
From: [identity profile] 99f.livejournal.com
Всякая программа на С имеет не более 2^{sizeof(void*)*CHAR_BIT} состояний (упражнение: обобщить последнее утверждение на случай программ работающих с файлами) и следовательно поведение всех программ в данной реализации стандарта может быть смоделировано и следовательно верифицировано неким конечным автоматом. Всякая программа на Java (ML, ...) может быть оттранслирована в программу на С, следовательно...

Date: 2010-05-10 02:05 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Вы и к стековой машине, к примеру, то же самое рассуждение примените?

Date: 2010-05-10 02:34 pm (UTC)
From: [identity profile] 99f.livejournal.com
Не понял что и как применить. Просто C как он описан в стандарте вопреки распространенному мнению не Turing complete. Программы на C можно верифицировать конечным автоматом. Можно разумеется и стековым. То же самое рассуждение применимо к более широкому классу языков.

Верификация программного обсепечения, неизвестная [livejournal.com profile] panchul, применяется военными и людьми занимающимися real-time. Есть периодическая конференция про это с proceedings на много сотен страниц. Spin и promela которые наверху упоминались вещи достаточно старые, они скорее про верификацию алгоритмов. Сейчас люди умеют верифицировать pointer arithmetics в многопоточных приложениях (Smallfoot, separation logic).

Date: 2010-05-10 05:36 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Я не то чтобы пошел сейчас читать стандарт, но скорее соглашусь, что стандарт он как бы описывает конечный автомат. Но поверх стандарта есть ещё io.

Так если я повторю вопрос, можно ли на си написать программу, которая проверяет паритет скобок в другой программе?

Date: 2010-05-10 06:36 pm (UTC)
From: [identity profile] 99f.livejournal.com
Тут стандарт читать не обязательно. Достаточно сообразить что всякий тип T в Си имеет только конечное количество значений не более 2^(sizeof(T)*8), динамически можно аллоцировать только конечное количество объектов (2^(sizeof(void *)*8)), и сами программы все конечной длины, как и всякие строки производимые грамматикой. I/O описано в стандарте и про него выше предлагалось упражнение (hint: длина каждого файла ограничена из-за ftell(3), а общее число всех файлов конечно т.к. конечно число строк которые могут быть их именами).

По поводу скобок. Если "другая программа" задается через char getnextsymbol() то в общем случае нельзя, т.к. вложенность скобок может превысить любое значение представимое в данной реализации Си.

Date: 2010-05-10 07:42 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
А вот у меня есть решение.

Date: 2010-05-10 08:06 pm (UTC)
From: [identity profile] 99f.livejournal.com
Сработает если getnextsymbol() сначала выдает 2^{2^{sizeof(void*)*8}} + 1 открывающую скобку? (Такую getnextsymbol() на C конечно не написать.) Предъявите. :-)

Date: 2010-05-10 08:23 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Слушайте, я совершенно не понимаю, с кем имею дело, поэтому не представляю, как с Вами и разговаривать. Предложить ли вообразить потенциально бесконечную виртуальную память с потенциально бесконечными длинными целыми, или же попросить изложить Вашу ультраинтуиционистскую позицию как-нибудь более подробно, с линками.

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

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

Date: 2010-05-10 09:02 pm (UTC)
From: [identity profile] 99f.livejournal.com
Извините. Я конечно невнятно излагаю. Вобщем есть некий более-менее формально описанный язык "C". Можно считать что язык этот вычислительно эквивалентен некоторому классу конечных автоматов - классу автоматов с числом состояний меньше некоторой константы, вроде той, что была в предыдущем комментарии. "Можно считать", но нельзя "доказать" потому что язык не до конца формализован. Но мы вроде согласились что стандарт описывает конечные автоматы.

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

Далее возник обратный вопрос. Можно ли проверить программой на C т.е. конечным автоматом парность скобок. Ответ вроде бы очевиден - нет. "Вообразить" бесконечно большую виртуальную память нельзя в том смысле, что это будет не расширением языка "С", а противоречивой системой. В C все типы включая указатели имеют только конечное количество значений. На этом построен весь язык начиная от массивов.

Date: 2010-05-10 09:42 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
"Можно считать что язык этот вычислительно эквивалентен некоторому классу конечных автоматов" - почему? Можно и не считать. Я не согласен, что с описывает конечные автоматы. Стековую машину на си написать - не фиг делать. Стек, разумеется, внешний.

Date: 2010-05-10 09:56 pm (UTC)
From: [identity profile] 99f.livejournal.com
Я же Вам говорю: у всякого типа лишь конечное количество возможным значений. Типов конечное число. Указателей лишь конечное число. Нельзя стековую машину написать на C. Если Вы фрагменты стека аллоцируете через malloc(3) то эта функция сможет успешно выделить память лишь конечное число раз, так как обязана каждый раз возвращать новое значение типа void *, а таких значений лишь конечное число. Поэтому глубина Вашего стека ограничена константой вроде 2^{sizeof(void*)*8} и Ваша "стековая машина" на самом деле конечный автомат. Это просто понять: общее число битов которое может видеть программа на C конечно и определяется шириной указателя. Значит и общее число состояний в которых может быть программа на С тоже конечно. Операции с файлами добавляют немного, но опять лишь конечное число состояний.

Date: 2010-05-10 10:57 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
А нельзя ли к машине на си присобачить ленту, как у Тьюринга?

Date: 2010-05-10 11:39 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Можно стековую машину написать на си. Стек внешний. Мне кажется, Вы чего-то не понимаете.

Date: 2010-05-11 07:16 am (UTC)
From: [identity profile] 99f.livejournal.com
Не понимаю точно. Слова "внешний" не понимаю видимо, а Вы не разъясняете. Если имеется в виду "на внешних носителях" то файлов конечное число и они все конечной длины. В файле можно двигаться по "относительным" смещениям (fseek(f, delta, SEEK_END)), но когда перелезете через sizeof(fpos_t) будет undefined behavior.

Date: 2010-05-11 02:25 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Откуда это что файлов конечное число? В каждый момент - да, но мы не спешим.

Date: 2010-05-11 02:49 pm (UTC)
From: [identity profile] 99f.livejournal.com
Number of values in addressable memory is finite. Filenames are strings is addressable memory. Therefore there is only a finite number of filenames. Therefore there is only a finite number of files that a program can ever open (whether it is in a hurry or not :-) ), because lacking chdir (which as was already mentioned elsewhere is not a part of the Standard) every file has a filename.

The ability to create and destroy files from the above finite set is of little interest: there still is a finite constant N such that no program can at any point of its execution store more than N bits of data in files. This, together with the finiteness of addressable storage, means that the program is a finite state machine.

Date: 2010-05-11 05:19 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
A Turing machine is an FSM. With an unlimited tape. There's a difference, right, an FSM with a tape and the one without.

Date: 2010-05-11 06:34 pm (UTC)
From: [identity profile] 99f.livejournal.com
I take it that the issue of finiteness of a state that a C program can manipulate is no longer contested. As for the sudden claim that a Turning machine is an FSM I don't see how to reconcile it with your earlier statement "Я не согласен, что с описывает конечные автоматы". Can you elaborate?

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

June 2025

S M T W T F S
1 2345 67
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 7th, 2025 10:58 am
Powered by Dreamwidth Studios