almost 2 years ago

有点简略,如果你已经知道时间自动机和 UPPAAL 就完全可以看懂…… 哎我尽量 self-contained,目标是让所有读者至少能看懂九成……

(如果想了解时间自动机和 UPPAAL,可以看一看 [译]时间自动机:语义,算法和工具,不看也行 )

1

昨天晚上 ZH 同学在群里发了张图:


走迷宫,但是经过的圆点必须红蓝交替。

2

不一会,LJ 同学给出了一个解:


WX 等同学表示 LJ 真会玩。
HK 同学给出了另一个解,但我没看懂文字描述?

3

早上起来,发现昨晚 JSK 同学一点多的时候说了一句:

这不是形式化验证问题吗?

我有点兴奋,于是想到以前用过的模型检测工具 UPPAAL 来解一下。UPPAAL 有 GUI,有模拟器,有属性验证器,很适合这道题。

4

于是就去建模了。

考虑了时间自动机的 Location(i.e. 圆圈)应该表示题目中的”十字路口“还是”圆点“。结论是十字路口。

考虑了”被没有圆点的道路连接的十字路口 是否应该合并成一个 Location“的问题。经过失败的尝试:


结论是不应该合并。

在添加任何约束条件之前,模型是这样的:

考虑了“用 Channel + Synchronization 还是 变量 + Guard 来描述红蓝交替这个约束”的问题。结论是 Channel + Synchronization。因为在自动机进程图里有一大堆 Edge;在每个 Edge 上标记 r? 比 color==1 要简短和清晰……

于是,加了一个”乌鸦“自动机,用来发出信号;让原自动机接收信号。建模完的样子:

经过几次用模拟器 Debug,查了一些“忘写 Edge 的 Sync”的错误;否定了把乌鸦自动机的 Location 设为 Committed / Urgent 的想法;
然后用验证器验证这个属性:

E<> rbp.T

即:从系统初始状态出发,存在(E)一条执行路径,使得自动机 rbq 可以(<>)到达 Location T。
(在不涉及 时钟/变量 的时候,时间自动机系统的状态就是所有自动机的 Location 组成的向量/元组。)

好的,这俨然是个图论问题……(有什么模型检测问题不是图论问题吗(有什么问题不能转(juǎn)化成图论问题吗))

验证通过!然后设置 Diagnostic Trace 策略为 Shortest,再验证一次,输出执行路径:


这就是 LJ 同学的解嘛!好棒好棒的!

大致就是这样。

Appendix

  1. 建模时烦人的事:加 Edge;拖动 Edge 的控制点到美观的位置;给 Edge 加 sync;拖动 sync 文字(r? 和 b?)到美观的位置;给 Location 取名字……

    必须有一门迷宫建模的 DSL 了!
    
  2. 录屏生成 GIF 的软体是 LICEcap,有 Windows 和 OS X 版,好使。从 小众软件这里看到的。

  3. (iOS 和 OS X 的)微信里发 GIF 动不起来?Bad。

  4. 群里聊这个题的时候我画了个图,解释 UPPAAL 在世界中的位置(啊,窝好喜欢“我们在世界中的位置”这个词……):


    对不对呢?感觉有必要跟贺师和罗师求教一下……

  5. UPPAAL 下载:http://www.it.uu.se/research/group/darts/uppaal/download.shtml
    下载需要填个表格…… 不用太在意。
    我用的是 OS X 4.0.13。刚才又下了一下,不能用…… Windows 4.0.14 版却能用……
    模型文件:http://7tsy1b.com1.z0.glb.clouddn.com/program%2Fuppaal_red_blue_puzzle.xml
    属性文件:http://7tsy1b.com1.z0.glb.clouddn.com/program%2Fuppaal_red_blue_puzzle.q

← 軟體工程師 Zero score and seven years ago; 星辰混在一趟绿皮火车里远去 →
 
comments powered by Disqus