我正在寻找在BetaEq
,a : Term
上建立索引的b : Term
类型,如果a
和b
相同,或者如果经过一系列的beta降低,它们可以变成相同的术语。例如,假设id = (lam (var 0))
,a = (app id (app id id))
和b = (app (app id id) id)
;那么我们应该能够构造类型BetaEq a b
的术语,因为双方都可以简化为(app id id)
。我已经尝试过了:
data BetaEq : (a : Term) -> (b : Term) -> Set where
refl : (a : Term) -> BetaEq a a
redl : (a : Term) -> (b : Term) -> BetaEq (apply-redex a) b -> BetaEq a b
redr : (a : Term) -> (b : Term) -> BetaEq a (apply-redex b) -> BetaEq a b
apply-redex
执行一次归约。但这看起来有点发明,所以我不确定这是否是正确的方法。请注意,这两个术语可能会有所不同,因此我们不能简单地考虑普通形式。表示Beta平等的标准方法是什么?
答案 0 :(得分:2)
假设范围广泛的无类型lambda项:
open import Data.Fin
open import Data.Nat
data Tm (n : ℕ) : Set where
var : Fin n → Tm n
app : Tm n → Tm n → Tm n
lam : Tm (suc n) → Tm n
还有最外层变量的单次替换的定义(但请注意,就并行替换而言定义单次替换总是更好的选择):
sub : ∀ {n} → Tm n → Tm (suc n) → Tm n
然后,beta相等是beta缩减的等价闭合:
data _~_ {n} : Tm n → Tm n → Set where
β : ∀ {t u} → app (lam t) u ~ sub u t
app : ∀ {t t' u u'} → t ~ t' → u ~ u' → app t u ~ app t' u'
lam : ∀ {t t'} → t ~ t' → lam t ~ lam t'
~refl : ∀ {t} → t ~ t
~sym : ∀ {t t'} → t ~ t' → t' ~ t
~trans : ∀ {t t' t''} → t ~ t' → t' ~ t'' → t ~ t''
通过全等闭包,我们表示的最小关系是:
或者,您可以给出直接的归约概念,然后将可转换性定义为归约的通用术语:
open import Data.Product
open import Relation.Binary.Closure.ReflexiveTransitive
-- one-step reduction
data _~>_ {n} : Tm n → Tm n → Set where
β : ∀ {t u} → app (lam t) u ~> sub u t
app₁ : ∀ {t t' u} → t ~> t' → app t u ~> app t' u
app₂ : ∀ {t u u'} → u ~> u' → app t u ~> app t u'
lam : ∀ {t t'} → t ~> t' → lam t ~> lam t'
-- multi-step reduction as reflexive-transitive closure
_~>*_ : ∀ {n} → Tm n → Tm n → Set
_~>*_ = Star _~>_
_~_ : ∀ {n} → Tm n → Tm n → Set
t ~ u = ∃ λ t' → (t ~>* t') × (u ~>* t')
取决于哪个版本更方便。两种定义是相同的情况,但是AFAIK证明这种等效性相当困难,因为它要求显示confluence的约简。