将 Coq 定义转化为现实?

Translating Coq Definitions to agda?

我想知道是否有系统的方法将 Coq 定义解释为 agda 程序。我正在翻译部分编程基础,但无法让 tUpdate 函数在下面工作。为什么会失败。 coq代码有注释

--Definition total_map (A : Type) := string -> A.

totalMap : Set → Set
totalMap A = String → A

-- Definition t_empty {A : Type} (v : A) : total_map A :=
-- (fun _ => v).

tEmpty : {A : Set} (v : A) → totalMap A
tEmpty = λ v x → v

-- Definition t_update {A : Type} (m : total_map A)
-- (x : string) (v : A) :=
-- fun x' => if eqb_string x x' then v else m x'.

tUpdate : {A : Set} (m : totalMap A) (x : String) (v : A) → Set 
tUpdate m x v = λ x' → (if (x == x') then v else m x')

lambda 项产生以下错误

(x' : String) → A !=< Set of type Set
when checking that the expression
λ x' → if x == x' then v else m x' has type Set

这是进行此翻译的正确通用架构吗,例如,此翻译是否可靠且完整?

编辑:

我意识到更新应该 return 一张地图,但我很困惑,因为 coq 似乎可以推断出这一点,而 agda 不能?我仍然欢迎对后一个问题给出更笼统的回答。

tUpdate : {A : Set} (m : totalMap A) (x : String) (v : A) → totalMap A
tUpdate m x v = λ x' → (if (x == x') then v else m x') 

Coq 和 Agda 都基于非常粗略 相同的依赖类型理论,因此理论上可以采用 Coq 脚本生成的证明项并将其翻译进入 Agda 程序。然而,有许多小的(不是那么小的)差异,例如Coq 的 impredicative Prop、累积性、终止检查器的差异等,将使这样的翻译变得困难或不可能。

但是,您在这里要求的并不是真正的自动翻译器,而是一套手动将 Coq 翻译成 Agda 的规则。由于许多基本特征可以一对一映射,因此这个过程要简单得多。然而,在 Coq 代码中使用任何策略,你要么必须在 Agda 中转换为一个明确的证明项,要么编写你自己的 Agda 反射宏(因为 Agda 还没有完整的策略库)。

回答你在这里遇到的具体问题:Agda 没有尝试推断 tUpdate 函数的 return 类型,因为你自己已经指定它是 Set 。如果你想让 Agda 为你推断它,你可以简单地用下划线 _ 替换 return 类型(在这种情况下工作正常):

tUpdate : {A : Set} (m : totalMap A) (x : String) (v : A) → _
tUpdate m x v = λ x' → (if (x == x') then v else m x')