Используя Coq 8.4pl3, я получаю ошибку при индукции с вариантом eqn:, который не указан в индукции в справочном руководстве.Coq - недокументированная ошибка при индукции с помощью eqn:
(* Export below requires Software Foundations 4.0. *)
Require Export Logic.
Inductive disjoint (X : Type) (l1 l2 : list X) : Prop :=
| nil1 : l1 = [] -> disjoint X l1 l2
| nil2 : l2 = [] -> disjoint X l1 l2
| bothCons : forall x:X,
In x l1 ->
not (In x l2) ->
disjoint X l1 l2.
Fixpoint head (X : Type) (l : list X) : option X :=
match l with
| [] => None
| h :: t => Some h
end.
Fixpoint tail (X : Type) (l : list X) : list X :=
match l with
| [] => []
| h :: t => t
end.
Inductive NoDup (X : Type) (l : list X) : Prop :=
| ndNil : l = [] -> NoDup X l
| ndSingle : forall x:X, l = [x] -> NoDup X l
| ndCons : forall x:X, head X l = Some x ->
not (In x (tail X l)) /\ NoDup X (tail X l) ->
NoDup X l.
Theorem disjoint__app_NoDup :
forall (X : Type) (l1 l2 : list X),
disjoint X l1 l2 /\ NoDup X l1 /\ NoDup X l2 ->
NoDup X (l1 ++ l2).
Proof.
intros. induction H eqn:caseEqn.
Если я заменяю просто «индукции H» для последнего шага, я не получаю сообщение об ошибке, но с указанным выше уравнением: аргумент, я получаю ошибку:
Error: a is used in conclusion.
(Ранее было условие отсутствует в формулировке теоремы, и та же ошибка, перечисленные в идентификатор д вместо.)
Ссылка вручную списки «используется в заключение» как ошибка от использования утверждают. Это делает какой-то смысл, что за кулисами eqn: может генерировать утверждения, но у меня нет идентификатора a, видимого в контексте, и я не вижу, что Coq пытается сделать с ним автоматически.
Пробовал заменить начало доказательства с
intros. remember H. induction H.
Теперь попытка сделать индукцию дает ту же ошибку, как и раньше, только с H вместо в. (Когда теорема отсутствует дополнительное условие, Coq также явно добавил д к контексту, совпадает с гипотезой H.)
Как я могу двигаться вперед здесь? Я пытаюсь избежать потери информации из контекста.
[MCVE] (http://stackoverflow.com/help/mcve) со всеми импортными товарами будет очень полезен. Например.в стандартной библиотеке нет 'disjoint' (все в нижнем регистре). –
Для чего это стоит, ваша теорема, вероятно, неверна. Списки '[1; 1'] и' [2; 2] 'не пересекаются, но' [1; 1] ++ [2; 2] 'содержит дубликаты. Возможно, вам также понадобится «NoDup l1/\ NoDup l2». – larsr
(1) Проблема здесь заключается в определении 'disjoint' - это не является фактически индуктивным, так как его конструкторы не включают никаких« непересекающихся »в качестве предпосылок, только как выводы. Таким образом, 'индукция H eqn: caseEqn.' может быть заменена на' destruct H eqn: caseEqn.' (2) Кроме того, конструктор 'bothCons' на самом деле является определением для всей концепции« disjoint », мы можем получить« nil1 »и 'nil2', поэтому вы можете определить' disjoint' следующим образом: 'Определение disjoint {X: Тип} (l1 l2: list X): Prop: = forall x: X, In x l1 -> ~ (In x l2). –