Isabelle 如何生成反向排序的代码

Isabelle 如何生成反向排序的代码,isabelle,Isabelle,为排序算法生成代码的最简单方法是什么?排序算法在现有List.sort的基础上按相反顺序对参数进行排序 我提出了两个解决方案,如下所示。但这两个都不太令人满意 还有其他的想法吗?我想出了两个可能的解决方案。但两者都有严重的缺点。我希望几乎自动地获得结果 介绍Haskell样式的新类型。例如,如果我们想对NAT列表进行排序,比如 datatype 'a new = New (old : 'a) instantiation new :: (linorder) linorder begin def

为排序算法生成代码的最简单方法是什么?排序算法在现有List.sort的基础上按相反顺序对参数进行排序

我提出了两个解决方案,如下所示。但这两个都不太令人满意


还有其他的想法吗?

我想出了两个可能的解决方案。但两者都有严重的缺点。我希望几乎自动地获得结果

介绍Haskell样式的新类型。例如,如果我们想对NAT列表进行排序,比如

datatype 'a new = New (old : 'a)

instantiation new :: (linorder) linorder
begin

definition "less_eq_new x y ⟷ old x ≥ old y"
definition "less_new x y ⟷ old x > old y"

instance by (default, case_tac [!] x) (auto simp: less_eq_new_def less_new_def)

end
此时

value [code] "sort_key New [0::nat, 1, 0, 0, 1, 2]" 
生成所需的反向排序。虽然这相对容易,但它并不像我希望的解决方案那样自动化,而且由于Isabelle没有Haskell的newtype,因此运行时开销较小

通过线性顺序的对偶的区域设置。首先,我们或多或少地复制现有代码以进行插入排序,但我们不依赖类型类,而是显式地使用表示比较的参数

fun insort_by_key :: "('b ⇒ 'b ⇒ bool) ⇒ ('a ⇒ 'b) ⇒ 'a ⇒ 'a list ⇒ 'a list"
where
  "insort_by_key P f x [] = [x]"
| "insort_by_key P f x (y # ys) =
    (if P (f x) (f y) then x # y # ys else y # insort_by_key P f x ys)"

definition "revsort_key f xs = foldr (insort_by_key (op ≥) f) xs []"
现在我们有了revsort_键的代码

但是,我们还需要所有已经在linorder语言环境中得到证明的好结果,这些语言环境是从linorder类派生的。为此,我们引入了线性顺序的对偶,并使用了mixin,但不确定我是否在这里使用了正确的命名来替换所有出现的linorder.sort_键,它不允许通过新的代码常量revsort_键生成代码

虽然使用此解决方案时,我们没有任何运行时惩罚,但对我来说,它过于冗长,并且不容易适应标准代码设置中的更改,例如,如果我们希望在所有排序操作中使用来自的mergesort实现

value [code] "revsort_key id [0::nat, 1, 0, 0, 1, 2]"
interpretation dual_linorder!: linorder "op ≥ :: 'a::linorder ⇒ 'a ⇒ bool" "op >"
where
  "linorder.sort_key (op ≥ :: 'a ⇒ 'a ⇒ bool) f xs = revsort_key f xs"
proof -
  show "class.linorder (op ≥ :: 'a ⇒ 'a ⇒ bool) (op >)" by (rule dual_linorder)
  then interpret rev_order: linorder "op ≥ :: 'a ⇒ 'a ⇒ bool" "op >" .
  have "rev_order.insort_key f = insort_by_key (op ≥) f"
    by (intro ext) (induct_tac xa; simp)  
  then show "rev_order.sort_key f xs = revsort_key f xs"
    by (simp add: rev_order.sort_key_def revsort_key_def)
qed