以下是一些定义游戏和游戏二进制操作的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不再认为_∧_
的定义要终止,即使i
或j
的值在每次递归调用中都会减少。据我所知,Game
的这两个定义应该是等价的;是什么导致Agda成功终止 - 检查前者,而不是后者?