如何设置有限集操作的代码?

时间:2017-10-13 17:04:50

标签: isabelle

以下表达式评估正确:

value "foldr plus [1::nat, 2] 0"

但是以下表达式:

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

提出错误:

Wellsortedness error:
Type nat not of sort finite
No type arity nat :: finite

我知道nat不是有限的。所以nat set也不是有限的。

但是可以为这些函数定义代码方程吗?我想证明一个。但我被困住了:

lemma finite_set_fold_code [code]:
  "comp_fun_commute f ⟹
   Finite_Set.fold f x (set xs) = foldr f xs x"
  apply (rule Finite_Set.comp_fun_commute.fold_equality)
  apply simp
  apply (induct xs arbitrary: x)
  apply (simp add: Finite_Set.fold_graph.emptyI)
  apply auto
  apply (rule Finite_Set.fold_graph.insertI)

更新

引理不成立且无法证实。必须从列表中删除重复项。

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

lemma finite_set_nat_plus [code]:
  "Finite_Set.fold plus (y :: nat) (set xs) = fold plus (remdups xs) y"
  by (simp add: nat_plus_commute.fold_set_fold_remdups)

但我收到以下警告:

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

仍然无法评估表达。

更新2:

实际上我可以使用schematic_goal评估它:

schematic_goal g1:
  "Finite_Set.fold plus 0 (set [1::nat, 2]) = ?x"
  by (simp add: nat_plus_commute.fold_set_fold_remdups)

thm g1

我应该如何使用value评估它?

0 个答案:

没有答案