我试图在 Coq 中定义一个弱指定类型的函数。具体来说,我有一个由一组递归构造函数归纳定义的类型,并且我想定义一个函数,该函数仅在使用其中的一个子集构造参数时才定义。
更具体地说,我有以下类型定义:
Inductive Example : Set :=
| Example_cons0 : nat -> Example
| Example_cons1 : Example -> Example
.
现在,我有一个仅适用于地面案例的功能。(以下定义显然不起作用,但旨在表明我的意图。)
Definition example (x:Example) : nat :=
match x with
| Example_cons0 n => n
end.
理想情况下,我想说明我的参数 x 是使用通用类型构造函数的子集构造的,在本例中为 Example_cons0。我认为我可以通过定义一个陈述这一事实的谓词并将谓词的证明作为参数传递来做到这一点。例如:
Definition example_pred (x:Example) : Prop :=
match x with
| Example_cons0 _ => True
| _ => False
end.
然后(按照 Robin Green 的建议)类似,
Definition example2 (x:Example) : example_pred x -> nat :=
(use proof to define example2?)
不幸的是,我不确定我将如何去做这些。我什至不确定这是在弱指定类型上定义受限函数的正确方法。
任何指导、提示或建议将不胜感激!- 李
更新:
按照 jozefg 的建议,示例函数可以定义为:
Definition example (x:Example) : example_pred x -> nat :=
match x with
| Example_cons0 n => fun _ => n
| _ => fun proof => match proof with end
end.
有关详细信息,请参阅他的评论。可以使用以下语法评估此函数,这也演示了证明术语在 Coq 中的表示方式:
Coq < Eval compute in Example.example (Example.Example_cons0 0) (I : Example.example_pred (Example.Example_cons0 0)).
= 0
: nat