在Isabelle中创建具有不等式的数据类型

时间:2016-04-24 04:08:18

标签: isabelle

我是Isabelle的新手,我正在尝试实现一种数据类型,例如

datatype fruit = Apple |香蕉|哈密​​瓜

(单词选择在这里是不可忽视的,不会混淆尝试做任何其他事情)

然而,重要的是要注意Apple≤Banana≤Cantaloupe。

在Isabelle实施的最佳方式是什么?数据类型是否合适?

奖金问题:如何将变量实例化为这3个选项中的一个?

1 个答案:

答案 0 :(得分:2)

关于你的主要问题。

我假设您想要手动指定排序,即您要拼出所有案例。如果您对标准字典顺序感到满意,那么AFP entry就能自动执行此操作。

是的,实现所需内容的正确方法是从数据类型开始。然后,您需要定义运算符。为此,您需要实例化一个类documentation of type classes中的前两个部分将让您了解其工作原理。对于你的例子,它看起来像这样:

instantiation fruit :: linorder begin

fun less_fruit where
"Apple < Apple ⟷ False" |
"Apple < _ ⟷ True" |
"Banana < Apple ⟷ False" |
"Banana < Banana ⟷ False" |
"Banana < _ ⟷ True" |
"Cantaloupe < _ ⟷ False"

definition less_eq_fruit :: "fruit ⇒ fruit ⇒ bool" where
[simp]: "less_eq_fruit x y ⟷ x = y ∨ x < y"

instance sorry

end

最后,您必须执行实例证明,即:您需要显示您定义的运算符确实形成线性顺序。在上面的例子中,我使用sorry命令作弊。

正确地做到这一点的方法直接导致你的奖金问题。

您可以使用cases策略来实例化变量。请参阅实例证明:

instance proof
  fix x y :: fruit
  show "(x < y) = (x ≤ y ∧ ¬ y ≤ x)"
    by (cases x; cases y; simp)
next
   (* more stuff to prove here *)
qed

cases方法采用变量名称,并将当前目标拆分为多个案例(此处:三个)。 ;(顺序组合)运算符将应用第一种方法并将第二种方法应用于所有新的子目标。最后,所有内容都可以通过simp来解决。