Types 形式化多类型判断⊢;在相同的范围内Γ;在阿格达

Types 形式化多类型判断⊢;在相同的范围内Γ;在阿格达,types,agda,Types,Agda,我是阿格达的初学者!我已经读了和,现在我想自己尝试将一种小型语言形式化。由于我对代数效果和处理程序感兴趣,我从Pretnar的教程开始。Pretnar的语言有两种类型的判断(Γ⊢ 价值观与Γ⊢ 计算)通常采用接近CBPV的方法。此外,正如PLPA中所建议的,我尝试使用de Bruijn表示法 我拥有的一些代码: mutual data ValueType : Set where ~ℕ : ValueType ~If you write rename ρ (⋆ E)

我是阿格达的初学者!我已经读了和,现在我想自己尝试将一种小型语言形式化。由于我对代数效果和处理程序感兴趣,我从Pretnar的教程开始。Pretnar的语言有两种类型的判断(Γ⊢ 价值观与Γ⊢ 计算)通常采用接近CBPV的方法。此外,正如PLPA中所建议的,我尝试使用de Bruijn表示法

我拥有的一些代码:

mutual
  data ValueType : Set where
    ~ℕ      : ValueType
    ~If you write

rename ρ (⋆ E) = {!!}
mutual
数据值类型:在何处设置
~ℕ      : 值类型
如果你写的话~

renameₑ ρ E
看看洞里的上下文,你会发现
E
类型⊢ₑ .A
。使用
rename可以很容易地重命名ₑ

rename : ∀ {Γ Δ} → (∀ {A} → Γ ∋ A → Δ ∋ A)
       → (∀ {A} → Γ ⊢ A → Δ ⊢ A)
rename ρ (~ x) = ~ (ρ x)
rename ρ (⋆ E) = ⋆ (renameₑ ρ E)
rename ρ (✪ E) = ✪ (renameₖ ρ E)
其类型为
.Δ⊢ₑ .A
,只剩下应用
到结果,以获得
.Δ⊢ .A

基本思想是对一个术语进行模式匹配,找出它是值还是计算,应用相应的重命名函数,并使用相同的构造函数包装结果。例如,
rename
将值映射到值,将计算映射到计算,但在引擎盖下对这些判断使用不同的重命名函数

守则:


请包含一些类型检查的代码。如果您编写
重命名ρ怎么办(⋆ A) =⋆ (重命名)ₑ ρA)
?@user3237465我在寻找一个更高层次的答案,而不是让它进入打字检查的实际方法。但是这里有一些可以检查的东西,谢谢,所以我可以假设这是一种可以将Pretnar的lang形式化的好方法,那么?@JuGonçalves,我真的不懂这种语言。看起来不错。此外,我还将使用重命名。感谢链接,这很有趣,我将尝试这样做:)