红绿灯旋转

时间:2018-05-11 13:54:45

标签: semaphore spin promela

首先,我需要说我非常新的,我必须做一些具有某些条件的信号量。

我们每个方向只会模拟一个红绿灯(第二个只重复相同的行为)。例如,在上图中,垂直光为绿色,水平光为红色。最初,两个方向都是红色的。当汽车到达时,传感器检测到它并且其相应的灯变为绿色。但是,只有当另一个方向仍为红色时才会发生这种情况;否则,它会等到另一个方向关闭。一旦任何方向为绿色,它将接下来变为橙色(有一个计时器,但我们不会模拟延迟),然后它将再次变为红色。

实际上这是我现在的代码:

mtype = { red, yellow, green };
mtype light0 = red;
mtype light1 = red;

active proctype TL0() {
    do
        :: if
        :: light0 == red -> Ered: atomic {
            light1 == red; /* wait*/
            light0 = green;
        }
        :: light0 == green -> EY: light0 = yellow
        :: light0 == yellow -> EG: light0 =red
        fi;
        printf("The light0 is now %e\n", light0)
    od
}

active proctype TL1() {
    do
        :: if
        :: light1 == red -> Ered: atomic {
            light0 == red; /* wait*/
            light1 = green;
        }
        :: light1 == green -> EY: light1 = yellow
        :: light1 == yellow -> EG: light1 =red
        fi;
        printf("The light1 is now %e\n", light1)
    od
}

问题是当我使用

  

spin -a -f'<>(!TL0 @ Ered&&!TL1 @ Ered)' sem3.pml

检查安全性我得到一个erorr。

  

警告:永不声明+接受标签需要-a标志才能完全验证   警告:对于p.o.减少是有效的,从来没有声称必须   口吃不变(从未从LTL公式产生的声明是   stutter-invariant)pan:1:断言违反!((!((TL0._p == Ered))&&   !((TL1._p == Ered))))(深度为0)pan:写了sem3.pml.trail

     

(Spin Version 6.4.8 - 2018年3月2日)警告:搜索未完成+   部分订单减少

     

完整状态空间搜索:从不声明+(never_0)     断言违规+(如果在索赔范围内)接受   周期 - (未选中)无效结束状态 - (由-E标志禁用)

     

状态向量36字节,深度达到0,错误:1           1状态,存储           0个州,匹配           1个转换(=存储+匹配)           0个原子步骤哈希冲突:0(已解决)

但实际上我不知道这个问题:(

希望有人能帮助我

THX!

1 个答案:

答案 0 :(得分:0)

模型很好,但我建议你手动生成验证器。

首先,在文件底部添加以下行:

.bat

然后,生成验证者:

ltl p1 { <>(!TL0@Ered && !TL1@Ered) };
ltl p2 { [] !(TL0@EY && TL1@EY) };     // perhaps you wanted (something like) this?