以下代码终止检查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版本下摆脱警告的最简单,最不突兀的方法是什么?
答案 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