在 Coq 中提出证明
Pose proof in Coq
我正在尝试用 Coq 证明一个定理。我当前的上下文是:
1 subgoal
s, x : Entity
Pssx : Ps s x
Fxs : F x s
IPssx : F x s /\ Ps s x
t : Entity
Ctss : C t s s
Pstx : Ps t x
Fxt : F x t
______________________________________(1/1)
C s s s
F
、Ps
、C
是理论关系。我还有公理 4:
Axiom A4 : forall x s t,
Ps s x /\ F x s /\ Ps t x /\ F x t -> s = t.
我想做的是在证明中使用 A4,因为它会帮助我说 s 和 t 相等。所以我测试了:pose proof (A4 x s t).
添加了一个新的假设:H : Ps s x /\ F x s /\ Ps t x /\ F x t -> s = t
。我知道我可以推翻假设 H,证明前提并使用结论。但是我也知道我可以直接在pose proof
命令中给出前提。我想做类似 pose proof (A4 x s t Premisses).
但我不知道用什么代替 Premisses
。
我尝试了几种解决方案:
- 用/组成假设,比如
pose proof (A4 x s t (Pssx /\ Fxs /\ Pstx /\ Fxt)).
但是我得到了错误The term "Pssx" has type "Ps s x" while it is expected to have type "Ps s x /\ F x s /\ Ps t x /\ F x t".
- 使用
assert
命令和 pose proof (A4 x s t H1).
:
assert (H1 := (Ps s x) /\ (F x s) /\ (Ps t x) /\ (F x t)).
但我得到了 The term "H1" has type "Prop" while it is expected to have type "Ps s x /\ F x s /\ Ps t x /\ F x t".
assert (H1 := (Pssx) /\ (Fxs) /\ (Pstx) /\ (Fxt)).
但我得到了 The term "Pssx" has type "Ps s x" while it is expected to have type "Prop".
所以我的问题如下:我应该用什么代替 Premisses
让我的代码工作?是否有命令根据其他假设创建新假设?我知道如何将一个假设分解为两个较小的假设,但我不知道如何组合假设来创建更大的假设。
Coq 中的标准是 curry 你的 A4
这样它就不会接收一个大连词作为前提,而是接收几个不同的前提:
Axiom A4' : forall x s t,
Ps s x -> F x s -> Ps t x -> F x t -> s = t.
那么你可以这样做:
pose proof (A4' x s t Pssx Fxs Pstx Fxt).
如果你确实需要 A4
连词,你可以使用 conj
(你可以用 Print "_ /\ _"
找到):
pose proof (A4 x s t (conj Pssx (conj Fxs (conj Pstx Fxt)))).
我正在尝试用 Coq 证明一个定理。我当前的上下文是:
1 subgoal
s, x : Entity
Pssx : Ps s x
Fxs : F x s
IPssx : F x s /\ Ps s x
t : Entity
Ctss : C t s s
Pstx : Ps t x
Fxt : F x t
______________________________________(1/1)
C s s s
F
、Ps
、C
是理论关系。我还有公理 4:
Axiom A4 : forall x s t,
Ps s x /\ F x s /\ Ps t x /\ F x t -> s = t.
我想做的是在证明中使用 A4,因为它会帮助我说 s 和 t 相等。所以我测试了:pose proof (A4 x s t).
添加了一个新的假设:H : Ps s x /\ F x s /\ Ps t x /\ F x t -> s = t
。我知道我可以推翻假设 H,证明前提并使用结论。但是我也知道我可以直接在pose proof
命令中给出前提。我想做类似 pose proof (A4 x s t Premisses).
但我不知道用什么代替 Premisses
。
我尝试了几种解决方案:
- 用/组成假设,比如
pose proof (A4 x s t (Pssx /\ Fxs /\ Pstx /\ Fxt)).
但是我得到了错误The term "Pssx" has type "Ps s x" while it is expected to have type "Ps s x /\ F x s /\ Ps t x /\ F x t".
- 使用
assert
命令和pose proof (A4 x s t H1).
:assert (H1 := (Ps s x) /\ (F x s) /\ (Ps t x) /\ (F x t)).
但我得到了The term "H1" has type "Prop" while it is expected to have type "Ps s x /\ F x s /\ Ps t x /\ F x t".
assert (H1 := (Pssx) /\ (Fxs) /\ (Pstx) /\ (Fxt)).
但我得到了The term "Pssx" has type "Ps s x" while it is expected to have type "Prop".
所以我的问题如下:我应该用什么代替 Premisses
让我的代码工作?是否有命令根据其他假设创建新假设?我知道如何将一个假设分解为两个较小的假设,但我不知道如何组合假设来创建更大的假设。
Coq 中的标准是 curry 你的 A4
这样它就不会接收一个大连词作为前提,而是接收几个不同的前提:
Axiom A4' : forall x s t,
Ps s x -> F x s -> Ps t x -> F x t -> s = t.
那么你可以这样做:
pose proof (A4' x s t Pssx Fxs Pstx Fxt).
如果你确实需要 A4
连词,你可以使用 conj
(你可以用 Print "_ /\ _"
找到):
pose proof (A4 x s t (conj Pssx (conj Fxs (conj Pstx Fxt)))).