如何处理 COQ 中的分裂?
How to deal with division in COQ?
如何处理目标中的划分?
因为我有一个明确的目标......但是我不能使用lia
,我认为这与除法有关。
2 ^ k / 2 ≤ 2 ^ k
下面是我的 COQ 屏幕:
自然数除法不像有理数或实数那样容易管理(想想 1 / 3
)。解决这个问题的一种方法是尝试用乘法重新构建约束;例如, n < m / p
有时可以处理为 n * p < m
。否则,使用有理数库可能是一种解决方案。
自然界没有自动除法 - 它们甚至不形成一个字段。但是用Search不难找到对应的词条:
Require Import Lia.
Goal forall k:N, 2 ^ k / 2 <= 2 ^ k.
Proof.
intros k.
Search (?a/?b <= ?a/?c).
Search (_/1).
rewrite <- N.div_1_r.
apply N.div_le_compat_l.
lia.
Qed.
如果您有非常复杂的术语,您可以使用 floor (a/b)
将目标嵌入实数中以获得整数 a/b
,然后使用 coq-interval。嵌入很容易实现自动化,并且 coq-interval 对于证明真正的不等式非常强大,但如果你有多个楼层,它可能会窒息。您可以将它与 coq-gappa 结合起来,然后摆脱地板。它变得非常复杂,但仍然是完全自动化的。但请注意,它可能无法证明非常严格的不等式,因为它使用实数分析。
Nia
(Require Import Psatz
),按照 Ana 的建议,无法解决这个问题(老实说我已经停止尝试了)。
如何处理目标中的划分?
因为我有一个明确的目标......但是我不能使用lia
,我认为这与除法有关。
2 ^ k / 2 ≤ 2 ^ k
下面是我的 COQ 屏幕:
自然数除法不像有理数或实数那样容易管理(想想 1 / 3
)。解决这个问题的一种方法是尝试用乘法重新构建约束;例如, n < m / p
有时可以处理为 n * p < m
。否则,使用有理数库可能是一种解决方案。
自然界没有自动除法 - 它们甚至不形成一个字段。但是用Search不难找到对应的词条:
Require Import Lia.
Goal forall k:N, 2 ^ k / 2 <= 2 ^ k.
Proof.
intros k.
Search (?a/?b <= ?a/?c).
Search (_/1).
rewrite <- N.div_1_r.
apply N.div_le_compat_l.
lia.
Qed.
如果您有非常复杂的术语,您可以使用 floor (a/b)
将目标嵌入实数中以获得整数 a/b
,然后使用 coq-interval。嵌入很容易实现自动化,并且 coq-interval 对于证明真正的不等式非常强大,但如果你有多个楼层,它可能会窒息。您可以将它与 coq-gappa 结合起来,然后摆脱地板。它变得非常复杂,但仍然是完全自动化的。但请注意,它可能无法证明非常严格的不等式,因为它使用实数分析。
Nia
(Require Import Psatz
),按照 Ana 的建议,无法解决这个问题(老实说我已经停止尝试了)。