Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 经验证的正确接收模块_Ocaml_Coq_Proof - Fatal编程技术网

Ocaml 经验证的正确接收模块

Ocaml 经验证的正确接收模块,ocaml,coq,proof,Ocaml,Coq,Proof,我正在做一个登记簿,当顾客购买物品时,它会产生收据。作为练习,我正在考虑在Coq中创建一个收据模块,它不能生成错误的收据。简言之,收据上的物品和付款总额应始终为0(物品价格>0,付款金额0,付款

我正在做一个登记簿,当顾客购买物品时,它会产生收据。作为练习,我正在考虑在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。将添加此。感谢您的回复!也许我应该寻找一个可以证明状态机可靠性的系统。