了解NuSMV中的递归定义的错误

时间:2018-08-31 22:47:45

标签: logic nusmv

我在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没有错误。使用下一个运算符还可以定义其转换规则。

1 个答案:

答案 0 :(得分:0)

比这简单得多。

您具有循环依赖关系,软件无法为您解决该问题。

next(x1) := case
     ... & next(x2) : ...
esac;

next(x2) := case
     ... & next(x1) : ...
esac;

在确定此类分配需要事先知道答案的情况下,计算机(或人类)应该如何决定下一个状态的x1x2的值?


您违反了docs第2.3.8节

中所述的循环依赖规则
  

分配规则

     

赋值描述的方程组   说明FSM如何随着时间演变。与任意一组   方程并不能保证解决方案存在或存在   独特。我们通过设置某些限制来解决此问题   作业结构的句法规则,从而保证   该程序是可实施的。

     

分配的限制规则是:

     
      
  • 单个分配规则 –每个变量可能是   仅分配一次。

  •   
  • 循环依赖规则 –一组   方程的依存关系图中不得有不被其破坏的“循环”   延迟。

  •   
     

[...]

     

如果我们有一个类似x := y ;的作业,那么我们说 x取决于   y 组合循环是一个依赖循环,不会被   延误。例如,作业:

x := y;
y := x;
     

形成一个组合循环。确实,我们没有固定的顺序可以   计算xy,因为在每个时刻x的值取决于   y的值,反之亦然   我们可以使用next()运算符引入“单位延迟依赖性”

      x := y;
next(y) := x;
     

在这种情况下,存在单位延迟依赖性   在xy之间。组合循环是依赖关系的循环,其依赖关系   总延迟为零。在NUSMV中,组合循环是非法的。这个   保证对于描述方程组行为的任何方程组   变量,至少有一种解决方案。

     

[...]


您问:

  

[...]为什么上述修复程序可以解决错误。

它修复了错误,因为它打破了组合循环。更改之后,软件仍然需要计算x1的将来值,以便计算x2的将来值。但是,现在要计算x1的将来值,它不再需要知道x2的将来值(或其他所有不可用的信息,对于所有重要的事情),因此它可以解析两个分配。 / p>


您问:

  

还要解释为什么变量x2没有错误。使用下一个运算符还可以定义其转换规则。

分别进行的x1x2上的两项分配都是完全合法的。但是,错误不是在单个分配上,而是在这两个分配的组合上。由于只有一个循环依赖项,涉及到两个变量,因此错误一经发现就仅报告一次。因此,只要在依存关系图中不再存在循环,是否通过更改x1x2的分配来修复它就没有关系。