It implements in the kernel the optimization in the previous commit. This commit addresses the following issue raised on Zulip. https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/unfold.20essentially.20loops/near/288083209
35 lines
695 B
Text
35 lines
695 B
Text
inductive Wrapper where
|
||
| wrap: Wrapper
|
||
|
||
def Wrapper.extend: Wrapper → (Unit × Unit)
|
||
| .wrap => ((), ())
|
||
|
||
mutual
|
||
inductive Op where
|
||
| mk: String → Block → Op
|
||
|
||
inductive Assign where
|
||
| mk : String → Op → Assign
|
||
|
||
inductive Block where
|
||
| mk: Assign → Block
|
||
| empty: Block
|
||
end
|
||
|
||
mutual
|
||
def runOp: Op → Wrapper
|
||
| .mk _ r => let r' := runBlock r; .wrap
|
||
|
||
def runAssign: Assign → Wrapper
|
||
| .mk _ op => runOp op
|
||
|
||
def runBlock: Block → Wrapper
|
||
| .mk a => runAssign a
|
||
| .empty => .wrap
|
||
end
|
||
|
||
private def b: Assign := .mk "r" (.mk "APrettyLongString" .empty)
|
||
|
||
theorem bug: (runAssign b).extend.snd = (runAssign b).extend.snd := by
|
||
--unfold b -- extremely slow
|
||
sorry
|