本文内容:
通过简单例子分析murphi代码执行状态
可达集概念分析
分析murphi如何求出可达集
概念 从初始状态开始,在不违反安全性质的情况下,根据规则集可到达的所有状态的集合。
以下,以pingpong.m为例,进行讲解。
(pingpong.m 文件可以在 cmurphi/ex/toy
中找到)
用Murphi求出可达集 打印出所有可能状态
(如果不知道怎么运行,请看 Murphi入门(一) )
./pingpong.o -p
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 Unpacking state from queue: Players[0].hasball:true Players[0].gotball:false Players[1].hasball:false Players[1].gotball:false The following next states are obtained: Firing rule Pass ball, p:0 Obtained state: Players[0].hasball:false Players[0].gotball:false Players[1].hasball:false Players[1].gotball:true Firing rule Keep ball, p:0 Obtained state: Players[0].hasball:true Players[0].gotball:false Players[1].hasball:false Players[1].gotball:false ------------------------------ Unpacking state from queue: Players[0].hasball:false Players[0].gotball:false Players[1].hasball:true Players[1].gotball:false The following next states are obtained: Firing rule Pass ball, p:1 Obtained state: Players[0].hasball:false Players[0].gotball:true Players[1].hasball:false Players[1].gotball:false Firing rule Keep ball, p:1 Obtained state: Players[0].hasball:false Players[0].gotball:false Players[1].hasball:true Players[1].gotball:false ------------------------------ Unpacking state from queue: Players[0].hasball:false Players[0].gotball:false Players[1].hasball:false Players[1].gotball:true The following next states are obtained: Firing rule Get ball, p:1 Obtained state: Players[0].hasball:false Players[0].gotball:false Players[1].hasball:true Players[1].gotball:false ------------------------------ Unpacking state from queue: Players[0].hasball:false Players[0].gotball:true Players[1].hasball:false Players[1].gotball:false The following next states are obtained: Firing rule Get ball, p:0 Obtained state: Players[0].hasball:true Players[0].gotball:false Players[1].hasball:false Players[1].gotball:false ========================================================================== Status: No error found. State Space Explored: 4 states, 6 rules fired in 0.10
讲解
以上为所有4种状态:
初始状态:玩家1执球,或玩家2执球。这就有两种状态了。
从queue中拿出一个,即玩家1执球
往下执行,玩家2接球
该状态不在queue中,且不违反invariant,放入可达集
放进queue中
从queue再拿出一个,即玩家2执球
往下执行,玩家1接球
该状态不在queue中,且不违反invariant,放入可达集
放进queue中
从queue中拿出一个,即玩家2接球
往下执行,玩家2执球
该状态已经在可达集中,不放入queue中
从queue中拿出一个,即玩家1接球
往下执行,玩家1执球
该状态已经在可达集中,不放入queue中
最终,可达集中有4个状态,且每一步规则都不违反invariant,即场上每次只能有一个球。
程序运行不会终止,所以是正确的。