本章目录
- 范例一:Y所有时刻的状态值均为X在当前时刻的状态值(pre、->)
- 范例二:输出前一时刻的状态值,初始状态值为false(pre、->)
- 范例三:S的值为当前和之前所有X的值的总和(pre、or、->)
- 范例四:向上计数器, C从0开始,持续增加1,Reset为真,此时C回到0(pre、if、->)
- 范例五:如果状态X在某一时刻为真,则从该时刻之后(包括该时刻),状态Y均为真,从该时刻之前,状态Y均为假(pre、or、->)
- 范例六:状态X从开始时刻到某一时刻都是真的,则状态Y从开始时刻到这一时刻也是真的,一旦某一时刻遇到为假,不管未来还有多少时刻为真,从这一结点开始,状态Y在任何时刻都为假(pre、and、->)
- 范例七:X为真时Z为真,X不为真时,当Y和前一时刻的Z同时为真时,Z为真,否则Z为假(pre、or、and、->)
- 范例八:Y为真且X为真,或Y为真且前一时刻Z为真时,当前时刻Z为真,否则当前时刻Z为假(pre、or、and、->)
- 范例九:灯的开关按钮,按On后灯亮,按Off后灯灭(pre、if、not、->)
- 范例十:两种对状态X赋相同值的方法,并验证结果是否有效(pre、if、->、--%MAIN、--%PROPERTY)
范例一:Y所有时刻的状态值均为X在当前时刻的状态值(pre、->)
代码:
node first( X : real ) returns ( Y : real );
let
Y = X -> pre Y;
tel
Simulate执行结果:
范例二:输出前一时刻的状态值,初始状态值为false(pre、->)
代码:
node Delay(in: bool) returns (out: bool) ;
-- 定义一个布尔变量x,默认为false,这个定义只在Time=0的时候定义一次
var x: bool ;
let
-- 对输出变量out的值赋上x当前的值
out = x ;
-- Time=0的时候x的值为false,以后的x的值为前一个in的值
x = false -> pre in ;
tel
Simulate执行结果:
范例三:S的值为当前和之前所有X的值的总和(pre、or、->)
代码:
node sum (X: int) returns (S: int);
let
S = X -> X + (pre S);
tel
Simulate执行结果:
范例四:向上计数器, C从0开始,持续增加1,Reset为真,此时C回到0(pre、if、->)
代码:
node UpCounter( Reset: bool ) returns ( C: int );
let
C = 0 -> if Reset then 0 else (pre C) + 1 ;
tel
Simulate执行结果:
范例五:如果状态X在某一时刻为真,则从该时刻之后(包括该时刻),状态Y均为真,从该时刻之前,状态Y均为假(pre、or、->)
代码:
node hasHappened(X : bool) returns (Y : bool);
let
Y = X or (false -> pre Y);
tel
Simulate执行结果:
范例六:状态X从开始时刻到某一时刻都是真的,则状态Y从开始时刻到这一时刻也是真的,一旦某一时刻遇到为假,不管未来还有多少时刻为真,从这一结点开始,状态Y在任何时刻都为假(pre、and、->)
代码:
node sofar( X : bool ) returns ( Y : bool );
let
Y = X -> (X and (pre Y));
tel
Simulate执行结果:
范例七:X为真时Z为真,X不为真时,当Y和前一时刻的Z同时为真时,Z为真,否则Z为假(pre、or、and、->)
代码:
node Since( X, Y : bool ) returns ( Z : bool );
let
Z = X or (Y and (false -> pre Z));
tel
Simulate执行结果:
范例八:Y为真且X为真,或Y为真且前一时刻Z为真时,当前时刻Z为真,否则当前时刻Z为假(pre、or、and、->)
代码:
node SinceIncl( X, Y : bool ) returns ( Z : bool );
let
Z = Y and (X or (false -> pre Z));
tel
Simulate执行结果:
范例九:灯的开关按钮,按On后灯亮,按Off后灯灭(pre、if、not、->)
代码:
node switch (On, Off: bool) returns (S: bool);
let
S = false -> if (pre S) then not Off else On;
tel
Simulate执行结果:
范例十:两种对状态X赋相同值的方法,并验证结果是否有效(pre、if、->、–%MAIN、–%PROPERTY)
代码:
-- 一个复杂的X赋值过程
node s (_:bool) returns (X: int);
let
X = 1 -> if (pre X) < 3 then (pre X) + 1 else 3 ;
tel
-- 一个精简的X赋值过程
node s1 (_:bool) returns (X: int);
let
X = 1 -> pre (2 -> 3);
tel
-- 观察结点s和s1的运行结果是否一致,如果一致,则OK的结果为true,否则为false
node obs_s(_:bool) returns (OK: bool);
let
OK = (s(_) = s1(_));
--%MAIN;
--%PROPERTY OK;
tel
Check验证结果:
Simulate执行结果:
- 对于不需要输入值的结点,我们使用下划线_来表示一个没有意义的输入
- 进行Check验证时,代码中的–%PROPERTY OK;也可写成–%PROPERTY (s() = s1());