我想在Coq中实现以下代码:
Inductive IT :=
| c1 : IT
| c2 (x:IT) (H:
match x as x return Prop with
| c1 => True
| c2 y => False
end): IT.
但是无法匹配未定义的类型。 如何克服这一障碍?
(在使用术语之前,我需要检查术语的某些属性。 例如,目的是-在构造更大的公式之前检查子公式的正确性。)
答案 0 :(得分:1)
您想要一个inductive-recursive definition。不幸的是,尽管其他证明助手(例如Agda和Idris)都支持,但Coq不支持此功能。
为您的类型避免归纳递归的最佳方法可能是定义一个没有约束的原始归纳类型,并定义一个单独的谓词,以剔除格式正确的元素:
Inductive preIT :=
| c1 : preIT
| c2 : preIT -> preIT.
Definition wfIT (x : preIT) :=
match x with
| c1 => true
| c2 c1 => true
| c2 (c2 _) => false
end.
Record IT := {
it_val : preIT;
_ : wfIT it_val
}.
Mathematical Components库对此编程模式提供了良好的支持;在上面的链接中查找subType
类。