Почему состояние остается неизменным в небольшой семантике операционного цикла while?

9

Обычно я вижу, что в представлении структурной операционной семантики для цикла while состояние программы не изменяется:

(whileBdoS,σ)(ifBthenS;(whileBdoS)elseSKIP,σ)

Для меня это не интуитивно понятно, если состояние не меняется (то есть состояние памяти остается прежним), то будет продолжать оставаться верным, и программа никогда не завершится.B

Может кто-нибудь объяснить, почему государство не меняется в этом правиле?

Эль Марс
источник
Обратите внимание, что это правильно, только если мы можем предположить, что не имеет побочных эффектов. Это не так в большинстве языков программирования. B
Рафаэль

Ответы:

10

В семантике языка программирования понятие состояния программы является не смутным философским понятием, а очень точным математическим понятием. Состояние в этом небольшом шаге-операционную семантики является частичной функциейs

s:VarZ

который записывает значения переменных. Так что если , тогда переменная x имеет значение v . Состояние обязательно является частичной функцией, поскольку имеет смысл записывать только те значения переменных, которые на самом деле встречаются.sx=vxv

Аксиома разворачивания

whilebdoS,sifbthenS;whilebdoSelse skip,s

просто говорит нам, что мы разворачиваем цикл while в условный оператор, одна из ветвей которого содержит цикл. Никакие переменные не изменят свое значение из-за этого, и по этой причине состояние не изменяется.

Ханс Хюттель
источник
10

Состояние может измениться на последующих этапах сокращения, потому что на правой стороне

while B do S,σif B then (S; while B do S) else skip,σ

-loop охраняется (предваряется) с помощью S . Вычисление S может изменить состояние , так что условие Б может оценить, е L сек е .whileSSBfalse

Мартин Бергер
источник
Итак, это означает, что изменение состояния должно быть выражено в других правилах, до которых S может быть потенциально сведен в конкретной программе?
Эль Марс
@ ElMarce Да. Я предлагаю пройти простой пример, например, и увидеть , как это работает. x:=2; while x>0 do x:=x1
Мартин Бергер
9

Состояние не меняется , когда мы рассматриваем B , чтобы решить , следует ли выполнить одну итерацию цикла, но он может изменить позже , когда мы запустим тела S . Итак, в следующий раз, когда мы рассмотрим B , может произойти изменение σ .σBSBσ

Андрей Бауэр
источник
Это объяснение, хотя и является по существу правильным, не относится к тому, что представляют собой состояния (а именно функция, которая сообщает нам значения varialbes) и что означает изменение состояния (а именно, что значение по меньшей мере одной переменной изменяется).
Ганс Хюттель
Действительно, не имеет значения, что такое состояния или как они реализованы для целей моего ответа. Объяснение справедливо независимо. И более того, на самом деле неправильно говорить, что «состояния на самом деле являются функциями», потому что это только один из способов их математического моделирования. Есть и другие возможные модели. И давайте не будем путать математические модели с тем, как работает аппаратное обеспечение.
Андрей Бауэр
Но этот вопрос связан с конкретной небольшой шаговой операционной семантикой, для которой понятие состояния четко определено.
Ганс Хюттель
Я никогда не говорил, что это не так. Я просто говорю, что ваше замечание не является необходимым, потому что мое объяснение не содержит явного упоминания о том, как моделируется состояние. Возможно, вы обнаружили, что ОП не знал, что это была карта от переменных к значениям. Молодец, ваш ответ принят, а я нет. Поздравляю. Почему вы сейчас навязываете мне свой способ ответа, выше моего понимания. Почему вы чувствуете необходимость сделать мой ответ таким же, как ваш? Мой ответ имеет смысл без замечаний, которые вы считаете необходимыми. Возможно, кто-нибудь придет, когда найдет мой ответ.
Андрей Бауэр