için beklenmeyen bir varoluş ortaya çıkarıyor Burada bir matematiksel teoremde kullandığım bir endüktif tip pc
.Inversion, Coq
Inductive pc (n : nat) : Type :=
| pcs : forall (m : nat), m < n -> pc n
| pcm : pc n -> pc n -> pc n.
Ve temel olarak bir veya daha fazla pc
ler içeren bir ikili ağaçtır başka endüktif tip pc_tree
. pcts
, tek bir pc
içeren ve pctm
birden çok pc
s içeren bir iç düğüm kurucusu olan bir yaprak düğümü kurucusudur.
Inductive pc_tree : Type :=
| pcts : forall (n : nat), pc n -> pc_tree
| pctm : pc_tree -> pc_tree -> pc_tree.
Ve indüktif tanımlanan önerme
contains
.
contains n x t
,
t
ağacının
x : pc n
en az bir oluşumunu içerdiği anlamına gelir. o izler,
y : pc n
içeren tek yaprak düğümü olan bir ağaç bazı
x : pc n
içeriyorsa: lemma ne anlama
Lemma contains_single_eq : forall (n : nat) (x y : pc n), contains n x (pcts n y) -> x = y.
gerçekten basittir:
Inductive contains (n : nat) (x : pc n) : pc_tree -> Prop :=
| contain0 : contains n x (pcts n x)
| contain1 : forall (t s : pc_tree), contains n x t -> contains n x (pctm t s)
| contain2 : forall (t s : pc_tree), contains n x t -> contains n x (pctm s t).
Şimdi, sorunlu lemma ben kanıtlamak gerekir x = y
. Bunu contains
numaralı telefondan basit bir inversion
ile kanıtlayabileceğimi düşündüm. Ben
Lemma contains_single_eq : forall (n : nat) (x y : pc n), contains n x (pcts n y) -> x = y.
intros n x y H. inversion H.
yazdığımda Yani bağlamında bir hipotez olarak x = y
almak için bekliyordum. İşte bunun yerine ne var:
1 subgoal
n : nat
x : pc n
y : pc n
H : contains n x (pcts n y)
H1 : existT (fun n : nat => pc n) n x = existT (fun n : nat => pc n) n y
====================================================================== (1/1)
x = y
H1
beklediğim oldukça farklıdır. (Ben daha önce hiç existT
görmedim.) Tek umurumda contains_single_eq
olduğunu kanıtlamak, ama bunun için H1
nasıl kullanılacağını veya hiç kullanılıp kullanılamayacağını emin değilim.
Herhangi bir düşünce?
'{x: T & P x}', T * P'nin bağımlı olmayan bir toplamıdır. @existT T P x H: {x: T & P x} 'like' @pair T P x Y: T * P'. x var: T, P x', {x: T | P x} 've' {x: T & P x} 'çok benzer. 'Print ex.',' Print sig.' ve 'print sigT.' komutlarını kullanın. –