我需要使用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])"
返回异常:
exception Fail raised (line 29 of "generated code"): Finite_Set.fold
是否可以针对特定操作(plus
)和类型(nat
)使用专门的代码等式?
答案 0 :(得分:1)
我不太确定你想要实现,但请注意 Finite_Set.fold 是一个低级构造,其他具有实际可用属性的操作只能通过相当大的努力得到,cf 。理论 src / HOL / Finite_Set.thy 和 src / HOL / Groups_Big.thy 这是一个粗略的想法。
对于有限集和列表的求和,有 sum 和 sum_list 已经配备了代码方程。