编辑:我应该说我目前如何解决这个问题。我定义了一个显示排列相等性的原则,
Lemma permInd : ∀ (U : Type) (A : Ensemble U) (φ ψ : Perm A),
φ ↓ = ψ ↓ → φ ↑ = ψ ↑ → φ = ψ
然后在证明语境中应用引理,这给我带来了麻烦,并表明eta等价项是相等的。因此,当术语嵌套在记录中时,问题似乎显示出等效性。但是我不擅长处理记录,所以我可能会遗漏一些东西。
原始
我无法证明嵌套在记录字段中的eta等效术语是否相等。作为参考,η-还原可以通过反身性独立证明:
Lemma etaEquivalence : ∀ (A B : Type) (f : A → B), (λ x : A, f x) = f.
Proof. reflexivity. Qed.
在我目前的证据背景下,我有两个必须证明相同的记录。完全破坏和展开,证明上下文和当前子目标看起来像这样:
U : Type
A : Ensemble U
perm0 : U → U
pinv0 : U → U
permutes0 : IsPerm A perm0 pinv0
============================
{|
perm := λ x : U, perm0 x;
pinv := λ x : U, pinv0 x;
permutes := permutationComp permutes0 (permutationId A) |} =
{| perm := perm0; pinv := pinv0; permutes := permutes0 |}
必须建立的平等是
perm0 = λ x : U, perm0 x
pinv0 = λ x : U, pinv0 x
因为这些平等可以通过反身性来确定,所以我不确定问题是什么。但是,我怀疑出现了问题,因为尝试用λ x : U, perm0 x
替换perm0
会生成相应的子目标,但不会替换记录中的术语。此外,使用eqa_reduction进行重写会导致有关抽象的错误导致错误的术语或嵌套的依赖参数。
我尽可能地简化了上下文并将其粘贴在下面。除了风格问题以及我还是初学者的事实,我认为目前的发展没有任何问题。
Require Import Unicode.Utf8 Utf8_core Ensembles Setoid.
Class IsPerm {U : Type} (A : Ensemble U) (φ ψ : U → U) : Prop := {
pinvLeft : ∀ x : U, ψ (φ x) = x;
pinvRight : ∀ x : U, φ (ψ x) = x;
closedPerm : ∀ x : U, In U A x → In U A (φ x);
closedPinv : ∀ x : U, In U A x → In U A (ψ x)
}.
Record Perm {U : Type} (A : Ensemble U) : Type := {
perm : U → U;
pinv : U → U;
permutes :> IsPerm A perm pinv
}.
Notation "f ∘ g" := (λ x, f (g x)) (at level 45).
Notation "P ↓" := (@perm _ _ P) (at level 2, no associativity).
Notation "P ↑" := (@pinv _ _ P) (at level 2, no associativity).
Instance permutationComp
{U : Type} {A : Ensemble U} {f g k h : U → U}
(P : IsPerm A f k) (Q : IsPerm A g h) : IsPerm A (f ∘ g) (h ∘ k).
Proof.
constructor; intros.
setoid_rewrite pinvLeft. apply pinvLeft.
setoid_rewrite pinvRight. apply pinvRight.
apply closedPerm. apply closedPerm. auto.
apply closedPinv. apply closedPinv. auto.
Defined.
Instance permutationId
{U : Type} (A : Ensemble U) :
IsPerm A (λ x : U, x) (λ x : U, x).
Proof. constructor; intros; auto. Defined.
Definition permComp
{U : Type} (A : Ensemble U)
(φ : Perm A) (ψ : Perm A) : Perm A :=
Build_Perm U A (φ↓ ∘ ψ↓) (ψ↑ ∘ φ↑)
(permutationComp (permutes A φ) (permutes A ψ)).
Definition permId {U : Type} (A : Ensemble U) : Perm A :=
Build_Perm U A (λ x : U, x) (λ x : U, x) (permutationId A).
(* problems occur after the application of the tactic simpl, below: *)
Lemma permCompRightIdentity :
∀ {U : Type} (A : Ensemble U) (φ : Perm A), permComp A φ (permId A) = φ.
Proof. intros. unfold permComp. simpl. admit. Qed.
最后,我要感谢大家帮助我解决Coq并耐心等待。
答案 0 :(得分:6)
Coq中没有内置证明不相关性。如果你假设证明不相关公理,你可以很容易地证明你想要的东西:
Require Import ProofIrrelevance.
Lemma permCompRightIdentity :
∀ {U : Type} (A : Ensemble U) (φ : Perm A), permComp A φ (permId A) = φ.
Proof.
intros. unfold permComp. simpl.
destruct φ.
f_equal.
apply proof_irrelevance.
Qed.