Coq 中的 Program Fixpoint 和 Function 有什么区别?

What's the difference between Program Fixpoint and Function in Coq?

它们的用途似乎相似。到目前为止我注意到的一个区别是,虽然 Program Fixpoint 会接受像 {measure (length l1 + length l2) } 这样的复合度量,但 Function 似乎拒绝了这一点并且只允许 {measure length l1}.

Program Fixpoint 严格来说是否比 Function 更强大,还是它们更适合不同的用例?

这可能不是完整的列表,但这是我目前所发现的:

  • 正如您已经提到的,Program Fixpoint 允许度量查看多个参数。
  • Function 创建了一个 foo_equation 引理,可用于用其​​ RHS 重写对 foo 的调用。对于避免像 .
  • 这样的问题非常有用
  • 在某些(简单的?)情况下,Function 可以定义一个foo_ind 引理来沿着foo 的递归调用结构进行归纳。同样,在不有效重复证明中的终止参数的情况下证明关于 foo 的事情非常有用。
  • Program Fixpoint 可以被欺骗以支持嵌套递归,请参阅 . This is also why Program Fixpoint can define the Ackermann 函数,而 Function 不能。