Требуется то, что известно как индуктивно-рекурсивное определение . К сожалению, Coq не поддерживает эту функцию, хотя другие помощники, такие как Agda и Idris, поддерживают ее.
Лучший способ избежать индукции-рекурсии для вашего типа - это, вероятно, определить необработанный индуктивный тип без ограничений и определить отдельный предикат, который выделяет правильно сформированные элементы:
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
}.
Библиотека математических компонентов имеет хорошую поддержку этого шаблона программирования; найдите класс subType
в приведенной выше ссылке.