Меня интересует, вероятно, ложная лемма:
Lemma decideOr : forall (P Q : Prop),
(P \/ Q) -> {P} + {Q}.
, который утверждает, что мы можем алгоритмически решить любое доказательство or
в виде Prop
. Конечно, Coq не позволяет нам destruct
вводить данные для его сортировки Set
. Однако доказательство P \/ Q
является лямбда-термином, который Coq принимает к печати, поэтому внешние инструменты могут его обрабатывать.
Первый вопрос: может ли этот лямбда-термин быть определен вне Coq (при условии, что этот термин не использует аксиомы, только простое Coq)? Возможно, потому что правила конструктивной логики требуют, чтобы все дизъюнкции были явно выбраны, без обмана путем доказательства от противоречия. Итак, можем ли мы закодировать парсер терминов доказательства Coq и попытаться решить, был ли доказан первый или второй операнд or
? Если срок начинается с or_introl
или or_intror
, мы закончили. Таким образом, я думаю, что проблемы, когда термин является лямбда-приложением. Но затем термины Coq сильно нормализуются, поэтому мы приводим его к нормальной форме, и, похоже, он будет начинаться либо с or_introl
, либо с or_intror
.
Второй вопрос: если эта проблема может быть решена вне Coq, что мешает нам усвоить ее в Coq, то есть доказательство леммы decideOr
выше?