通过 Agda 中的函数自动解决隐式参数?
Auto solve implicit arguments by a function in Agda?
假设我有一个已证明的引理“显而易见”,它说明每个类型也是可解的。
obvious : ∀ {A : Type} → Solvable A
obvious = one-proof
我有一个引理“微不足道”,不知何故需要类型 A 和可解 p(取决于 A),
trivial : ∀ {A : Type} {p : Solvable A} → A <: Top
trivial = another-proof
每次我想使用这个“琐碎的”引理时,我可能需要明确地写出参数 A 和 p
trivial {A} {obvious A}
写那些证明很无聊,因为A可以推断,但是p不能,因为类型检查器不知道我的“明显”引理,所以我需要一遍又一遍地写。
如何避免这种情况?
事实上我已经尝试了两次:
尝试 1
删除参数 p 并使用 with-abstraction 创建直接参数。
trivial : ∀ {A : Type} → A <: Top
trivial {A} with obvious A
... | branch = another-proof
它没有解决我的问题,因为实际上我需要对 p 进行一些归纳,然后使用 p 的子结构递归调用“平凡”函数。 Agda 终止检查器会抱怨它。
尝试 2
根据 Agda 文档的建议,使用 @tactic。但是我找不到更多关于它的用法的信息,有人可以解释一下吗?
啊哈,函数组合的答案提示了我
trivial : ∀ {A : Type} → A <: Top
trivial {A} = trivial-verbose {A} {obvious A}
where
trivial-verbose : ∀ {A : Type} {p : Solvable A} → A <: Top
trivial-verbose = another-proof
那么我们总是可以使用“trivial”而不显式地写参数。
假设我有一个已证明的引理“显而易见”,它说明每个类型也是可解的。
obvious : ∀ {A : Type} → Solvable A
obvious = one-proof
我有一个引理“微不足道”,不知何故需要类型 A 和可解 p(取决于 A),
trivial : ∀ {A : Type} {p : Solvable A} → A <: Top
trivial = another-proof
每次我想使用这个“琐碎的”引理时,我可能需要明确地写出参数 A 和 p
trivial {A} {obvious A}
写那些证明很无聊,因为A可以推断,但是p不能,因为类型检查器不知道我的“明显”引理,所以我需要一遍又一遍地写。
如何避免这种情况?
事实上我已经尝试了两次:
尝试 1
删除参数 p 并使用 with-abstraction 创建直接参数。
trivial : ∀ {A : Type} → A <: Top
trivial {A} with obvious A
... | branch = another-proof
它没有解决我的问题,因为实际上我需要对 p 进行一些归纳,然后使用 p 的子结构递归调用“平凡”函数。 Agda 终止检查器会抱怨它。
尝试 2
根据 Agda 文档的建议,使用 @tactic。但是我找不到更多关于它的用法的信息,有人可以解释一下吗?
啊哈,函数组合的答案提示了我
trivial : ∀ {A : Type} → A <: Top
trivial {A} = trivial-verbose {A} {obvious A}
where
trivial-verbose : ∀ {A : Type} {p : Solvable A} → A <: Top
trivial-verbose = another-proof
那么我们总是可以使用“trivial”而不显式地写参数。