我想创建一个新的数据类型形状像一个旧的,但(不像使用type_synonym
)它应该被认为是不同的其他理论。Isabelle等价于Haskell newtype吗?
我的激励示例:我从列表中制作堆栈数据类型。我不希望我的其他理论看我stack
S作为list
这么我可以强制对我自己的简化规则,但我已经找到了唯一的解决办法是:
datatype 'a stk = S "'a list"
...
primrec index_of' :: "'a list => 'a => nat option"
where "index_of' [] b = None"
| "index_of' (a # as) b = (
if b = a then Some 0
else case index_of' as b of Some n => Some (Suc n) | None => None)"
primrec index_of :: "'a stk => 'a => nat option"
where "index_of (S as) x = index_of' as x"
...
lemma [simp]: "index_of' del v = Some m ==> m <= n ==>
index_of' (insert_at' del n v) v = Some m"
<proof>
lemma [simp]: "index_of del v = Some m ==> m <= n ==>
index_of (insert_at del n v) v = Some m"
by (induction del, simp)
它的工作原理,但这意味着我的理论膨胀并且充满了过多的冗余:每个函数都有第二个版本剥离构造函数,每个定理都有第二个版本(证明是总是by (induction del, simp)
,这让我感觉像一个符号我在某处做了太多工作)。
有没有什么可以帮到这里?
谢谢!因此,我用'lift_definition index_of ::''a env =>'a => nat选项“is index_of'by simp' 替换我的'index_of'定义,然后证明只是用一个引理而不是两个? – Zyzzyva 2014-12-11 15:53:49
因为这些函数可以工作,但是尝试证明它不会在'list'上对'stack's进行归纳:它只是增加一个'ya:{xs。 True} ==>'前提。我怎样才能让它提升证明呢? – Zyzzyva 2014-12-11 16:02:00