Ocaml 经验证的正确接收模块
我正在做一个登记簿,当顾客购买物品时,它会产生收据。作为练习,我正在考虑在Coq中创建一个收据模块,它不能生成错误的收据。简言之,收据上的物品和付款总额应始终为0(物品价格>0,付款金额<0)。这是可行的,还是明智的 要快速绘制收据,收据将由收据项目和付款组成,如Ocaml 经验证的正确接收模块,ocaml,coq,proof,Ocaml,Coq,Proof,我正在做一个登记簿,当顾客购买物品时,它会产生收据。作为练习,我正在考虑在Coq中创建一个收据模块,它不能生成错误的收据。简言之,收据上的物品和付款总额应始终为0(物品价格>0,付款金额0,付款
type receipt = {
items : item list;
payments : payment list
}
还有增加物品和付款的功能
add_article(receipt, article, quantity)
add_payment(receipt, payment)
在现实生活中,这个过程当然更复杂,增加了不同类型的折扣等
当然,添加一个布尔函数check\u receipt
来确认收据是否正确是很容易的。既然文章和付款总是在运行时添加的,这可能是唯一的方法
例如:
receipt = {
items = [{name = "article1"; price = "10"; quantity = "2"}];
payments = [{payment_type = Cash; amount = (-20)}];
}
清楚我想要什么吗
或者证明正确的增值税计算更有趣。有两个这样的属性可以被证明。您可以使用Coq来证明您的程序具有这样的属性,但我认为它不适用于您介绍的特定示例。物品和付款将在不同的时间添加,因此无法保证余额始终为0。您可以在最后检查余额是否为0,但程序已经必须这样做了。我不认为有一种方法可以将检查从执行时转移到编译时,即使有一个证明助手 我认为使用Coq来证明算法的优化和简单实现遵循相同的输入/输出关系更有意义。如果有一种方法可以简化您的程序,也许是以性能为代价,也许您可以使用Coq来比较这两个版本。然后,您将确信在优化过程中没有引入错误
这就是我不看任何代码就可以说的。对不起,不清楚。您所说的“收据上的物品和付款总额应始终为0”是什么意思?文章(数量,可能?)和付款是不同的,它们总是正的,为什么总和为0?你能举个例子吗?啊,对不起。在我们的系统中,物品的金额>0,付款<0。将添加此。感谢您的回复!也许我应该寻找一个可以证明状态机可靠性的系统。