Проблема с простым утверждением в FStar

Я только начал изучать FStar. Хочу отметить тот факт, что для каждого натурального числа существует большее число.

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

Это не удается, и я хотел бы знать, почему. Спасибо.

1 ответ

Решение

Количественные формулы, подобные приведенной здесь, по умолчанию обрабатываются с использованием эвристики Z3 для количественной реализации на основе шаблонов. Вы можете узнать больше о шаблонах Z3 здесь: https://rise4fun.com/Z3/tutorialcontent/guide и https://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)
Другие вопросы по тегам