agda - 证明子类型、终止检查、`subst` 的反转引理
问题描述
我试图证明来自Types and Programming Languages的(第一部分)子类型引理。这是我到目前为止所拥有的:
data Type : Set where
_=>_ : Type → Type → Type
Top : Type
data _<:_ : Type → Type → Set where
s-refl : {S : Type} → S <: S
s-trans : {S T U : Type} → S <: U → U <: T → S <: T
s-top : {S : Type} → S <: Top
s-arrow : {S₁ S₂ T₁ T₂ : Type} → T₁ <: S₁ → S₂ <: T₂ → S₁ => S₂ <: T₁ => T₂
lemma-inversion₁ : {S T₁ T₂ : Type}
→ S <: T₁ => T₂
→ ∃[ (S₁ × S₂) ∈ (Type & Type) ] ((S ≡ (S₁ => S₂)) & (T₁ <: S₁) & (S₂ <: T₂))
lemma-inversion₁ (s-refl {T₁ => T₂}) = (T₁ × T₂) , (refl × s-refl × s-refl)
lemma-inversion₁ (s-arrow {S₁} {S₂} T₁<:S₁ S₂<∶T₂) = (S₁ × S₂) , (refl × T₁<:S₁ × S₂<∶T₂)
lemma-inversion₁ (s-trans {S} S<:U U<:T₁=>T₂) with lemma-inversion₁ U<:T₁=>T₂
... | (U₁ × U₂) , (U≡U₁=>U₂ × T₁<:U₁ × U₂<:T₂) with lemma-inversion₁ (subst (S <:_) U≡U₁=>U₂ S<:U)
... | (S₁ × S₂) , (S≡S₁=>S₂ × U₂<:S₁ × S₂<:U₂) = (S₁ × S₂) , (S≡S₁=>S₂ × s-trans T₁<:U₁ U₂<:S₁ × s-trans S₂<:U₂ U₂<:T₂)
这对我来说看起来是正确的,但我得到:
Termination checking failed for the following functions:
lemma-inversion₁
Problematic calls:
lemma-inversion₁ (s-trans S<:U U<:T₁=>T₂)
| lemma-inversion₁ U<:T₁=>T₂
lemma-inversion₁ U<:T₁=>T₂
lemma-inversion₁ (subst (_<:_ S) U≡U₁=>U₂ S<:U)
看起来 Agda 无法推断终止,因为subst
? 是对的吗?有解决方法吗?
解决方案
推荐阅读
- asp.net - Go Daddy Economy Windows 托管问题与 ASP.NET 网站
- vba - Visual Basic 到 Excel 公式
- vb.net - vb.net。从所选项目播放文件
- python - django - or_ 未定义
- html - Google 表格 importxml 失败 - 无法从链接中找到正确的表格路径
- node.js - 中间件挂起
- javascript - 无法使用 this.function (React.js) 读取未定义的属性“函数”
- scala - 从火花数据框中的另一列替换一列的值
- python - 堆叠热图 - seaborn 解决方案?
- c - MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED