agda - 表示 λ 项的 beta 等式类型的正确方法是什么?
问题描述
我正在寻找一种在 , 上被BetaEq
索引的类型a : Term
,b : Term
它可以在当且仅当且仅当的情况下被居住,或者如果它们可以在一系列 beta-reductionsa
后b
变成相同的术语。例如,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
Whereapply-redex
执行单个归约。但这看起来有点发明,所以我不确定这是否是正确的方法。请注意,这两个术语可能会有所不同,因此我们不能简单地考虑范式。表示 beta 等式的标准方法是什么?
解决方案
假设范围良好的无类型 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''
同余闭包是指最小的关系,即:
- 一种等价关系,即自反、对称和传递的关系。
- 关于术语构造函数的一致性,即归约可以发生在任何构造函数内部。
- 通过一步 beta 减少来暗示。
或者,您可以给出一个有向的归约概念,然后将可兑换性定义为归约为一个通用术语:
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 证明这种等价性相当困难,因为它需要显示归约的汇合。
推荐阅读
- c# - Visual Studio .NET 项目在更新后崩溃
- html - 使用 &hellip 在树枝对象内插入省略号字符
- c# - C# linq list 查找最接近的数字
- java - 意外将数据包含在不应包含的字符串中
- java - 使用 VisualVM 在同一台机器上监控 2 个应用程序
- nativescript - 如何使操作栏字体更大
- javascript - 使用 Spring 转义 HTML 中的撇号
- javascript - 为什么我在我的 AWS Lambda 函数中看不到这个 aws-sdk 函数?
- sql - 在 SQL 中,如何防止表中用户的重复值,而不是整个表?
- reactjs - 调度问题“类型参数”(调度:调度
) => 承诺 ' 不能分配给 'T' 类型的参数。”