Patterns for Timed Property Specifications
PATTERN系列之二
由于是用中文写的总结,所以翻译有些约定(感想:英文文档还是英文做笔记吧)
主要内容:
在Dwyer的成果基础上添加了精确的时间关联,建立了时间关联的自动机。
论文中给出来的Figure就是observer automaton,是根据模式来观察实际运行情况中是否违反了模式,如果违反了,那就会进入到error location
翻译约定:
cascade 级联
corresponding 相应的
formalism 形式标准
signalize 信号化通知
timed 时控的,定时的,限时的
untimed 不限时的
Abstract
属性规范模式使非专业人员可以编写可用于自动检查模型的正式规范。现有模式可以推断事件的发生和顺序,但不能说明它们的时间。 我们通过与时间相关的模式来扩展这种模式系统。 这使得我们能够指定实时要求。
1、Introduction
实时需求的形式规范是一个容易出错的任务。开发人员认为它难学,但是依赖于 在时态逻辑公式中给出的规范 的模型检查(model checking)在验证系统正确性上又确实很好用。
目前属性规范模式已经成功应用于弥补从业者与模型检查工具之间的距离。只是现有的模式系统没有考虑到关于时间的信息。
对于每个模式,我们构造观察者自动机(称为观察者, 即observers),可以直接应用于定时模型检查工具。这些观察者可以自动构建,模式系统的用户无需亲自动手。这对目前的方法来说是一个利好,因为目前的方法通常来说允许从UML这样的高级语言自动构建模型检查器的输入语言的模型,但不提供工具支持来规范 那些必须经过验证的 需求。
2、Untimed Specification Patterns(不限时的规范模式)
Dwyer的《Patterns in property specifications for finite-state verification》中为属性规范开发了一个模式系统。这个模式系统使得不了解时间逻辑的人也能够读写许多不同形式标准的形式规范。这个系统能表达出诸如“一个事件A的发生必须跟随着事件B的发生”。但是这个系统有一些不足之处,它不包含时控属性(timed property),比如“发生事件A后必须在k个时间单位发生事件B”。
模式的等级制度(hierarchy):
Absence
Universality
Existence
Bounded Existence
Precedence
Chain Precedence/Chain Response
范围(scope):
global
before
after
between
until
模式系统的元素:
events
patterns
scopes
这些都在Dwyer的《Patterns in property specifications for finite-state verification》中有详细说明,在此就不赘述了。
3、Timed Observer Automata(限时观察者自动机)
Dwyer的工作最重要的成果是模式目录(pattern catalogue)。这个目录给出了属性规范到不同形式标准(formalisms)的映射。比如“Globally, S responds P”, 在CTL中可以表达成 AG(P => AF(S)),在LTL中表达成□(P => ◇S)。因为很多模型检查工具允许检查按着这些形式标准规范的属性,所以模式目录可以被这些工具直接使用。
所以类似地,我们可以用限时时间逻辑去为限时属性规范建立一个相似的目录。比如可以用TCTL,将属于time-bounded response 属性的“Globally, S responds to P within k time units”, 表达成 AG(P => AF<k(S)),(其中“<k”是下标)
虽然这样的目录在理论上可能是有趣的,但它实际使用起来将会有许多限制,因为限时模型检查工具不提供对限时时间逻辑的支持,因为无限时模型检查工具使用无限时时间逻辑进行处理。
因此,我们使用(有关时间的)观察者自动机(观察者)去描述所需的系统行为。直观地说,在验证时,观察者与模型并行。当且仅当一些属性在模型中可能被违反,他们才到达一个确定的状态。
时间自动机(Timed automata, TA)。之后会简洁介绍TA。我们还使用 使用了同步标签的不同TA 之间紧急和沟通作为TA原始定义的扩展。
作为一个有限 Buchi(u实际上是u上加两点,即v的拼音式) 自动机,一个TA有一组有限的位置(locations) L和一组T⊆ L×L转换(transitions)。一个位置l0 ∈ L (l是L小写,0是下标)是一个显著的初始位置。这个转换被一个函数标签标记了:L → 2AP(AP是上标),这个函数标签为每个位置(location)分配了一组原子命题。与此同时,有一个有限的关于时钟的集 C 以相同的速度运行着。转换可以与C的子集相关联,这意味着在进行转换时必须重置为零的时钟。
时钟状态的形式为x〜y,其中〜表示来自一个集合{<, >, =, ≤, ≥}的操作符, x∈C, y∈C或者y是一个自然数。时钟状态可以与一个转换相关联,转换可能只有在时钟条件为真时才能进行。
TA可以像接下来这么运行:
- 一开始,自动机在初始位置,所有的时钟被设置为0。
- 然后,TA可以在两种方式上进行:可以通过转换来改变位置,或者可以在停留在相同位置的同时改变时间。
- 再之后,将会有多于一种可能的方式来运行:可能位置不变并让时间继续或采取该位置可用的转换之一。这种选择是非确定性的,但是,如果转换被标记为紧急,则这种非确定性会受到限制。如果可以,紧急转换必须立刻被执行。而如果有多个紧急转换,那么将会随机挑选一个。如果能够执行一个紧急转换,那么就不会执行一个非紧急转换。
为了给不同TA之间建立交流和同步模型,可以用同步标签\(X!\)(发出事件X的信号)和\(X\)(事件X的相应反应)去给转换(transition)做标记。如果TA中一个被\(X!\)标记了的转换被执行了,那么这意味着在其他自动机中所有被$ X\(标记了的转换(这是不被时钟状态或者其他转换的紧急性所禁止的)可以立即执行,而无需考虑任何推迟。一个带着 被\)X\(标记的转换 的自动机是处于阻塞(blocked)的,一直到一个被\)X!$标记的相应转换被执行为止。
在另一方面,一个被\(X!\)标记的转换是不会被阻塞的,因为没有被\(X\)标记的转换可以被执行。(关于这句话,我觉得是不是这个意思:没有被\(X\)标记的转换可以被执行时,被\(X!\)标记的转换是不会被阻塞的)转换可以拥有最多一个\(X\)形式的同步标签,以及最多一个\(X!\)形式的同步标签。(在我们基于事件的形式标准中,我们不允许两个事件重合)
同步标签对于 验证模型 与 观察者“查询”系统的行为 的同步非常重要:如果模型中发生了一些“有趣”的事,观察者能即使反应。
4、Pattern Catalogue:Pattern(模式目录:模式)
本节将会看到,我们的大多数规范模式如何处理所谓的安全属性。为了证明这个属性是True,有必要去检查观察者是否到达不了某些location。当观察者到达这些location的时候,它能侦测到对于规范的违反。
对于liveness properties(比如,"每一个P的发生都伴随着Q的发生"),考虑infinite runs是必要的。
注:accepting location == infinite run
一般来说,我们为了这样的目标而使用acceptance状态:观察者中的一些location被标记成accepting location(接受位置)。如果一个 non-Zeno的运行经常无限地进入一个接受位置,那么观察者能侦测到一个反例(counterexample)。(在这里我们忽略了non-Zenoness 的形式定义。直观来说,non-Zeno run是一个 在有限次数内,被禁止无限执行许多转换 的状态)
注:Zeno大约是指芝诺(追赶乌龟), non-Zeno run排除了run自己不可到达的可能,因此在定义中,non-Zeno run的存在确保了 accepting location 的run是因为不断完成但是指向同一个location的infinite,而不是因为run自己不能到达而造成的infinite
**关于Zeno可以找找PATTERN系列的番外篇,我找了一点Zenoness的相关资料
依照惯例,我们用圆圈来描述自动机的位置,用箭头来表示转换。我们将error location定义为:当到达error locations的时候,观察者能侦测到规范被违反。同时我们在相应的圆圈下用\(ERROR\)来标记error locations。Accepting location用两个同心圆(a double circle)表示。我们定义显示TA图中最左边的位置总是初始位置。我们称呼那些既不是error 也不是 accepting的locations 为 normal locations。
PATTERNS
Absence:A violation of the Absence property (P does never occur within a scope) is detected when P occurs.
Existence: A violation of the Existence property (P must occur within a scope) means, that a run exists which does never reach the location depicted by the right circle of the observer.
This means that a counterexample for the Existence property is a non-Zeno run of the automaton that passes through the accepting location infinitely often.
Bounded Existence:给定的状态/事件在一个范围内必须发生k次。该模式的变体至少指定k次出现,并且至多指定k次出现的状态/事件。
Universality:给定的状态/事件发生在整个范围内(occurs throughout a scope),相当于“P 变成 False”这个事件是Absence状态
Precedence:requires that no P occurs before it is "enabled" by a preceding Q。在一个范围内,P必须总是被Q优先。除非Q进程被“enabled”,否则P不能发生。
Precedence: Q enables P after a delay:当且仅当Q发生了并且时间>=t(Q)+k,P才是可用的。(当一个P可用后,即使另一个Q发生了,P仍然是可用的)。
Precedence: Q enables P for k time units:当且仅当Q发生了并且时间<=t(Q)+k,P才是可用的。
Response:在一个范围内,状态/事件P必须总是被状态/事件Q跟随(或者说,状态/事件P发生之后才能发生状态/事件Q)
Time-Bounded Response: response must occur before t(P)+k:P必须被Q跟随,但是Q必须在给定的时间区间内发生。
Chain Precedence:状态/事件队列P1,P2,...,Pn 必须总是被(be preceded by)状态/事件队列Q1,Q2,...,Qn 优先。这个模式是Precedence模式的概括(generalization)。
Chain Response:状态/事件队列P1,P2,...,Pn 发生之后才能发生 (be followedby)状态/事件队列Q1,Q2,...,Qn。这个模式是Response模式的概括(generalization)。它可以用来表达有界的FIFO关系
关于Absence、University,Existence,Response,Timed-Bounded Response:response must occur before t(P)+k,Precedence,Precedence: Q enables P after a delay,Precedence: Q enables P for k time units,Bounded Existence,Chain Precedence 以及 Chain Response的图像表示参照文献原文。
5、Pattern Catalogue: Event(模式目录:事件)
使用同步标签,TA可以“观察”另一TA中事件的发生,并且如果事件发生并且可以发生同步,则以某种方式作出回应。
但是,我们通常要对与多个事件相关的“观测”或其发生的时间作出反应。我们用到一个术语叫做“关联事件”(combined events)。
reporting TA 被用来处理(handle)这些关联事件。当且仅当关联事件发生时, reporting TA 会作出一定的转换(过渡,transition)。这些转换可以被一个新的同步标记\(M!\)所标记。这样子的话,reporting TA 可以像信号化“普通”事件("simple" events)一样信号化关联事件。
有两种reporting TA:
-
一种是每次关联事件发生时,reporting TA总是汇报。
-
另一种R-TA也会汇报关联事件的发生,但没有义务每次都汇报(意即满足一定条件才汇报)。这种R-TA称为 lazy;
以Chain Response
模式“一个关于A和B事件的序列 必须总是在 一个关于C和D事件的序列 之前发生" 为例, 假设一个reporting TA signalize A-B序列的出现(occurance), 另一个R-TA singalise C-D序列的出现 。当我们用一个模型检查器(model checker)检查这个属性时,系统是否有一钟可能的运行方式违反了这个规范?如果有这么个反例的话,它是能够被模型检查器检查出来的——即使汇报A-B序列的TA是lazy的,因为lazy reporting TA也是能 signalize A-B序列的出现的。在另一方面,signalize C-D序列的出现的R-TA一定不能是lazy的,因为这样做会在A-B发生的地方导致一个错误的反例,随后C-D不会被lazy reporting TA 汇报。
lazy R-TA 的使用可以减少 TA中位置(location)和转换(transition)的数量。除非被明确地表示为lazy的,否则就默认R-TA是 non-lazy 的。
Chains:
chain 是指一个时间序列E1...En,这样一个序列是作为关联序列发生的,它是“不重叠”(non-overlapping)的(注:不能并行), i.e. 只要一个已经开始的chain还没有完成,另一个新的chain就不能开始。
论文此处为 一个有着A、B、C三个事件的chain 给出了一个lazy R-TA。(将所有转换标记成\(urgent\)就能得到相应的 non-lazy TA)
Timed-Bounded Chains:
timed-bounded chain 是指 事件序列E1...En 在一个给定的时间区间内( ≤ k个时间单元)的发生。
论文此处给出了对于 一个有着A、B、C三个事件的chain 的lazy R-TA和 non-lazy R-TA ,其中non-lazy R-TA更加复杂。
"n times A":
"A occurs n times"是chain的一个特例。每当A发生了n、2n、3n...次的时候, "A occurs n times"会被report。但是A发生了m次时(\(i*n < m < (i+1)*n\)),"A occurs n times"不会被report。将Chains中的例子中的A、B、C用urgent action A 替代即可得到“n times A”的 reporting TA。
"n times A within k time units":
“within k time units”其实就是“timed-bounded", 按着字面意思理解就行,指在限定时间区间内A发生n次。
要注意时钟状态(clock condition)(比如 x>k)需要在转换被执行前被检查,以及 "重置 时钟x"可以生效。
Collections:
上面四种模式的综合。例子看论文,例子中同步和异步的使用构成了一个整体的循环。
Timed-Bounded Collections:
Timed-Bounded上面有过说法了,略过。
Non-occurrence in a given time span:
如果从 基于事件的视图 切换到 基于状态的视图, 并令事件A表示“一个property变成了true”,事件B表示“一个property 变成了 false”。则“在一个k个时间单元的时间段里, A 不被 B跟随”这个规范意味着“该property保持true的状态至少k个时间单元”。
此处论文给出了一个lazy reporting TA的例子
当A发生时,一个non-lazy reporting TA将会需要去记住一个次数(它是潜在无限大的(potentially infinite),即是有可能变成无限大的数),这使我们免于再构造一个R-TA。
Pattern Catalogue: Scopes(模式目录:范围)
令A是对某些属性(property)的观察者(observer)。A能观察属性是否是globally的, i.e.在模型的整个执行(entire execution)期间。这一章将展示:在给定的范围内(over a given scope),A是怎么被按顺序改变以检查属性的。遵循Dwyer(上一篇论文的作者)给出的关于untimed scope的定义,这一章将展示A是如何可以被改变去检查一个属性早于、迟于以及直到 t(D)±k (k∈Z,表示时间单元数)时的有效性。
将 the time intervals defined by the scopes 定义为左开右开(即是" (... , ...) "),比如,“before t(D)”不包括时刻t(D)。
D可以是一个关联事件。这使得原始的模式系统更加灵活。
处理 scopes 的关键idea在于把A的形式转变为一个 范围依赖(scope-dependent) 的TA——A'。为了在一个给定的范围内检查一个属性,我们可以在 A‘ 它自己中搜索错误运行(error run),也可以构造另一个命名为O的TA,其中O表现得像是一个对于A’的观察者,并且当且仅当 A‘ 中能找到一个错误运行时,O到达一个错误状态(error state)。模型的建立必须满足:reporting TAs 中的转换能够在 A’ 中执行\(before\)转换, A’ 中的转换能够在 O 中执行\(before\)转换。
这里引用了Dwyer的论文中的两个定义:
-
如果一个系统的执行中没有出现范围分隔符 (scope delimiter),那么根据定义,规范将是正确的。比如
P must occur before X
,只要系统的整个执行过程中没有X,则这个规范将总是正确的。 -
在例如
Before R, S responds to P
的模式中(即 出现了范围分隔符),如果虽然P在Q前面发生,但是回应S发生在R之后,则这个规范被违背了。类似的,After R, P must be preceeded by Q
中,事件Q必须在R之后出现以"enable" P。
Scope "before t(D)"
1、为了从 A 构造出 A',我们在A中找到一个没有 向外的转换(outgoing transition) 的normal location (正常位置),称之为\(sink-normal\)(normal 是下标形式);如果没有normal location,就添加一个\(sink-normal\)作为 normal location。
同时,我们在A中寻找一个error location(错误位置)并称之为\(sink-error\)(同样,error是下标形式); 如果没有error location,那就添加一个新的error location\(sink-error\),
2、从A中的每一个normal location出发, 都添加一个 带有同步标签D 的紧急转换(urgent transition) 到\(sink-normal\)中。(同步标签D 是为了回应事件D的发生)
从A中的每一个accepting location出发, 都添加一个 带有同步标签D 的urgent transition 到\(sink-error\)中。
同时移除 在accepting location中 所有不带标签的自循环(self-loops)(标签包括:时钟重置(clock-reset),同步(synchronisation) 或者 guard)。
依照上面的流程,就可以得到 A'。如果 A' 可以到达它的error状态,那么就能发现一个 在before t(D)
范围内的规范 的违反。
Scope "before t(D) + k"
对于范围before t(D)+k
,通过生成一个事件M以构造一个reporting TA来 signalize “到达 t(D)+k 时刻”事件。这种做法将 case before t(D)+k
简化成 before t(M)
,这样子就能变成了 Scope "before t(D)"中的情况。
Scope "before t(D) - k"
对于A中所有 导致了error location 或者 accepting location 的转换,添加一个同步标签\(B!\)(== entering a ”bad“ location)。
对于所有 从accepting location 到 normal location 的转换, 添加一个同步标签\(G!\)(== entering a "good" location)。
最后,移除accepting location 里所有的不带标签的自循环。
Implementation
实现 模型检查工具中用于检查一个模型的属性的 observer 的一般步骤:
R-TA和observer必须用 以循环方式验证的模型 一起安排好, s.t. 模型的每一步都立刻伴随着 每个reporting TA 的一步 和 每个observer 的一步。在这里,需要注意同步标签的等级制度:那些依赖于 被其他TA报告的事件 运行的TA必须安排在那些 可以报告东西给它们的 TA之后。通常来说,这意味着在模型 在验证下的 每一步之后, 每一个R-TA都有机会evolve 并且最后observers 都被安排好。如果R-TA 被用于报告复杂的关联事件,那些 signalize一个用了同步标签\(X!\)的事件 的必须被安排在 那些带着相应标签\(X\)的TA之前。对于那些观察一个collection的出现的TA,带着\(X!\)的R-TA必须被安排在带着\(M!\)标签的TA 之前 和 之后(\(M!\)和\(X!\)以及相应的模型参看collection篇的例子)。
END