Я экспериментирую с Coq Coinductive типами Coq. Я использую ленивый тип списка образует Coq'Art книгу (раздел 13.1.4.):Доказательство равенства на коиндуктивных ленивых списках в Coq
Set Implicit Arguments.
CoInductive LList (A:Set) : Set :=
| LNil : LList A
| LCons : A -> LList A -> LList A.
Implicit Arguments LNil [A].
CoFixpoint LAppend (A:Set) (u v:LList A) : LList A :=
match u with
| LNil => v
| LCons a u' => LCons a (LAppend u' v)
end.
Для того, чтобы соответствовать условию сторожевого я также использовать следующие функции разложения образуют эту книгу:
Definition LList_decomp (A:Set) (l:LList A) : LList A :=
match l with
| LNil => LNil
| LCons a l' => LCons a l'
end.
Lemma LList_decompose : forall (A:Set) (l:LList A), l = LList_decomp l.
Proof.
intros.
case l.
simpl.
reflexivity.
intros.
simpl.
reflexivity.
Qed.
Лемма, что LNil
остается нейтральным легко доказать:
Lemma LAppend_LNil : forall (A:Set) (v:LList A), LAppend LNil v = v.
Proof.
intros A v.
rewrite LList_decompose with (l:= LAppend LNil v).
case v.
simpl.
reflexivity.
intros.
simpl.
reflexivity.
Qed.
Но я застрял, доказав, что LNil
также верно нейтрально:
Lemma LAppend_v_LNil : forall (A:Set) (v:LList A), LAppend v LNil = v.
После ответа Артура, я попытался с новым равенством:
Lemma LAppend_v_LNil : forall (A:Set) (v:LList A), LListEq (LAppend v LNil) v.
Proof.
intros.
cofix.
destruct v.
rewrite LAppend_LNil.
apply LNilEq.
Здесь я застрял. Ответ Coq является:
1 subgoal
A : Set
a : A
v : LList A
LAppend_v_LNil : LListEq (LAppend (LCons a v) LNil) (LCons a v)
______________________________________(1/1)
LListEq (LAppend (LCons a v) LNil) (LCons a v)
После ответа Eponier, я хочу, чтобы дать ему последний штрих, вводя объемность Axiom:
Axiom LList_ext: forall (A:Set)(l1 l2: LList A), (LListEq l1 l2) -> l1 = l2.
С этой аксиомой я получаю окончательный срез леммы:
Lemma LAppend_v_LNil : forall (A:Set) (v:LList A), (LAppend v LNil) = v.
Proof.
intros.
apply LList_ext.
revert v.
cofix.
intros.
destruct v. Guarded. (* now we can safely destruct v *)
- rewrite LAppend_LNil.
constructor.
- rewrite (LList_decompose (LAppend _ _)).
simpl. constructor. apply LAppend_v_LNil.
Qed.
Теперь, вот мои последние вопросы для этой темы:
- Существует ли такая аксиома в некоторой библиотеке Coq?
- Эта аксиома согласуется с Coq?
- С какими стандартными аксиомами Coq (например, классическими, UIP, fun ext, Streicher K) является то, что аксиома непоследовательна?
Аналогичный [вопрос] (http://cs.stackexchange.com/questions/63197/is-extensionality-for-coinductive-datatypes-consistent-with-coqs-logic) был недавно задавала на [ CS.SE]. Никто еще не ответил (со времени этого комментария). –