在Isabelle中证明了关于树木的简单引理

时间:2014-05-28 03:50:15

标签: isabelle

我是伊莎贝尔的新手。我有一个简单的树数据类型和一个函数getTree。 getTree使用一个布尔列表来控制它对树的遍历(它向左移动为false,向右移动为true)。当它到达列表的末尾时,它返回剩余的子树。如果它在到达列表末尾之前到达叶子,则返回该叶子。我想表明如果getTree使用一些列表ys返回一个叶子,那么它将使用(ys @ bs)返回相同的叶子(一旦你到达一个叶子,剩下的列表并不重要)。

我所有证明这一点的尝试都失败了。如果有人有任何建议,我将非常感激。

以下是代码:

datatype 'a tree = 
  Leaf 'a |
  Node 'a "'a tree" "'a tree"

fun getTree :: "'a tree ⇒ bool list ⇒ 'a tree" where
  "getTree (Leaf x) ys = (Leaf x)" |
  "getTree r [] = r" |
  "getTree (Node x l r) (False # ys) = getTree l ys" |
  "getTree (Node x l r) (True # ys) = getTree r ys"

lemma: "getTree t ys = Leaf a ==> getTree t (ys @ bs) = Leaf a"

1 个答案:

答案 0 :(得分:3)

当你通过" fun"定义一个函数时,Isabelle根据定义的递归结构生成一个归纳规则。在这里你可以使用getTree.induct:

by (induct t ys rule: getTree.induct) simp_all