两个内部状态名称不同,可能对所有未来输入产生完全相同的可见输出。若只比较当前颜色相同就合并,却可能丢掉下一次输入后的差异,需要检查整个后续行为。
本例是六状态、两种输入的确定性状态机,每个状态有一个输出颜色。先按当前颜色分组,再反复按两种输入分别到达哪个组细分,直到分组不再变化。只有最终同组的状态才视为行为等价。
输入字符为零或一,状态编号零至五;输出颜色用数字标记,数字只代表类别。
状态 | 输出颜色 | 输入0去向 | 输入1去向 0 | 1 | 1 | 0 1 | 2 | 4 | 3 2 | 1 | 3 | 4 3 | 1 | 4 | 3 4 | 2 | 1 | 3 5 | 1 | 0 | 4 分组细化过程: [[0, 2, 3, 5], [1, 4]] [[0, 3], [1, 4], [2, 5]] 最终分组:[[0, 3], [1, 4], [2, 5]] 状态对 | 最短区分串(空串表示当前已不同,None表示等价) [0, 1, ''] [0, 2, '0'] [0, 3, None] [0, 4, ''] [0, 5, '0'] [1, 2, ''] [1, 3, ''] [1, 4, None] [1, 5, ''] [2, 3, '0'] [2, 4, ''] [2, 5, None] [3, 4, ''] [3, 5, '0'] [4, 5, '']
表中编号只标记本例对象,不表示排名或另一组数据中的身份。先确认输入单位与边界约定,再逐步核对中间值。零、空结果和不存在是不同状态,不能因为显示相近就互相替代;分数用精确形式保留,便于重新演算。
等价状态当前输出相同,输入相同字符后也应进入等价状态。对于不同组的一对状态,可以寻找一串输入,让它们最后输出不同;最短这样的输入串能直观说明为何不能合并。空串表示当前输出已经不同。
从一对看似相同的状态同时执行相同输入,并排记录输出。分组稳定后可以构造缩小的状态机,但本例保留原编号方便核对。合并是为了保留可见行为,不是让内部状态名称或动画资源文件变得相同。
这里只处理确定性、输入完全定义、输出由状态决定的机器,没有时间、随机分支或隐藏计数。若额外条件会影响转移,就必须把那些条件纳入状态定义,不能仅对这张简化转移表做合并。
这份记录用于理解明确规则下的游戏机制。改变输入后,结果也应随之重新计算;若操作规则不同,应先把新规则写清再比较。可以从一两个步骤手算开始,找出第一处差异,而不是只对照最后一个数值。全部中间记录都属于当前案例,不能直接当成其他场景的固定答案。