为了终止检查,Agda是否会以不同方式处理记录和数据类型?

时间:2014-12-23 16:20:26

标签: records agda termination

以下是一些定义游戏和游戏二进制操作的Agda(2.4.2)代码示例。

module MWE where

open import Data.Sum
open import Size

data Game (i : Size) : Set₁ where
  game : {Move : Set} → {<i : Size< i} → (play : Move → Game <i) → Game i

_∧_ : ∀ {i j} → Game i → Game j → Game ∞
_∧_ {i} {j} (game {Move/g} {<i} play/g) (game {Move/h} {<j} play/h)
  = game {∞} {Move/g ⊎ Move/h}
      λ { (inj₁ x) → _∧_ {<i} {j} (play/g x) (game play/h)
        ; (inj₂ y) → _∧_ {i} {<j} (game play/g) (play/h y) }

此代码类型和终止检查。但是,如果我用记录定义替换Game的定义,如下所示:

record Game (i : Size) : Set₁ where
  inductive
  constructor game
  field
    {Move} : Set
    {<i} : Size< i
    play : Move → Game <i

Agda不再认为_∧_的定义要终止,即使ij的值在每次递归调用中都会减少。据我所知,Game的这两个定义应该是等价的;是什么导致Agda成功终止 - 检查前者,而不是后者?

0 个答案:

没有答案