如何处理 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 的建议,无法解决这个问题(老实说我已经停止尝试了)。