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