证明解决谜题的函数(例如数独或卓祖)的正确性的一般步骤是什么?
我期望典型的“顺序难题”形式化由以下部分组成:
首先,定义板配置,无效(即没有/之前约束)和有效(满足所有约束)。
两个“求解器”函数,在给定有效的板配置的情况下:
option
);以及相应的两个“检查器”功能:
最后,为了证明正确性:
通过考虑返回整套可能解决方案的求解器,或者更好的是,考虑使用一些回溯或其他类型的延续方案逐个“流”解决方案的求解器,该方案可能会变得更加复杂。
另一方面,一些简化是可能的:特别是,在像 Coq 这样的依赖类型的完整语言中,检查器可能会被省略(尽管在实践中这些检查器无论如何都是有用的,以验证数据),因为该语言让我们严格定义板配置(无效和有效),并且求解器(任何函数)保证返回符合声明的返回类型(是其实例)的结果。
对于具体示例,您可以查看以下实现进行比较/参考,请特别参阅“正确性定理”的自述文件:GitHub 上的 coq-community / sudoku