我最近用证明语言(例如Agda)询问了what is the proper way to represent beta-equality。公认的答案指出了实现此目标的标准方法,即定义其一致性闭包
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''
如果我理解正确的话,它指定:1.应用程序(λx.t u)
等于t[u/x]
,2.应用程序的功能/参数或函数的主体可以替换为平等条款; 3.自反性,对称性和传递性保持。答案还提出了另一种选择:可以定义项之间的单步归约关系,然后定义多步归约关系,最后定义两个项是否相等,如果它们最终可以简化为相同项。这两种选择都有意义。
我在等待答案的时候,我在看这个定义:
data _~_ : Term → Term → Set where
refl : (a : Term) → a ~ a
red₁ : (a b : Term) → (f : Term → Term) → f a ~ b → f (redex a) ~ b
red₂ : (a b : Term) → (f : Term → Term) → a ~ f b → a ~ f (redex b)
amp₁ : (a b : Term) → (f : Term → Term) → f (redex a) ~ b → f a ~ b
amp₂ : (a b : Term) → (f : Term → Term) → a ~ f (redex b) → a ~ f b
如果redex a
是λ应用程序,则a
适用于单个替换。这表示术语是相同的,如果它们相同,或者可以通过减少/减少其任何子表达式来使它们相同。可以证明sym
,trans
,cong
:
sym : (a : Term) -> (b : Term) -> a ~ b -> b ~ a
trans : (a : Term) → (b : Term) → (c : Term) → a ~ b → b ~ c → a ~ c
cong : (f : Term → Term) → (a : Term) → (b : Term) → a ~ b → f a ~ f b
完整的资源可用here。现在,出于好奇,我想知道第三个解决方案是否也是有效的表示形式?如果是这样,它与前两个有什么关系?如果没有,为什么?
答案 0 :(得分:0)
此尝试的一个小问题是该关系不一致:
oops : var 0 ~ var 1
oops = red₂
(var 0)
(app id id)
(λ { (lam typ (var 0)) -> var 1; t -> var 0 })
(refl (var zero))
由于我们可以在b
上使用任意Agda函数,因此,只要我们将a
减少为b
,就可以将它们分开在Agda中进行替换,并以任意/非相等值替代。感谢Freenode IRC上#agda上的pgiarrusso指出了这一点。