Zulip Chat Archive

Stream: Program verification

Topic: Does `mvcgen` support recursive functions?


Alexander Bentkamp (Feb 16 2026 at 15:48):

It seems recursion is not yet supported?

import Std.Tactic.Do

open Std.Do

def loop (i : Nat) : Except String Nat := do
  match i with
  | 0 => pure 0
  | (n + 1) => loop n

@[spec]
theorem spec (x : Nat):
      True  
    loop x
      r =>  True   := by
  mvcgen [loop]


-- unsolved goals
-- case vc1
-- x : Nat
-- ⊢ (wp⟦loop x⟧ (PostCond.noThrow fun r => ⌜True⌝)).down

Sebastian Graf (Feb 17 2026 at 22:07):

This is slightly hacky, but it seems to work?

import Std.Tactic.Do

open Std.Do

def loop (i : Nat) : Except String Nat := do
  match i with
  | 0 => pure 0
  | (n + 1) => loop n

@[spec]
theorem spec (x : Nat):
      True  
    loop x
      r =>  True   := by
  unfold loop
  mvcgen [spec]

Alexander Bentkamp (Feb 18 2026 at 07:21):

Ah, of course! That's great, thank you!


Last updated: Feb 28 2026 at 14:05 UTC