伊莎贝尔引理可以用来陈述关于定义的事实吗?

Can Isabelle lemma be used for stating fact about definition?

我有伊莎贝尔的定义:

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

有输出

consts
  two_integer_max_case_def :: "nat ⇒ nat ⇒ nat

我可以从这个定义中得到值:

value "two_integer_max_case_def 3 4"

输出:

"4"
  :: "nat"

所以,这是可以识别和正确的 expression/term。但我试图用这个定义来声明引理:

lemma spec_1:
  assumes "a: nat" "b: nat" "a > b"
  shows "two_integer_max_case_def a b = a"

不幸的是,这个引理没有被接受(没有生成 goals/subgoals)而是给出了错误信息:

Type unification failed: Clash of types "_ ⇒ _" and "_ set"

Type error in application: incompatible operand type

Operator:  (∈) a :: ??'a set ⇒ bool
Operand:   nat :: int ⇒ nat

我的引理有什么问题?我只是使用了不正确的相等操作(也许有一些微妙之处——nat 实例与 nat 集的混淆)还是更普遍的问题?也许我不允许为(可能终止的)定义声明 theorems/lemmas 并且我只能为已经完成终止证明的函数声明引理(在函数声明时)?

是否可以更正(如果引理可以用于定义)我的引理以便它被接受并生成证明目标?

您提出的引理本身并没有错,这里唯一的问题是如何声明 ab 的类型。

表达式 a: nat 被解释为 a ∈ nat,这会产生类型错误。您看到的错误消息说 运算符的第二个参数 nat 应该是 'a set 类型,但实际上是 int => nat.

为了在引理中声明变量类型,您可以使用 fixes 关键字,如下所示。

lemma spec_1:
  fixes a :: nat and b :: nat
  assumes "a > b"
  shows "two_integer_max_case_def a b = a"