如何解决Isabelle termination\u dom错误消息(避免递归定义两个参数max)?

如何解决Isabelle termination\u dom错误消息(避免递归定义两个参数max)?,isabelle,Isabelle,我试图在Isabelle中定义我自己的简单max函数,并证明其终止性: fun two_integer_max_case :: "nat ⇒ nat ⇒ nat" where "two_integer_max_case a b = (case a > b of True ⇒ a | False ⇒ b)" termination by auto 但终止证明中有一个未处理的目标: proof (prove) goal (1 subgoal): 1

我试图在Isabelle中定义我自己的简单max函数,并证明其终止性:

fun two_integer_max_case :: "nat ⇒ nat ⇒ nat" where
"two_integer_max_case a b = (case a > b of True ⇒ a | False ⇒ b)"

termination by auto
但终止证明中有一个未处理的目标:

proof (prove)
goal (1 subgoal):
 1. All two_integer_max_case_dom 
Ignoring duplicate rewrite rule:
two_integer_max_case ?a1 ?b1 ≡ case ?b1 < ?a1 of True ⇒ ?a1 | False ⇒ ?b1 
Duplicate fact declaration "Max_Of_Two_Integers.two_integer_max_case.simps" vs. "Max_Of_Two_Integers.two_integer_max_case.simps"⌂ 
Failed to finish proof⌂:
goal (1 subgoal):
 1. ⋀a b. two_integer_max_case_dom (a, b)
这是什么意思?对我有什么要求?此
…\u dom
条件。我在哪里能读到这些

我已经阅读了的第3.5章,现在我正在阅读关于域谓词的第8.1章。嗯,我希望我能找到解决办法

我知道,如果我能够设法给出max函数的递归定义(两个自然类型参数),事情就会变得容易(至少在终止证明中是这样)。但我还没有找到这样的定义(我想基础理论中已经有了一些创造性的定义)我不确定我是否会对递归定义感到满意,因为我的目的是从这个my函数生成Haskell或Scala代码,我更希望这个代码不是递归的,而是使用相应语言的标准
less
equality
运算符


好吧,这可能是我与Isabelle的代码合成的问题-如果Isabelle更喜欢算法构造的递归定义,而工业编程风格(不管是什么)不需要递归,那么生成的代码的可维护性和人类理解能力可能会更低(在人工智能进入程序合成领域之前仍然是一个问题).

使用
fun
时无需证明终止,因为此Isabelle命令仅在能够自动证明终止的情况下接受函数定义。因此,您的
终止
-命令根本不需要,实际上会混淆系统,因为它已经证明了终止

只有在使用
功能
而不是
乐趣
时,您才需要在之后手动证明
终止

希望这有帮助,勒内

Failed to finish proof⌂:
goal (1 subgoal):
1. ⋀a b. two_integer_max_case_dom (a, b)