我正在尝试使用合金模拟自动售货机程序。我希望创建一个模型,在其中我可以插入一些钱并为机器提供一个项目的选择选项,它将为我提供相同的,如果提供的钱少,那么将不提供任何东西。 在这里,我试图输入一个硬币和一个按钮作为输入,它应该从自动售货机返回所需的项目,提供值即。分配给每个项目的金额作为输入提供。所以这里按钮a应该需要10个R,按钮b需要5个rs,c需要1个,d需要2个。 op实例是插入所需资金后返回的项目。 opc是要退还的硬币余额。 ip是输入按钮,x是钱输入。我如何提供一个实例,以便它输入多个硬币作为输入,如果金额大于项目成本,那么它应该返回一个硬币返回。如果我能得到一些帮助,我将不胜感激。
答案 0 :(得分:2)
如果我是你,我会先问问自己我关心的实体是什么类型;你已经做到了(硬币和物品的签名 - 你还需要一些客户的概念吗?)。
接下来,我会问自己,什么构成了该系统的合法国家 - 有时通过询问什么构成非法或不可接受的状态,有助于向后思考。
然后我会尝试定义操作 - 您已经提到过插入货币和选择项目 - 从系统的一个合法状态转换到下一个。
在每个阶段,我都会使用Analyzer来检查模型的实例,看看到目前为止我做的是否有意义。 Daniel Jackson的软件抽象的旋风之旅章节中给出了按此顺序定义实体,状态和状态转换的模式的一个示例 - 如果您可以访问该书,您将找到它有助于回顾那一章。
祝你好运!答案 1 :(得分:1)
模块vending_machines
open util / ordering [Event]
有趣的fst:事件{ordering / first}
有趣的nxt:事件 - >事件{ordering / next}
有趣的是[e:事件]:设置事件{prevs [e] + e}
abstract sig Event {}
sig Coin扩展了Event {}
pred no_vendor_loss [product:set(Event-Coin)] {
所有e:事件|让pfx = upto [e] | #(产物&安培; PFX)LT =#(硬币,安培; PFX)