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
执行的最后一个选择。每当 a
的 case
的先决条件不足以确定应该采取哪个动作时,我们依赖于我们保存的 action
值并重播之前执行的动作。
请注意,如果 a
的先决条件 none 被触发,设计者有责任决定在初始状态下应该发生什么。在这种情况下,我们无法重播之前的操作 (它不存在),因此规范可以以不同方式处理。就我而言,我决定让 a
永远保持在值 0
上。
最近我尝试做一些将一些模型转换成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
执行的最后一个选择。每当 a
的 case
的先决条件不足以确定应该采取哪个动作时,我们依赖于我们保存的 action
值并重播之前执行的动作。
请注意,如果 a
的先决条件 none 被触发,设计者有责任决定在初始状态下应该发生什么。在这种情况下,我们无法重播之前的操作 (它不存在),因此规范可以以不同方式处理。就我而言,我决定让 a
永远保持在值 0
上。