我一直在使用Coq很短的时间,并且仍然碰到墙上有些东西。我用Record结构定义了一个集合。现在我需要做一些模式匹配来使用它,但我有问题正确使用它。首先,这些是我的元素。对Coq中的记录构造中的模式匹配感到困惑
Inductive element : Set :=
| empty : element
.
.
.
| fun_m : element -> element -> element
| n_fun : nat -> element -> element
.
我挑选具有一定特色的元素,使它们的一个子集的下一个方法:
Inductive esp_char : elements -> Prop :=
| esp1 : esp_char empty
| esp2 : forall (n : nat)(E : element), esp_char E -> esp_char (n_fun n E).
Record especial : Set := mk_esp{ E : element ; C : (esp_char E)}.
现在,我需要使用的定义和对“特殊”的元素固定点,只是两个我选择。我已阅读记录的文件和我所得到的是,我需要做这样的事情:
Fixpoint Size (E : especial): nat :=
match E with
|{|E := empty |} => 0
|{|E := n_fun n E0|} => (Size E0) + 1
end.
当然,这告诉我,我缺少的元素的电感部分,所以我加的一切{|E := _ |}=> 0
,或任何东西,只是为了使感应器充满。即使这样做,然后我发现这个问题:
|{|E := n_fun n E0|} => (Size E0) + 1
Error:
In environment
Size : especial -> nat
E : especial
f : element
i : esp_char f
n : nat
E0 : element
The term "E0" has type "element" while it is expected to have type "especial".
我已经无法做的是修复过去的事情,我有一个引理证明如果n_fun n E0
是“特殊”,那么E0
是特殊的,但我可以在Fixpoint内部不会这样构建。我还定义了“所有元素”的大小,然后在一个定义中选择了“特殊”元素,但我希望能够直接在集合“特殊”上进行直接模式匹配。谢谢您的意见。
编辑:忘了提,我也有一个强制总是发送特别元素。
编辑:这是我的方法,然后再发布过:
Fixpoint ElementSize (E : element): nat :=
match E with
| n_fun n E0 => (ElementSize E0) + 1
| _ => 0
end.
Definition Size (E : especial) := ElementSize E.
当然这里的东西不排队,类型错了(提示,尝试'关于C'。我建议你先在'element'上定义尺寸函数,然后用记录访问器编写尺寸函数来获得'especial'(sic)的尺寸。 – ejgallego
我完全按照你的建议做了,似乎是最自然的方式,但我被要求只用一个单一的Fixpoint来完成,这就是我卡住的地方。我编辑修复了一些错别字,并添加了一些细节。 – Sara
哦,那好像是一个奇怪的需求,看到答案,因为我不能在这里复制完整的代码。 – ejgallego