FStar 中的简单断言问题

Issue with a simple assertion in FStar

刚开始学习FStar。我想表达一个事实,即对于每个自然数,都存在一个更大的数。

let _ = assert (forall (m:nat). exists (n: nat). n > m)

它失败了,我想知道为什么。谢谢。

默认情况下,使用 Z3 的启发式方法处理基于模式的量化实例化的量化公式,例如您在此处拥有的公式。您可以在此处阅读有关 Z3 模式的更多信息:https://rise4fun.com/Z3/tutorialcontent/guide#h28https://github.com/FStarLang/FStar/wiki/Quantifiers-and-patterns

总之,你需要帮助F*和Z3为存在量词找到一个见证。一种方法是这样的:

let lem (m:nat)
  : Lemma (exists (n:nat). n > m)
  = assert (m + 1 > m)

这证明了一个引理,即对于任何 m:nat 都存在一个 n:nat 大于 m。它对 F*+Z3 的证明暗示 m + 1 是选择 n 的好证人。

您可以通过多种方式将这样的引理转化为量化的断言。有关这方面的一些示例,请参见 FStar.Classical。例如,这有效:


let _ =
  FStar.Classical.forall_intro lem;
  assert (forall (m:nat). exists (n: nat). n > m)

这是另一种避免定义中间引理的方法,而是使用中间断言。

let _ =
  assert (forall (m:nat). m + 1 > m);
  assert (forall (m:nat). exists (n: nat). n > m)