访问数据类型的元素

时间:2018-01-22 17:14:00

标签: isabelle isar

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

datatype foo = mat int int int int 

和(例如在引理中)

fixes A :: foo

是否可以访问A的单个元素?或者,修复单个元素(fix a b c d :: int),然后将A定义为mat a b c d

2 个答案:

答案 0 :(得分:1)

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

primrec foo1 where "foo1 (mat a b c d) = a"

在证明中,您可以使用obtaincases命令访问值,例如

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"

然后您可以使用定理A_def展开该定义。

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

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 dis的作用如下:

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

它也可以在“假设”之后运作。

答案 1 :(得分:1)

或者,可以在指定数据类型时定义自定义提取器函数。在您的情况下,例如

app.use(express.static())

会起作用。

然后,您可以datatype foo = Mat (mat_a : int) (mat_b : int) (mat_c : int) (mat_d : int) 访问foox的第一个元素,mat_a x访问第二个元素,依此类推。

示例:

mat_b x
  

" 1" ::" int"