Это ожидаемое поведение. Вещи из Prop
являются суждениями, означающими, что они не имеют отношения к вычислениям, потому что существуют суждения для обеспечения правильности, например, представлять предварительные и последующие условия алгоритма, не участвовать в вычислениях.
Ситуация аналогична ситуации типов в статически типизированных языках - обычно требуется стереть типы из среды выполнения. Здесь мы хотели бы, чтобы термины, которые являются доказательствами, тоже были стерты.
Это поддерживается системой типов Coq, которая запрещает утечку логической информации из типов от Prop
до Type
, например,
Definition foo : True \/ True -> nat :=
fun t => match t with
| or_introl _ => 0
| or_intror _ => 42
end.
Результаты в
Error:
Incorrect elimination of "t" in the inductive type "or":
the return type has sort "Set" while it should be "Prop".
Elimination of an inductive object of sort Prop
is not allowed on a predicate in sort Set
because proofs can be eliminated only to build proofs.
Возникает естественный вопрос:
Так что в идеале divides
и prime
должны быть полностью удалены из извлеченного файла, верно? Как они там существуют?
Как объясняет Пьер Летузи в своем обзоре извлечения в Coq :
Подведем итоги текущего состояния извлечения Coq. Теоретическая функция извлечения, описанная в [7], все еще актуальна и используется в качестве ядра системы извлечения. Эта функция сворачивается (но не может полностью удалить ) как логических частей (живущих в сортировке Prop
), так и типов. Полное удаление может привести к опасным изменениям в оценке терминов и даже может привести к ошибкам или не прекращению в некоторых ситуациях.