我正在办理登记册,当客户购买物品时会生成收据。作为练习,我正在考虑在Coq中制作一个收据模块,它不会产生错误的收据。简而言之,收据上的物品和付款应总是为0(其中物品的价格> 0且付款金额<0)。这是可行的还是明智的?
要做快速草图,收据将包含收据项目和付款,例如
type receipt = {
items : item list;
payments : payment list
}
并且会有添加文章和付款的功能
add_article(receipt, article, quantity)
add_payment(receipt, payment)
在现实生活中,这个程序当然更复杂,增加了不同类型的折扣等。
当然,添加一个确认收据正确的布尔函数check_receipt
很容易。由于文章和付款总是在运行时添加,这可能是唯一的方法吗?
示例:
receipt = {
items = [{name = "article1"; price = "10"; quantity = "2"}];
payments = [{payment_type = Cash; amount = (-20)}];
}
我想要的是什么?
或者证明正确的增值税计算可能更有意思。有几个这样的属性可以证明。
答案 0 :(得分:2)
您可以使用Coq来证明您的程序具有这样的属性,但我不认为它适用于您提供的特定示例。文章和付款将在不同时间添加,因此无法保证余额始终为0。如果余额为0,您可以在结尾检查,但程序已经必须这样做了。我认为有一种方法可以将检查从执行时间转移到编译时甚至使用校对助手。
我认为使用Coq来证明算法的优化和朴素实现服从相同的输入/输出关系会更有意义。如果有一种方法来简化您的程序,可能以性能为代价,也许您可以使用Coq比较两个版本。然后你会相信你在优化过程中没有引入错误。
如果不查看任何代码,我就可以说。