数据类型声明

时间:2019-07-01 11:27:56

标签: nusmv

我想声明一个名为Machine的数组,该数组包含4个元素。每个元素也是2个元素的数组,其中第一个元素的值从枚举中获得: pressionLevel={below, normal, over} 第二个具有枚举值: action={start, pause, stop, restart}

我的第二个问题是如何访问此数组的元素?

VAR

 pressionLevel={below, normal, over};

 action={start, pause, stop, restart};

 machine= array 1..4  -- how to continue this declaration?? --

enter image description here

1 个答案:

答案 0 :(得分:1)

AFAIK ,不直接支持数组的数组。

您可以为元素模块的每个实例创建一个不同的名称(请参见machine01),也可以将元素模块报废并将其内容压入机器模块中(请参见machine02)。

例如:

MODULE element()
VAR
    pressionLevel : { BELOW, NORMAL, OVER };
    action        : { START, PAUSE, STOP, RESTART };

MODULE machine01()
VAR
    el1 : element();
    el2 : element();
    el3 : element();
    el4 : element();

MODULE machine02()
VAR
    pressionLevel : array 1..4 of { BELOW, NORMAL, OVER };
    action        : array 1..4 of { START, PAUSE, STOP, RESTART };

MODULE main()
VAR
    m1 : machine01();
    m2 : machine02();

可以使用 constant 索引(例如:

)访问数组的元素
next(precisionLevel[0]) := BELOW

使用约束样式建模时,很容易对具有意想不到的结果的事物进行建模,或者编写一些对于非常小的数组可管理的约束,但是由于某些原因,它很快就会失效为更大的。因此,我建议仅使用赋值样式建模,或扩展像

这样的约束
precisionLevel[i] = BELOW => ... some consequence ...

如下

 ((i = 0 & precisionLevel[0] = BELOW) => ... some consequence ...)
 &
 ((i = 1 & precisionLevel[1] = BELOW) => ... some consequence ...)
 &
 ...

其中i是充当数组precisionLevel的索引的变量,并且约束在i的整个域中扩展。