Я не уверен, что есть полностью удовлетворительное решение для вашего вопроса.
Действительно, как вспоминается в Coq refman :
Учитывая термин возможно, не типизируемый, нас интересует проблема определения, может ли она быть хорошо типизированной по модулю вставки соответствующих приведения.
, и получается, что в вашем примере сам термин [0;0;0;1]
набирается как list R
и проверяется типом "за один go"; таким образом, когда происходит несоответствие типов [0;0;0;1] : list C
, так как «обратного отслеживания» нет, принуждение не может быть вставлено в элементы списка.
Так что, возможно, вы могли бы адаптировать свою формализацию другим способом или просто использовать один из следующих обходных путей:
Перезапись вашего термина в β-переопределение:
Definition lC := (fun z o => [z;z;z;o] : list C) 0 1.
Или вставка еще нескольких типов типов вокруг каждого элемента :
Definition lC := [0:C; 0:C; 0:C; 1:C].
Относительно вашего последнего вопроса
Почему Coq считает, что я хочу R
с, а не Z
с?
это происходит из вашей строки Open Scope R_scope.
, что означает, что числовые буквенные обозначения по умолчанию распознаются как принадлежащие R
(который имеет дело с классической аксиоматизацией действительных чисел, формализованных в стандартной библиотеке Reals
). Более конкретно, реализация изменилась в Coq 8.7, начиная с coq / coq@a4a76c2 (обсуждается в PR coq / coq # 415 ). Подводя итог, можно сказать, что литерал, такой как 5%R
, теперь анализируется как IZR 5
, то есть IZR (Zpos (xI (xO xH)))
, в то время как в Coq 8.6 он анализировался в гораздо менее краткий термин: Rplus R1 (Rmult (Rplus R1 R1) (Rplus R1 R1))
.