我想在mathematica中创建一个模块,如果自动机是确定性的则返回。我正在考虑,如果有 2 个转换从同一状态开始并读取相同的符号,或者存在一个空转换,则自动机不是确定性的。
我想调试这段代码,但我不能:
isDeterministic[au_] := Module[{a, s},
For[i = 1, i <= Length[au[[3]]],
a = au[[3]][[i]][[1]];
s = au[[3]][[i]][[2]];
If[s == {}, Return[False]];
For[j = i, j <= Length[au[[3]]],
If[a == au[[3]][[j]][[1]] && s == au[[3]][[j]][[2]],
Return[False]];
j++;
];
i++;
];
Return[True];
]
A = {{1, 2},
{a, b},
{{1, a, 2}, {2, b, 1}},
1,
{2}
}
isDeterministic[A]
A 是一个自动机,其中第一个元素是状态列表,第二个是字母表,第三个是转换,第四个是初始状态,第五个是最终状态列表。
主要问题是,当我将函数应用于 A 时,它永远不会结束。
编辑:已解决
这是最终代码:
isDeterministic[au_] :=
Module[{a, s, lambda},
For[i = 1, i <= Length[au[[3]]], i++, a = au[[3]][[i]][[1]];
s = au[[3]][[i]][[2]];
If[s == lambda, Return[False]];
For[j = i + 1, j <= Length[au[[3]]], j++,
If[a == au[[3]][[j]][[1]] && s == au[[3]][[j]][[2]],
Return[False]]]];
True]
A = {{1, 2},
{a, b},
{{2, b, 1}, {1, a, 2}},
1,
{2}
}
isDeterministic[A]
True