将β等式表示为全等闭式和表示子替换之间是否存在任何关系?

时间:2019-02-28 23:08:30

标签: agda

代表阿格达中的beta平等

我最近用证明语言(例如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适用于单个替换。这表示术语是相同的,如果它们相同,或者可以通过减少/减少其任何子表达式来使它们相同。可以证明symtranscong

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。现在,出于好奇,我想知道第三个解决方案是否也是有效的表示形式?如果是这样,它与前两个有什么关系?如果没有,为什么?

1 个答案:

答案 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指出了这一点。