This PR changes `Lean.Order.CCPO` and `.CompleteLattice` to carry a Prop. This avoids the `CCPO IO` instance from being `noncomputable`.
65 lines
1.5 KiB
Text
65 lines
1.5 KiB
Text
/-!
|
||
Testing `partial_fixpoint` with monad transformers
|
||
-/
|
||
|
||
/-!
|
||
Using an `Option`-based monad
|
||
-/
|
||
|
||
abbrev M1 := ReaderT String (StateT String.Pos.Raw Option)
|
||
|
||
def parseAll1 (x : M1 α) : M1 (List α) := do
|
||
if String.Pos.Raw.atEnd (← read) (← get) then
|
||
return []
|
||
let val ← x
|
||
let list ← parseAll1 x
|
||
return val :: list
|
||
partial_fixpoint
|
||
|
||
/--
|
||
info: equations:
|
||
theorem parseAll1.eq_1 : ∀ {α : Type} (x : M1 α),
|
||
parseAll1 x = do
|
||
let __do_lift ← read
|
||
let __do_lift_1 ← get
|
||
have __do_jp : PUnit → M1 (List α) := fun y => do
|
||
let val ← x
|
||
let list ← parseAll1 x
|
||
pure (val :: list)
|
||
if String.Pos.Raw.atEnd __do_lift __do_lift_1 = true then pure []
|
||
else do
|
||
let y ← pure PUnit.unit
|
||
__do_jp y
|
||
-/
|
||
#guard_msgs in #print equations parseAll1
|
||
|
||
/-!
|
||
Using an `IO`-based monad
|
||
-/
|
||
|
||
abbrev M2 := ReaderT String (StateRefT String.Pos.Raw IO)
|
||
|
||
def parseAll2 (x : M2 α) : M2 (List α) := do
|
||
if String.Pos.Raw.atEnd (← read) (← get) then
|
||
return []
|
||
let val ← x
|
||
let list ← parseAll2 x
|
||
return val :: list
|
||
partial_fixpoint
|
||
|
||
/--
|
||
info: equations:
|
||
theorem parseAll2.eq_1 : ∀ {α : Type} (x : M2 α),
|
||
parseAll2 x = do
|
||
let __do_lift ← read
|
||
let __do_lift_1 ← get
|
||
have __do_jp : PUnit → M2 (List α) := fun y => do
|
||
let val ← x
|
||
let list ← parseAll2 x
|
||
pure (val :: list)
|
||
if String.Pos.Raw.atEnd __do_lift __do_lift_1 = true then pure []
|
||
else do
|
||
let y ← pure PUnit.unit
|
||
__do_jp y
|
||
-/
|
||
#guard_msgs in #print equations parseAll2
|