旋转:解释错误跟踪

时间:2017-01-03 10:52:58

标签: verification model-checking spin promela

我尝试解决关于农民,狼,山羊和卷心菜的任务。

所以,我找到了以下的promela描述:

#define fin (all_right_side == true)
#define wg  (g_and_w == false)
#define gc  (g_and_c == false)

ltl ltl_0 { <> fin && [] ( wg && gc ) } 

bool all_right_side, g_and_w, g_and_c;
active proctype river()
{
 bit f = 0, 
 w = 0, 
 g = 0, 
 c = 0; 

 all_right_side = false;
 g_and_w = false;
 g_and_c = false;
 printf("MSC: f %c w %c g %c c %c \n", f, w, g, c);

 do
 :: (f==1) && (f == w) && (f ==g) && (f == c) -> 
        all_right_side = true; 
        break;
 :: else ->
        if
            :: (f == w) ->
                    f =  1 - f;
                    w =  1 - w;
            :: (f == c) ->
                    f =  1 - f;
                    w =  1 - c;
            :: (f == g) ->
                    f =  1 - f;
                    w =  1 - g;
            :: (true) ->
                    f =  1 - f;
        fi;

        printf("M f %c w %c g %c c %c \n",  f, w, g, c);

        if
            :: (f != g && g == c) ->
                    g_and_c = true;
            :: (f != g && g == w) ->
                    g_and_w = true;
            ::else ->
                    skip
        fi
 od;

 printf ("MSC: OK!\n")
}

我添加了一个LTL公式:ltl ltl_0 {&lt;&gt;鳍&amp;&amp; [](wg&amp;&amp; gc)} 为了验证,狼不会吃山羊,山羊也不会吃白菜。我想举一个例子,农民如何能够毫无损失地运送他所有的需求(w-g-c)。

当我运行验证时,我得到以下结果: 状态向量20字节,深度达到59,错误:1        64个州,存储        23个州,匹配        87次转换(=存储+匹配)         0个原子步骤 哈希冲突:0(已解决)

这意味着该程序为我生成了一个示例。但我不能解释它。 * .pml.trial文件的内容为:enter image description here

请帮我解释一下。

2 个答案:

答案 0 :(得分:2)

有几种方法可以解释痕迹。

  1. 使用iSpin:
    • 转到模拟/播放
    • 在模式下,选择Guided并输入跟踪文件的名称
    • 运行
  2. 这将逐步显示每个进程所采取的操作,包括进程号,proctype名称,执行的指令行号,执行的指令代码等信息。

    1. 对旋转做同样的事:
      使用命令

      spin -t -p xyz.pml

    2. 了解跟踪文件语法:
      文件上的每一行都是模拟器采取的一步。 第一列只是序列号。 第二列是流程编号(pids)。 (例如,init将为0,它启动/运行的第一个进程将为1,依此类推。) 第三列是转换号。如果您想了解正在发生的事情,可以查看pids并查看说明

答案 1 :(得分:0)

为了“解释”,您可以修改源代码,以便每次执行操作时 intellegibile 都打印在 stdout上

<强> e.g:

            :: (f == w) ->
                    if
                       :: f == 0 -> printf("LEFT ---[farmer, wolf]--> RIGHT\n");
                       :: f == 1 -> printf("LEFT <--[farmer, wolf]--- RIGHT\n");
                       :: else -> skip;
                    fi;
                    f =  1 - f;
                    w =  1 - w;

+案例(f == c)(f == g)(true)的相似内容。

注意:您的源代码已提供printf("M f %c w %c g %c c %c \n", f, w, g, c);,如果您保留,可用于解释 计数器示例请注意,0表示left1表示right。不过,我更喜欢更多的详细追踪。

为每个可能的转换完成此操作后,您可以通过以下方式运行 spin 来查看计数器示例中发生的情况

~$ spin -t file_name.pml

选项-t会在违反某些断言/属性时重播 spin 找到的最新trail