Isabelle 访问数据类型的元素

Isabelle 访问数据类型的元素,isabelle,isar,Isabelle,Isar,在Isabelle中是否可以访问数据类型的各个元素?假设我有以下数据类型: datatype foo = mat int int int int 和(例如,在引理中) 是否可以访问一个数据库的单个元素?或者,修复单个元素(fixabcd::int),然后将a定义为matabcd 在逻辑级别上,您可以使用case语法来解构数据类型(即mat a b c d的case a)⇒ …)。您还可以使用fun或primrec定义自己的投影函数,例如: primrec foo1 where "foo1 (

在Isabelle中是否可以访问数据类型的各个元素?假设我有以下数据类型:

datatype foo = mat int int int int 
和(例如,在引理中)


是否可以访问一个数据库的单个元素?或者,修复单个元素(
fixabcd::int
),然后将
a
定义为
matabcd

在逻辑级别上,您可以使用
case
语法来解构数据类型(即mat a b c d的
case a)⇒ …)。您还可以使用
fun
primrec
定义自己的投影函数,例如:

primrec foo1 where "foo1 (mat a b c d) = a"
在证明中,您可以使用
acquire
cases
命令访问值,例如

obtain a b c d where "A = mat a b c d" by (cases A) auto
关于定义的问题,您可以在Isar证明中做出如下局部定义:

define A where "A = mat a b c d"
lemma
  shows "P (mat a b c d)" (is "P ?A")
proof -
  term ?A
然后你可以用定理A_def
展开这个定义

如果您想在前提或目标中使用您的定义(并在证明后在定理中展开),您可以使用
定义

lemma
  defines "A ≡ mat a b c d"
  shows   …
同样,这将为您提供一个事实
a_def
,您可以使用它展开定义

您还可以使用
let?A=mat A b c d
或与
is
匹配的模式来引入缩写。与之前的定义不同,这些定义仅在语法级别上,即键入
?A
,但在解析后,您有
mat A b c d
,并且您还将在输出中看到
mat A b c d
<代码>是
的工作原理如下:

define A where "A = mat a b c d"
lemma
  shows "P (mat a b c d)" (is "P ?A")
proof -
  term ?A

它也在“假定”之后工作。

或者,在指定数据类型时,可以定义自定义提取器函数。以你为例

datatype foo = Mat (mat_a : int) (mat_b : int) (mat_c : int) (mat_d : int)
会有用的

然后您可以通过
mat_a x
访问
foo
x
的第一个元素,通过
mat_b x
访问第二个元素,依此类推

示例:

 value "mat_a (Mat 1 2 3 4)"
“1”:“int”


也可以在引理/定理本身中定义A吗(即在证明之前)?我相应地扩展了我的答案。