Я не думаю, что есть какой-то удобный способ получить то, что вы хотите, с текущим механизмом принуждения. Когда вы вводите m1
как принуждение, Coq говорит, что оно не соблюдает условие равномерного наследования. Это происходит, когда вы объявляете принуждение между семействами типов, которое фиксирует некоторые параметры; здесь вы исправили X
, чтобы быть nat
. Когда это условие нарушается, средство проверки типов Coq отказывается применять принуждение.
Одним частичным решением является введение промежуточного типа:
Inductive A (X: Type) :=
n1 : nat -> X -> (A X)
.
Arguments n1 {X} _ _.
Definition Anat := A nat.
Identity Coercion Anat_of_A : Anat >-> A.
Inductive B :=
m1 : Anat -> B |
m2 : B -> B -> B
.
Coercion m1 : Anat >-> B.
Check m2 (m1 (n1 1 2)) (m1 (n1 2 2)). (* 1st Check *)
Check m2 (n1 1 2 : Anat) (n1 2 2 : Anat). (* 2nd Check *)
Проблема в том, что n1
все еще что-то производит типа A
в конце вместо Anat
. Следовательно, вам нужно явное приведение, чтобы убедить Coq вызвать принуждение. Конечно, вы также можете определить версию n1
, которая специализируется на X
, но это не позволит сделать A
polymorphi c.