這是我在數學定理中使用的歸納型pc
。反演在Coq中產生意外的存在T
Inductive pc (n : nat) : Type :=
| pcs : forall (m : nat), m < n -> pc n
| pcm : pc n -> pc n -> pc n.
而另一感應型pc_tree
,這基本上是一個包含一個或多個pc
個二叉樹。 pcts
是一個包含單個pc
的葉節點構造函數,而pctm
是包含多個pc
的內部節點構造函數。
Inductive pc_tree : Type :=
| pcts : forall (n : nat), pc n -> pc_tree
| pctm : pc_tree -> pc_tree -> pc_tree.
和歸納定義的命題contains
。 contains n x t
表示樹t
包含至少一個x : pc n
的發生。
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).
現在,問題的引理我需要證明:
Lemma contains_single_eq : forall (n : nat) (x y : pc n), contains n x (pcts n y) -> x = y.
引理的意思非常簡單:如果具有包含y : pc n
單葉節點樹包含一些x : pc n
,它遵循x = y
。我想我應該可以通過contains
上的簡單inversion
來證明這一點。所以當我寫了
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.
我期待得到x = y
作爲上下文中的假設。下面是我所得到的:
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
與我的預期完全不同。 (我以前從未見過existT
)。我所關心的是我證明contains_single_eq
,但我不確定如何使用H1
,或者它是否可用。
有什麼想法?
'{x:T&P x}'是一個從屬總和,例如'T * P'是一個非相關和。 '@existT T P x H:{x:T&P x}'比如'@pair T P x H:T * P'。存在x:T,P x','{x:T | P x}'和'{x:T&P x}'非常相似。使用'Print ex.','Print sig.'和'Print sigT.'命令。 –