首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >证明子类型的逆引理,终止检查,“子”

证明子类型的逆引理,终止检查,“子”
EN

Stack Overflow用户
提问于 2021-04-30 04:29:41
回答 1查看 98关注 0票数 1

我试图从类型和编程语言中证明(第一部分)子类型引理。到目前为止,我的情况如下:

代码语言:javascript
复制
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₂)                                             

这在我看来是对的,但我明白:

代码语言:javascript
复制
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而终止?是那么回事吗?有解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-30 17:00:19

结果,我需要在refl上进行模式匹配,如下所示:

代码语言:javascript
复制
... | (U₁ × U₂) , (refl × T₁<:U₁ × U₂<:T₂) with lemma-inversion₁ S<:U

这让Agda推断出U = U₁ => U₂和终止检查器是快乐的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67328194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档