Вам необходимо использовать информативное подтверждение членства.Прямо сейчас ваш Any
принимает значения в Prop
, что в силу его ограничений на удаление (см. Полученное вами сообщение об ошибке) соответствует аксиоме forall (P: Prop) (x y: P), x = y
.Это означает, что если у вас есть какой-то термин, который зависит от термина, тип которого находится в Prop
(как в случае с remove
), он должен использовать только тот факт, что такой термин существует, а не то, каким термином он является конкретно,Как правило, вы не можете использовать исключение (обычно сопоставление с образцом) на Prop
для создания чего-либо, кроме того, что также является Prop
.
. Существуют три принципиально различных доказательства In' 1 [1; 2; 1; 3; 1; 4]
, и,в зависимости от того, какое доказательство используется, remove p
может быть [2; 1; 4; 1; 4]
, [1; 2; 3; 1; 4]
или [1; 2; 1; 3; 4]
.Поэтому вывод существенно зависит от конкретного доказательства.
Чтобы это исправить, вы можете просто заменить Prop
в Inductive Any {A : Type} (P : A -> Type) : list A -> Prop
на Type
. 1 Теперь мы можемисключите не Prop
типы, и ваше определение remove
работает как написано.
Чтобы ответить на ваши изменения, я думаю, что самая большая проблема заключается в том, что некоторые из ваших теорем / определений нуждаются в In'
быть Prop
(потому что они зависят от неинформативных доказательств), а другим нужно информативное доказательство.
Я думаю, что вам лучше всего оставить In'
как Type
, но затем доказать неинформативные версиитеоремы.В стандартной библиотеке, в Coq.Init.Logic
, есть индуктивный тип inhabited
.
Inductive inhabited (A: Type): Prop :=
| inhabits: A -> inhabited A.
. Он принимает тип и, по существу, забывает что-либо конкретное о его терминах, помня только, обитаем ли он или нет.Я думаю, что ваша теорема и лемма доказуемы, если вы просто замените In' x l
на inhabited (In' x l)
.Мне удалось доказать вариант вашей теоремы, вывод которого просто In x l <-> inhabited (In' x l)
.Ваше доказательство в основном сработало, но мне пришлось использовать следующую простую лемму за один шаг:
Lemma inhabited_there {A: Type} {P: A -> Type} {x: A} {xs: list A}:
inhabited (Any P xs) -> inhabited (Any P (x :: xs)).
Примечание: хотя inhabited A
- это просто Prop
версия A
, и мы имеем A -> inhabited A
, мы не можем доказать inhabited A -> A
в целом, потому что это будет включать в себя выбор произвольного элемента A
. 2
Я такжепредложил Set
здесь и раньше, но это не работает, так как индуктивный тип зависит от A
, который находится в Type
.
На самом деле, я считаю, что доказательствоАссистент Лин использует нечто очень похожее для своей аксиомы выбора.