我在NuSMV中有一段代码出现了错误。代码是:-
MODULE main
VAR
x1: {a,b,c,d,e};
x2: {a,b,c,d,e};
ASSIGN
next(x1) := case
x1=a & x2=c: e;
x1=d & next(x2)=c : a;
TRUE : x1;
esac;
next(x2) := case
x1=b & x2=b: c;
x2=d & next(x1)=e : e;
TRUE : x2;
esac;
因此,当我在NuSMV中进行编译时,会出现错误:recursively defined: x1
现在,我可以通过为x1的转换规则删除与x2关联的下一条语句来轻松解决此错误,这意味着我将x1=d & next(x2)=c : a;
替换为x1=d : a;
或x1=d & x2=d : a;
我想了解引起错误的NuSMV软件的机制,以及为什么上述修复程序可以解决该错误。我认为它与同步实现有些关系,等等,我不明白。有人可以提供精确的详细技术说明吗?
还要说明为什么变量x2
没有错误。使用下一个运算符还可以定义其转换规则。
答案 0 :(得分:0)
比这简单得多。
您具有循环依赖关系,软件无法为您解决该问题。
next(x1) := case
... & next(x2) : ...
esac;
next(x2) := case
... & next(x1) : ...
esac;
在确定此类分配需要事先知道答案的情况下,计算机(或人类)应该如何决定下一个状态的x1
和x2
的值?
您违反了docs第2.3.8节
中所述的循环依赖规则分配规则
赋值描述的方程组 说明FSM如何随着时间演变。与任意一组 方程并不能保证解决方案存在或存在 独特。我们通过设置某些限制来解决此问题 作业结构的句法规则,从而保证 该程序是可实施的。
分配的限制规则是:
单个分配规则 –每个变量可能是 仅分配一次。
循环依赖规则 –一组 方程的依存关系图中不得有不被其破坏的“循环” 延迟。
[...]
如果我们有一个类似
x := y ;
的作业,那么我们说 x取决于 y 。 组合循环是一个依赖循环,不会被 延误。例如,作业:x := y; y := x;
形成一个组合循环。确实,我们没有固定的顺序可以 计算
x
和y
,因为在每个时刻x
的值取决于y
的值,反之亦然 我们可以使用next()
运算符引入“单位延迟依赖性” 。x := y; next(y) := x;
在这种情况下,存在单位延迟依赖性 在
x
和y
之间。组合循环是依赖关系的循环,其依赖关系 总延迟为零。在NUSMV中,组合循环是非法的。这个 保证对于描述方程组行为的任何方程组 变量,至少有一种解决方案。[...]
您问:
[...]为什么上述修复程序可以解决错误。
它修复了错误,因为它打破了组合循环。更改之后,软件仍然需要计算x1
的将来值,以便计算x2
的将来值。但是,现在要计算x1
的将来值,它不再需要知道x2
的将来值(或其他所有不可用的信息,对于所有重要的事情),因此它可以解析两个分配。 / p>
您问:
还要解释为什么变量x2没有错误。使用下一个运算符还可以定义其转换规则。
分别进行的x1
和x2
上的两项分配都是完全合法的。但是,错误不是在单个分配上,而是在这两个分配的组合上。由于只有一个循环依赖项,涉及到两个变量,因此错误一经发现就仅报告一次。因此,只要在依存关系图中不再存在循环,是否通过更改x1
或x2
的分配来修复它就没有关系。