我在一个简单的库中工作,其中包含有关简单类型替换的定义和属性。我对类型使用以下编码:
data Ty (n : Nat) : Set where
var : Fin n -> Ty n
con : Ty n
app : Ty n -> Ty n -> Ty n
所以,因为变量表示为有限集,所以替换只是向量:
Subst : Nat -> Nat -> Set
Subst n m = Vec (Ty m) n
完整开发包含以下粘贴:http://lpaste.net/107751
使用这种编码,我已经定义了几个关于这种替换的引理,但我不知道如何定义一个定义指定替换是幂等的定理。我相信我必须使用弱化等属性来表达这一点,但我无法弄清楚如何。
有人可以提供任何指示或线索吗?
提前致谢。
答案 0 :(得分:1)
在新变量上产生表达式的替换确实是幂等的。但是为了表达这个定理,你必须考虑将你的替换Subst n m
作为联合变量集Subst (n + m) (n + m)
的一个。以下是使用任意变量集A
和B
而非Fin n
和Fin m
的变体。
open import Relation.Binary.PropositionalEquality using (_≡_; refl)
-- Disjoint union.
data _+_ (A B : Set) : Set where
left : A → A + B
right : B → A + B
-- A set of variable names can be any type.
Names = Set
-- Simple expressions over a set of names.
data Tm (A : Names) : Set where
var : A → Tm A
app : Tm A → Tm A → Tm A
-- Substitute all variables from set A by terms over a name set B.
Subst : Names → Names → Set
Subst A B = A → Tm B
subst : ∀{A B} → Subst A B → Tm A → Tm B
subst σ (var x) = σ x
subst σ (app t u) = app (subst σ t) (subst σ u)
-- Rename all variables from set A to names from set B.
Rename : Names → Names → Set
Rename A B = A → B
rename : ∀{A B} → Rename A B → Tm A → Tm B
rename σ (var x) = var (σ x)
rename σ (app t u) = app (rename σ t) (rename σ u)
-- In order to speak about idempotency of substitutions whose domain A
-- is disjoint from the variable set B used in the range, we have to promote
-- them to work on the union A+B of variable sets.
-- The promoted substitution is the identity on B,
-- and the original substitution on A, but with the result transferred from B to A + B.
promote : ∀{A B} → Subst A B → Subst (A + B) (A + B)
promote σ (left x) = rename right (σ x)
promote σ (right x) = var (right x)
module _ {A B : Set} (σ₀ : Subst A B) where
-- Now assume a promoted substitution.
σ = promote σ₀
-- A promoted substitution has no effect on terms with variables only in B.
lemma : ∀ t → subst σ (rename right t) ≡ rename right t
lemma (var x) = refl
lemma (app t u) rewrite lemma t | lemma u = refl
-- Hence, it is idempotent.
idempotency : ∀ x → subst σ (σ x) ≡ σ x
idempotency (right x) = refl
idempotency (left x) = lemma (σ₀ x)