伊莎贝尔引理可以用来陈述关于定义的事实吗?
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 并且我只能为已经完成终止证明的函数声明引理(在函数声明时)?
是否可以更正(如果引理可以用于定义)我的引理以便它被接受并生成证明目标?
您提出的引理本身并没有错,这里唯一的问题是如何声明 a
和 b
的类型。
表达式 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"
我有伊莎贝尔的定义:
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 并且我只能为已经完成终止证明的函数声明引理(在函数声明时)?
是否可以更正(如果引理可以用于定义)我的引理以便它被接受并生成证明目标?
您提出的引理本身并没有错,这里唯一的问题是如何声明 a
和 b
的类型。
表达式 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"