NuSMV开发:改变"TRUE"在case语句中的功能

NuSMV development : Change the Function of "TRUE" in case statement

最近我尝试做一些将一些模型转换成Nusmv模型的工作,但我想尝试改变"TRUE:"关键字的功能。 众所周知,"case ... esac;"中的"TRUE:"可以定义一些当case条件没有那个特定条件时你想要的动作,但是我有要求天气 "TRUE" 可以做最后一次动作,例如:

    next(a) := 
                 case 
                       a>0 : -10;
                       a<0 : 10;
                       TRUE : (do the last time actions);
                  esac;

换句话说,当'a' = 0时,如果上次'a'赋值-10,那么这次也会赋值-10;如果上次'a'赋值10,这次也赋值10。

所以,现在的问题是,是否可以通过更改NuSMV的源代码来做到这一点,你能告诉我哪个是实现"case"中"TRUE"函数的c语言文件吗? ]?

感谢您的帮助!

可以使用多种方法。

解决方案 1.

此解决方案基于价值持久性。请注意,它可以用于您在问题中提供的玩具示例,但绝不是通用解决方案。

MODULE main
VAR
    a : -1..1;

ASSIGN
    init(a) := -1;
    next(a) := case
        a < 0 : 1;
        a > 0 : -1;
        TRUE  : a;
    esac;

值持久化就足够了,因为我们正在为变量分配一个常量值。

方案二

如果分配的值不是常量,则无法使用值持久性。相反,我们使用足够的 内存 来丰富模型,以便跟踪正在采取的操作。

MODULE main
VAR
    a : -1..1;
    action : { ACTION_1, ACTION_2, NONE };

ASSIGN
    init(action) := NONE;
    next(action) := case
        a < 0 : ACTION_1;
        a > 0 : ACTION_2;
        TRUE  : action;
    esac;
    init(a) := -1;
    next(a) := case
        a < 0 : a + 1;
        a > 0 : a - 1;
        action = ACTION_1 : a + 1;
        action = ACTION_2 : a - 1;
        TRUE              : a;
    esac;

在此示例中,action 跟踪对变量 a 执行的最后一个选择。每当 acase 的先决条件不足以确定应该采取哪个动作时,我们依赖于我们保存的 action 值并重播之前执行的动作。

请注意,如果 a 的先决条件 none 被触发,设计者有责任决定在初始状态下应该发生什么。在这种情况下,我们无法重播之前的操作 (它不存在),因此规范可以以不同方式处理。就我而言,我决定让 a 永远保持在值 0 上。