终止检查时Agda 2.4.0.x回归

时间:2014-06-22 12:18:12

标签: agda

以下代码终止检查Agda 2.3.2.2但不支持2.4.0.x:

open import Data.Nat
open import Relation.Binary.PropositionalEquality

+-comm : ∀ a b → a + b ≡ b + a
+-comm zero zero = refl
+-comm zero (suc b) = cong suc (+-comm zero b) -- this recursive call is red
+-comm (suc a) zero = cong suc (+-comm a zero)
+-comm (suc a) (suc b) rewrite 
    +-comm a (suc b)
  | +-comm b (suc a) -- and also this one
  | +-comm a b = refl

在新的Agda版本下摆脱警告的最简单,最不突兀的方法是什么?

1 个答案:

答案 0 :(得分:2)

终止检查程序的工作方式有一些变化(据我所知,新算法用于使--termination-depth选项过时)。

第一次递归调用实际上很好。它在结构上是递归的,但我不知道它为什么被标记。

这是造成问题的第二个问题。如果你在结构上递归,Agda就会停止抱怨。修复实际上非常简单:

+-comm : ∀ a b → a + b ≡ b + a
+-comm zero zero = refl
+-comm zero (suc b) = cong suc (+-comm zero b)
+-comm (suc a) zero = cong suc (+-comm a zero)
+-comm (suc a) (suc b) rewrite
         +-comm a (suc b)
  | sym (+-comm (suc a) b)
  |      +-comm a b = refl