Types 与提升和设置达成一致ω;,和表达式中的变量引用
在a中,我有一个玩具语言的类型Types 与提升和设置达成一致ω;,和表达式中的变量引用,types,polymorphism,expression,semantics,agda,Types,Polymorphism,Expression,Semantics,Agda,在a中,我有一个玩具语言的类型 data Type : Set where Nat : Type Prp : Type 我想用不相交的并集来解释它们 类型→ 设置⊎ 设置₁,但思想层面的提升将是最好的 并得到了帮助 ⟦_⟧ₜ : Type → Set₁ ⟦ Nat ⟧ₜ = Lift ℕ ⟦ Prp ⟧ₜ = Set 现在假设我的玩具语言有变量和表达式 data Variable : Type → Set where x y : ∀ {t} → Variable t data
data Type : Set where
Nat : Type
Prp : Type
我想用不相交的并集来解释它们
类型→ 设置⊎ 设置₁代码>,但思想层面的提升将是最好的
并得到了帮助
⟦_⟧ₜ : Type → Set₁
⟦ Nat ⟧ₜ = Lift ℕ
⟦ Prp ⟧ₜ = Set
现在假设我的玩具语言有变量和表达式
data Variable : Type → Set where
x y : ∀ {t} → Variable t
data Expr : Type → Set₁ where
Var : ∀ {t} (v : Variable t) → Expr t -- varaible symbols
Recall that Set₁ ∋ Lift ℕ ∋ ⟦ e ⟧ₑ σ
and Set α ∋ (Set α ∋ A ∋ x) ≡ (Set α ∋ A ∋ y)
, where _∋_
is from the Function
module:
infixl 0 _∋_
_∋_ : ∀ {a} (A : Set a) → A → A
A ∋ x = x
数据变量:类型→ 设定地点
x y:∀ {t}→ 变量t
数据表达式:类型→ 设置₁ 哪里
变量:∀ {t} (v:变量t)→ Expr t——可变符号
回想一下Set₁ ∋ 举起ℕ ∋ ⟦ E⟧ₑ σ
和设置α∋ (集α∋ A.∋ 十)≡ (集α∋ A.∋ y)
,其中_∋_代码>来自功能
模块:
⟦_⟧ₑ (e ≈ e₁) σ = lower (⟦ e ⟧ₑ σ) ≡ lower (⟦ e₁ ⟧ₑ σ)
因此表达式⟦ E⟧ₑ σ ≡ ⟦ E₁ ⟧ₑ σ
位于集合中₁代码>(因为⟦ E⟧ₑ σ
和⟦ E₁ ⟧ₑ σ
位于集合中₁代码>),而您需要它位于集合中。你可以写
data _≡′_ {a} {A : Set a} (x : A) : A → Set where
refl′ : x ≡′ x
或重新定义_≡_代码>利用一项新功能,允许“强制执行”仅出现在数据类型的参数和索引类型中的级别:
⟦_⟧ₑ (e ≈ e₁) σ = ⟦ e ⟧ₑ σ ≡′ ⟦ e₁ ⟧ₑ σ
注意Set
而不是Set a
。那就是
我会选择第一个选项
您的\u不在ₙ_因为e
可以是Var v
和e[v/Var v]≡ E
无论v
是否出现在E
中。为什么不将\u not-occurrents-in
定义为数据类型?顺便说一句,我认为将替换发音为E[v]更为标准≔ e]
或[e/v]e
您可以从\u not-in-in转到₀_代码>到\u不发生在₁_代码>如下所示:
+-inj:∀ {E₁ E₂ E₃ E₄} -> E₁ + E₂ ≡ E₃ + E₄ -> E₁ ≡ E₃ ×E₂ ≡ E₄
+-inj refl=refl,refl
≈-inj:∀ {E₁ E₂ E₃ E₄} -> E₁ ≈ E₂ ≡ E₃ ≈ E₄ -> E₁ ≡ E₃ ×E₂ ≡ E₄
≈-inj refl=refl,refl
coe:∀ {ts}{v:变量t}→ (E:Expr s)→ v不出现在₀ E→ v不出现在₁ E
coe{t}{v}(Var w)q{e}重写q{e}=refl
科(