使用米利语义进行自动售货机建模
此示例说明如何使用米利语义进行自动售货机建模。米利图仅在转移时计算输出,而不在状态中计算输出。有关详细信息,请参阅Design Considerations for Mealy Charts。

米利自动售货机的逻辑
在此示例中,自动售货机需要投入 15 美分才能释放一罐苏打水。购买者可以通过一次一枚的方式投入一枚 5 美分镍币或一枚 10 美分硬币来购买苏打水。该图的行为类似于一个米利状态机,因为其输出 soda 取决于投入的硬币和当前状态:
got_0 - 尚未收到硬币或当前无剩余硬币。
如果收到一枚 5 美分镍币 (
coin == 1),输出soda保持为 0,但状态got_nickel被激活。如果收到一枚 10 美分硬币 (
coin == 2),输出soda保持为 0,但状态got_dime被激活。如果投入的硬币既不是 10 美分也不是 5 美分,则状态
got_0保持激活状态,且不会释放苏打水(输出soda = 0)。
got_nickel - 收到一枚 5 美分镍币。
如果收到另一枚 5 美分镍币 (
coin == 1),状态got_dime被激活,但不会释放苏打水(soda保持为 0)。如果收到一枚 10 美分硬币 (
coin == 2),则释放苏打水 (soda = 1),并计入硬币,激活状态变为got_0,因为没有剩余硬币。如果投入的硬币不是 10 美分或 5 美分,则状态
got_nickel保持激活状态,并且不会释放苏打水(输出soda = 0)。
got_dime - 收到一枚 10 美分硬币。
如果收到一枚 5 美分镍币 (
coin == 1),则释放苏打水 (soda = 1),并计入硬币,激活状态变为got_0,因为没有剩余硬币。如果收到一枚 10 美分硬币 (
coin == 2),则释放苏打水 (soda = 1),计入 15 美分,激活状态变为got_nickel,因为剩余一枚 5 美分镍币(找零)。如果投入的硬币不是 10 美分或 5 美分,则状态
got_dime保持激活状态,并且不会释放苏打水(输出soda = 0)。
米利自动售货机中的设计规则
此米利自动售货机示例展示了以下米利设计规则:
图在条件动作中计算输出。
没有状态动作或转移动作。
输入
coin的值确定输出soda的值。