我是伊莎贝尔的新手。我有一个简单的树数据类型和一个函数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"
答案 0 :(得分:3)
当你通过" fun"定义一个函数时,Isabelle根据定义的递归结构生成一个归纳规则。在这里你可以使用getTree.induct:
by (induct t ys rule: getTree.induct) simp_all