我尝试通过旋转来解决有关农夫、狼、山羊和卷心菜的任务。
所以,我找到了以下 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 { <> fin && [] ( wg && gc ) } 来验证,狼不会吃山羊,山羊不会吃卷心菜。我想举一个例子,农民如何能够无损地运输他的所有需求(wgc)。
当我运行验证时,我得到以下结果:状态向量 20 字节,深度达到 59,错误:1 64 个状态,存储 23 个状态,匹配 87 个转换(= 存储+匹配)0 个原子步骤哈希冲突:0(已解决)
这意味着该程序为我生成了一个示例。但我无法解释它。*.pml.trial 文件内容为:在此处输入图片描述
请帮我解释一下。