This PR makes `mvcgen` early return after simplifying discriminants, avoiding a rewrite on an ill-formed `match`. Closes #11687.
33 lines
1 KiB
Text
33 lines
1 KiB
Text
import Std
|
||
|
||
set_option mvcgen.warning false
|
||
set_option warn.sorry false
|
||
|
||
open Std.Do Std Std.Iterators Std.Iterators.Types
|
||
|
||
def f {m : Type → Type} : m Unit := sorry
|
||
|
||
@[spec]
|
||
theorem Spec.forIn_iterM
|
||
(pre : Assertion _)
|
||
(post : PostCond Unit _)
|
||
(step : ∀ (it : IterM (α := ArrayIterator Nat) (StateT Nat Id) Nat) (c : Unit),
|
||
Triple (do match ← it.step with | _ => return) sorry sorry) :
|
||
Triple (f (m := StateT Nat Id)) pre post :=
|
||
sorry
|
||
|
||
@[spec]
|
||
theorem array_step_spec [Monad m] [WPMonad m ps]
|
||
{it : IterM (α := ArrayIterator α) m α} {Q : PostCond (Shrink it.Step) ps} :
|
||
Triple it.step (Q.1 sorry) spred(Q) :=
|
||
sorry
|
||
|
||
-- This exercises the `info.simpDiscrs?` code path in `mvcgen`, from which it should return early
|
||
-- after applying the rewrite with `mkEqMPR`. Failing to return was a bug introduced in #9834.
|
||
theorem iterforin (xs : Array Nat) {P} :
|
||
Triple (m := StateT Nat Id) (do
|
||
let mut sum := 0
|
||
let _ ← f
|
||
return sum) ⌜P⌝ (⇓r => ⌜r = sorry⌝) := by
|
||
mvcgen
|
||
sorry
|