代码等式左侧的部分应用常数

Partially applied constant on left hand side of code equation

我需要使用 nat_plus_commute.fold_set_fold_remdups 代码方程而不是 Finite_Set.fold_def:

interpretation nat_plus_commute: comp_fun_commute "plus :: nat ⇒ nat ⇒ nat"
  by standard auto

declare Finite_Set.fold_def [code del]
declare nat_plus_commute.fold_set_fold_remdups [code]

问题是第一个方程仅为 plus 运算定义,因此我收到以下警告:

Partially applied constant "Groups.plus_class.plus" on left hand side of equation, in theorem:
Finite_Set.fold op + ?y (set ?xs) ≡ fold op + (remdups ?xs) ?y

作为以下语句的结果

value "Finite_Set.fold plus 0 (set [1::nat, 2])"

returns异常:

exception Fail raised (line 29 of "generated code"): Finite_Set.fold

是否可以针对特定操作 (plus) 和类型 (nat) 使用专门的代码方程?

我不太确定你想要实现,但请注意 Finite_Set.fold 是一个低级构造,其他具有实际可用属性的操作只能得到相当大的努力,cf。理论 src/HOL/Finite_Set.thysrc/HOL/Groups_Big.thy 一个粗略的想法。

对于有限集和列表的求和,有sumsum_list已经配备了代码方程。