Isabelle “如何修复”;代码方程式“左侧部分应用的常数”;?

Isabelle “如何修复”;代码方程式“左侧部分应用的常数”;?,isabelle,Isabelle,我试图定义代码等式: datatype t = A | B | C inductive less_t :: "t ⇒ t ⇒ bool" where "less_t A B" | "less_t B C" code_pred [show_modes] less_t . fun less_t_fun :: "t ⇒ t ⇒ bool" where "less_t_fun A A = False" | "less_t_fun A B = True" | "less_t_fun A C

我试图定义代码等式:

datatype t = A | B | C

inductive less_t :: "t ⇒ t ⇒ bool" where
  "less_t A B"
| "less_t B C"

code_pred [show_modes] less_t .

fun less_t_fun :: "t ⇒ t ⇒ bool" where
  "less_t_fun A A = False"
| "less_t_fun A B = True"
| "less_t_fun A C = True"
| "less_t_fun B C = True"
| "less_t_fun B _ = False"
| "less_t_fun C _ = False"

lemma tancl_less_t_code [code]:
  "less_t⇧+⇧+ x y ⟷ less_t_fun x y"
  apply (rule iffI)
  apply (erule tranclp_trans_induct)
  apply (erule less_t.cases; simp)
  apply (metis less_t_fun.elims(2) less_t_fun.simps(3) t.simps(4))
  apply (induct rule: less_t_fun.induct; simp)
  using less_t.intros apply auto
  done

value "less_t A B"
value "less_t_fun A C"
value "less_t⇧+⇧+ A C"
并得到以下警告:

Partially applied constant "less_t" on left hand side of equation, in theorem:
less_t⇧+⇧+ ?x ?y ≡ less_t_fun ?x ?y
这个问题与传递闭包无关。我已经收到了针对不同定理的警告:


我只需要理解这个警告的含义以及如何修复它。也许我应该定义一个不同的引理?

问题是引理的结构
tancl\u less\u t\u code
确实不适合作为代码方程。请注意,方程式左侧的最外层常量是传递闭包谓词
tranclp
。因此,这告诉代码生成器使用引理来实现
tranclp
。然而,使用引理只知道如何为一个特定谓词实现
tranclp
,即
less\t
。因此,Isabelle抱怨您的实施过于具体

至少有两种变通办法

首先,您可以使用
[code展开]
而不是声明。然后 在代码生成过程中,每次出现的
tranlp less\u t x y
都将被
less\u tu fun
替换。为了使这个规则更加适用,我将把引理重新表述为
tranclpless=less\u t\u fun
,这样即使
tranlp less_t
未完全应用,可能会发生展开

第二,你可以把引理的对称版本声明为
[simp]
。然后在您的实现中,您只需调用
less\t\u fun
,而不是
tranclpless\u t
在证明中,简化程序将切换到后一个

有关
[code]
[code\u unfold]
的更多信息,请查看
代码生成器的文档。

我没有答案,但是当删除
[code]
时,警告就会消失,因此它似乎与代码生成器有关。谢谢!我终于得到了它。我认为
less\t
本身是一个部分常量(部分应用函数或类似的东西)。我们也可以对对称引理使用
[code\u abbrev]
注释。