Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在列表中使用“独特”的更快代码_Scala_Optimization_Code Generation_Isabelle - Fatal编程技术网

Scala 在列表中使用“独特”的更快代码

Scala 在列表中使用“独特”的更快代码,scala,optimization,code-generation,isabelle,Scala,Optimization,Code Generation,Isabelle,这个问题涉及使用Isabelle/HOL定理证明器生成代码 当我为列表上的distinct函数导出代码时 export_code distinct in Scala file - 我得到以下代码 def member[A : HOL.equal](x0: List[A], y: A): Boolean = (x0, y) match { case (Nil, y) => false case (x :: xs, y) => HOL.eq[A](x, y) || member

这个问题涉及使用Isabelle/HOL定理证明器生成代码

当我为列表上的distinct函数导出代码时

export_code distinct in Scala file -
我得到以下代码

def member[A : HOL.equal](x0: List[A], y: A): Boolean = (x0, y) match {
  case (Nil, y) => false
  case (x :: xs, y) => HOL.eq[A](x, y) || member[A](xs, y)
}

def distinct[A : HOL.equal](x0: List[A]): Boolean = x0 match {
  case Nil => true
  case x :: xs => ! (member[A](xs, x)) && distinct[A](xs)
}
此代码具有二次运行时。有更快的版本吗?在我的理论开始时,我想到了一些类似于为字符串导入~~/src/HOL/Library/Code_Char的东西,并为列表建立了高效的代码生成。 distinct更好的实现是在日志n中对列表进行排序,并在列表上迭代一次。但我想一个人可以做得更好


不管怎么说,是否有一种更快的方法来实现Main中的distinct和其他功能?

我不知道在Isabelle2013的库中有任何更快的方法,但您可以按照如下方式轻松实现:

context linorder begin
fun distinct_sorted :: "'a list => bool" where
  "distinct_sorted [] = True"
| "distinct_sorted [x] = True"
| "distinct_sorted (x#y#xs) = (x ~= y & distinct_sorted (y#xs))"

lemma distinct_sorted: "sorted xs ==> distinct_sorted xs = distinct xs"
  by(induct xs rule: distinct_sorted.induct)(auto simp add: sorted_Cons)
end

lemma distinct_sort [code]: "distinct xs = distinct_sorted (sort xs)"
 by(simp add: distinct_sorted)
实现一个函数distinct_sorted,用于确定已排序列表的差异性。 证明distinct_sorted确实在排序列表上实现了distinct 证明一个通过distinct_列表和排序实现distinct的引理,并将其声明为distinct的新代码等式。 总之,情况如下:

context linorder begin
fun distinct_sorted :: "'a list => bool" where
  "distinct_sorted [] = True"
| "distinct_sorted [x] = True"
| "distinct_sorted (x#y#xs) = (x ~= y & distinct_sorted (y#xs))"

lemma distinct_sorted: "sorted xs ==> distinct_sorted xs = distinct xs"
  by(induct xs rule: distinct_sorted.induct)(auto simp add: sorted_Cons)
end

lemma distinct_sort [code]: "distinct xs = distinct_sorted (sort xs)"
 by(simp add: distinct_sorted)
接下来,您需要一个高效的排序算法。默认情况下,排序使用插入排序。如果从HOL/Library导入Multiset,则排序将通过快速排序实现。如果你从正式校样档案中导入,你会得到合并排序

虽然这可以提高效率,但也有一个障碍:在上述声明之后,您只能在元素为类型类linorder实例的列表上执行distinct。由于这种细化只发生在代码生成器中,因此您在Isabelle中的定义和定理不受影响


例如,要将distinct应用于任何代码等式中的列表列表,首先必须在列表上定义线性顺序:HOL/Library中的list_lexord通过选择字典顺序来实现,但这需要元素的线性顺序。如果您想使用字符串,它是char list的缩写,char\u ord定义了char的通常顺序。如果您将字符映射到目标语言的字符类型(使用Code_Char),那么您还需要使用自适应理论Code_Char_ord与Char_ord进行组合

我不知道在Isabelle2013的库中有任何更快的实现,但您可以按如下方式轻松实现:

context linorder begin
fun distinct_sorted :: "'a list => bool" where
  "distinct_sorted [] = True"
| "distinct_sorted [x] = True"
| "distinct_sorted (x#y#xs) = (x ~= y & distinct_sorted (y#xs))"

lemma distinct_sorted: "sorted xs ==> distinct_sorted xs = distinct xs"
  by(induct xs rule: distinct_sorted.induct)(auto simp add: sorted_Cons)
end

lemma distinct_sort [code]: "distinct xs = distinct_sorted (sort xs)"
 by(simp add: distinct_sorted)
实现一个函数distinct_sorted,用于确定已排序列表的差异性。 证明distinct_sorted确实在排序列表上实现了distinct 证明一个通过distinct_列表和排序实现distinct的引理,并将其声明为distinct的新代码等式。 总之,情况如下:

context linorder begin
fun distinct_sorted :: "'a list => bool" where
  "distinct_sorted [] = True"
| "distinct_sorted [x] = True"
| "distinct_sorted (x#y#xs) = (x ~= y & distinct_sorted (y#xs))"

lemma distinct_sorted: "sorted xs ==> distinct_sorted xs = distinct xs"
  by(induct xs rule: distinct_sorted.induct)(auto simp add: sorted_Cons)
end

lemma distinct_sort [code]: "distinct xs = distinct_sorted (sort xs)"
 by(simp add: distinct_sorted)
接下来,您需要一个高效的排序算法。默认情况下,排序使用插入排序。如果从HOL/Library导入Multiset,则排序将通过快速排序实现。如果你从正式校样档案中导入,你会得到合并排序

虽然这可以提高效率,但也有一个障碍:在上述声明之后,您只能在元素为类型类linorder实例的列表上执行distinct。由于这种细化只发生在代码生成器中,因此您在Isabelle中的定义和定理不受影响


例如,要将distinct应用于任何代码等式中的列表列表,首先必须在列表上定义线性顺序:HOL/Library中的list_lexord通过选择字典顺序来实现,但这需要元素的线性顺序。如果您想使用字符串,它是char list的缩写,char\u ord定义了char的通常顺序。如果您将字符映射到目标语言的字符类型(使用Code_Char),那么您还需要使用自适应理论Code_Char_ord与Char_ord进行组合

并描述了我如何告诉isabelle字符串是一个linorder。现在,distinct[a,b]可以正常工作。完成文件和相应字符串的转储以使字符串成为linorder实例,只需从HOL/Library导入List_lexord和Char_ord即可。Char\u ord提供了nibble和Char的线性顺序。您还需要来自HOL/Library的适应理论代码Char\u ord,用于组合代码Char和Char\u ordWorks:您能编辑您的帖子并总结我们的评论讨论吗?现在我导入List_lexord、Product_ord、Code_Char、Code_Char_chr和Code_Char_ord,并描述如何告诉isabelle字符串是一个linorder。现在,distinct[a,b]可以正常工作。完成文件和相应字符串的转储以使字符串成为linorder实例,只需从HOL/Library导入List_lexord和Char_ord即可。Char\u ord提供了nibble和Char的线性顺序。您还需要来自HOL/Library的适应理论代码Char\u ord,用于组合代码Char和Char\u ordWorks:您能编辑您的帖子并总结我们的评论讨论吗?我现在导入列表、产品、代码、代码、字符和代码。