伊莎贝尔理论 'Variable "return" occurs on right hand side only'

Isabelle theory 'Variable "return" occurs on right hand side only'

我正在尝试为该算法创建我的第一个 Isabelle/HOL 理论,该算法来自两个整数的计算机最大整数。我的意图是将算法形式化,这是初步的尝试。这就是为什么我试图让我的 Isabelle 代码与平常的代码相似。 C。 “工业编程语言”或尽可能使用算法风格的代码。所以 - 没有太多使用 Isabelle 喜欢的默认 primrec 和递归定义(具有匹配和分支)。我提出了理论:

theory Max_Of_Two_Integers
  imports Main
begin

function two_integer_max :: "nat ⇒ nat ⇒ nat"
where
  "two_integer_max first second =
     (if (first > second)  then
        return first
      else
        return second)"

end

但是 function 关键字出现错误信息:

Variable "return" occurs on right hand side only:
⋀first second return.
   two_integer_max first second =
   (if second < first then return first else return second)

我正在密切关注非常复杂的算法 https://isabelle.in.tum.de/library/HOL/HOL-Imperative_HOL/Imperative_Quicksort.html 的模式,并且它使用了 return,正如在通常的编程中预期的那样。

所以 - 我的 return 命令有什么问题以及如何更正它?

此外,为了使这个理论完整,我必须证明终止(关于函数性质的定理不是强制性的,但我会添加它们)。

Isabelle 教程主要使用 primrec 函数的递归定义和模式匹配。我选择了具有灵活性的功能(我的猜测)。

除了教程之外,博客 post https://www.joachim-breitner.de/blog/732-Isabelle_functions__Always_total%2C_sometimes_undefined 是 Isabelle 的绝佳函数指南 - 但很奇怪 - 它没有提供带有 return 关键字的示例,尽管 - 作为在 Imperative_Quicksort 示例中可以看到,functionreturn 是有效的结构。

return 特定于在命令式 HOL 中编写命令式算法(这是 Quicksort 实现所使用的)。 do 符号也是如此。您收到该错误消息的原因是您没有导入 Imperative HOL。

命令式 HOL 本质上是一个允许您编写修改堆的命令式程序的库。这就是为什么那个例子中 quicksort 的 return 类型不是列表或数组,而是 unit Heap。 (但即使你有,你仍然会收到一条错误消息,因为你 returning a nat 而不是 Heap)。

如果您刚开始使用 Isabelle,我强烈 建议暂时不要对 Imperative HOL 做任何事情。相反,您应该从“普通”Isabelle 开始,它使用函数式风格来定义事物。 Concrete Semantics 这本书的前半部分很好地介绍了伊莎贝尔,该书可在线免费获得。