守卫命令语言

✍ dations ◷ 2025-08-24 14:09:06 #守卫命令语言

守卫命令语言(GCL:Guarded Command Language)是艾兹赫尔·戴克斯特拉为谓词变换语义(英语:predicate transformer semantics)定义的一门语言。它以精简方式组合了编程概念,它们处在以某种实际的编程语言书写程序之前。它的简单性使得采用霍尔逻辑证明程序的正确性更加容易。

守卫(guarded)命令是守卫命令语言的最重要元素。在守卫命令中,同名字所说一样,这个命令是被守卫着的。这个守卫是先决条件,在这个语言被执行(英语:execution (computers))之前,它必须为真。在这个语句执行开始时,可以假定这个守卫为真。还有,如果这个守卫为假,这个语句将不被执行。使用守卫命令使得证明程序满足规定(英语:Formal specification)更加容易。这个语句也经常是另一个守卫命令。

一个守卫命令是形如G → S的一个语句,这里的

如果G为真,守卫命令可以简单的写为S。

当在计算中遇到G的时刻,求值它。

在守卫命令语言中,跃过(skip)和中止(abort)是非常简单也是非常重要的语句。中止是未定义指令:做任何事情。中止语句甚至不需要终止(terminate)。在公式化一个证明的时候,它被用来描述一个程序,在这种情况下证明通常失败。跃过是空指令:什么事情都不做。它被用在程序自身中,当语法要求一个语句的时候,而编程者却不想要机器改变状态(英语:state (computer science))。

skip
abort

语义

  • Skip: 什么事情都不做
  • Abort: 做任何事情

赋值

将值指派给变量。

v := E

v0, v1, ..., vn := E0, E1, ..., En

这里的

语句由分号(;)来分割。

选择(经常叫做“条件语句”或“if语句”)是守卫命令的列表,从中选取一个来执行。如果多于一个守卫为真,非确定性的选取一个语句来执行。如果没有守卫为真,结果是未定义的。因为至少一个守卫必须为真,空语句"skip"经常是需要的。

if G0 → S0|  G1 → S1...|  Gn → Snfi

语义

在执行一个选择的时候求值所有的守卫。如果没有守卫被求值为真,则选择的执行会abort,否则非确定性的选择其值为真的守卫之一,并执行对应的语句。

用伪代码:

用守卫命令语言:

if a < b → c := true|  a ≥ b → c := falsefi

使用skip

用伪代码:

用守卫命令语言:

if error = true → x := 0|  error = false → skipfi

如果第二个守卫被省略,并且error = False,结果是abort。

if a ≥ b → max := a|  b ≥ a → max := bfi

如果a = b,要么a要么b被选取为极大值的新值,具有相同的结果。但是,在实现这个例子的时候,可能会发现一个比另一个更容易或更快。因为对于编程者这里没有区别,可以随意实现任何一种方式。

重复会反复的执行守卫命令知道没有守卫为真。通常,这里只有一个守卫。

do G0 → S0|  G1 → S1...|  Gn → Snod

语义

当执行重复的时候所有守卫都求值。如果所有守卫都求值为假,则执行skip。否则非确定性的选取其值为真的守卫之一,并执行对应的语句,此后再次执行重复。

a, b := A, B;do a < b → b := b - a|  b < a → a := a - bod

这个重复在a = b时候结束,在这种情况下a和b持有A和B的最大公约数。

戴克斯特拉在这个算法中见到了两个无限循环a := a - bb := b - a同步的一种方式,在这种方式下a≥0b≥0保持为真。

a, b, x, y, u, v := A, B, 1, 0, 0, 1;do b ≠ 0 →|  q, r := a div b, a mod b;|  a, b, x, y, u, v := b, r, u, v, x - q*u, y - q*vod

这个重复在b = 0的时候结束,在这种情况下变量持有对贝祖等式:xA + yB = gcd(A,B)的解。

do a>b → a, b := b, a|  b>c → b, c := c, b|  c>d → c, d := d, cod

这个程序在其中一个元素大于它的后续者的时候持续的置换元素。这个非确定性冒泡排序不比它的确定性版本更加有效率, 但是易于证明:只要元素仍未有序它就不会停止并且它每步至少排序2个元素。

x, y = 1, 1 do x≠n →|  if f(x) ≤ f(y) → x := x+1|  |  f(x) ≥ f(y) → y := x; x := x+1|  fiod

这个算法找到值1 ≤ ≤ ,对于它给定整数函数是最大的。不只是这个计算而且最终状态都不是必然唯一确定的。

将观察的守卫命令的同余关系推广成格导致了精制演算(英语:Refinement Calculus)。这已经机制化于形式化方法如B方法(英语:B-Method)中,它允许从它们的规定形式化的导出程序。

守卫命令适合于准延迟不敏感电路(英语:quasi-delay-insensitive circuit)设计,因为重复允许不同命令选择的任意相对延迟。在这种应用之,在电路中驱动一个节点y的逻辑门构成自两个守卫命令如下:

PullDownGuard → y := 0PullUpGuard → y := 1

这里的PullDownGuard和PullUpGuard是逻辑门输入的函数,它描述了什么时候这个逻辑门分别将输出拉下或拉上。不同于经典的电路评估模型,一组守卫命令的重复(对应于一个异步电路)可以准确的描述这个电路的所有可能的动态行为。

守卫命令可以用在Promela(英语:Promela)编程语言中,它被用于SPIN模型检查器(英语:SPIN model checker)。SPIN验证并发软件应用的正确操作。

Perl模块Commands::Guarded实现了戴克斯特拉的守卫命令的一个确定性的校正变体。

相关

  • 马(学名:Equus ferus caballus),广泛分布于世界各地,原产于中亚草原,6000多年前就被人类驯养,最早的马匹驯养遗址于乌克兰草原发现,15世纪后,才被欧洲殖民者带到美洲和澳洲地区。马耳
  • 顿河畔罗斯托夫顿河畔罗斯托夫(俄语:Ростов-на-Дону,俄语拉丁字母拼写:Rostov-na-Donu)是俄罗斯罗斯托夫州和南部联邦管区的首府。建于1749年,1807年建市。人口为111万5000人(2015年)
  • 古巴教育古巴教育维持在高水平质素,该国设有多间历史悠久的高等学府和大学,包括于1727年成立的哈瓦那大学。卡斯特罗政府在1959年古巴革命后,将所有教育机构移交国家营运,教育系统完全由
  • 肠浒苔肠浒苔(学名:),是绿藻植物浒苔属下的一个种。
  • dBZdBZ是一个与特定参数Z值来描述雷达反射率之比例的单位,与分贝类似,为对数无量纲量,主要用于描述雷达回波的强度,尤其是气象雷达用于度量大气中特定区域的降水粒子(雨、雪、冰雹等
  • 辜礼欢甲必丹辜礼欢(闽南语:.mw-parser-output .sans-serif{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Lato,"Helvetica Neue",Helvetica,Arial,sans-serif}
  • 共栅极在电子学中,共栅极(英语:common-gate)放大器电路是单级场效应管(field-effect transistor (FET))放大器电路的三种基本接法之一(另外两种分别是共源极和共漏极)。共栅极电路通常被用
  • 甲寅 (杂志)《甲寅》是民国时期的月刊,1914年5月10日由章士钊创办于日本东京,以阐扬民主宪政为宗旨,期促进国人对近代政治的认识。从第五期起迁至上海出版。秋桐(即章士钊)主编,陈独秀助编。
  • 木泽尚文木泽尚文(日语:木澤 尚文/きざわ なおふみ ,1998年4月25日-)是一名出身于日本千叶县船桥市的棒球选手,司职投手,目前效力于日本职棒东京养乐多燕子。
  • 厄尔皮诺厄尔皮诺(英语:Elpenor)。古希腊男性神祇之一。奥德修斯之战友。曾参加特洛伊战争。其事迹见于《奥德赛》之中并成为诗人之创作对象,具有重大影响与文学意义。