我是Isabelle的新手,我正在尝试实现一种数据类型,例如
datatype fruit = Apple |香蕉|哈密瓜
(单词选择在这里是不可忽视的,不会混淆尝试做任何其他事情)
然而,重要的是要注意Apple≤Banana≤Cantaloupe。在Isabelle实施的最佳方式是什么?数据类型是否合适?
奖金问题:如何将变量实例化为这3个选项中的一个?
答案 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
来解决。