Skip to content
This repository was archived by the owner on Aug 22, 2025. It is now read-only.

Commit 5ff949a

Browse files
committed
fix forIn, for now only implemented for finite iterators
1 parent 4d55711 commit 5ff949a

File tree

9 files changed

+27
-38
lines changed

9 files changed

+27
-38
lines changed

Iterator/Basic.lean

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,8 @@ instance [Small.{w} α] [Small.{w} β] : Small.{w} (IterStep α β) where
128128
| .skip it => .skip it.inflate
129129
| .done => .done
130130
deflate_inflate {x} := by
131-
dsimp only
132131
cases x <;> simp
133132
inflate_deflate {x} := by
134-
dsimp only
135133
cases x <;> simp }⟩
136134

137135
def IterStep.successor : IterStep α β → Option α

Iterator/Combinators/Drop.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,6 @@ instance Drop.instFinitenessRelation [Iterator α m β] [Monad m] [Finite α m]
144144
instance Drop.instIteratorToArray [Monad m] [Iterator α m β] [Finite α m] : IteratorToArray (Drop α m β) m :=
145145
.defaultImplementation
146146

147-
instance Drop.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] :
147+
instance Drop.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] [Finite α m] :
148148
IteratorFor (Drop α m β) m n :=
149149
.defaultImplementation

Iterator/Combinators/FilterMap.lean

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ instance {f : β → HetT m (Option γ)} [Finite α m] :
176176
IteratorToArray (FilterMapMH α f) m :=
177177
.defaultImplementation
178178

179-
instance FilterMapMH.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] :
179+
instance FilterMapMH.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n]
180+
[Iterator α m β] [Finite α m] :
180181
IteratorFor (FilterMapMH α f) m n :=
181182
.defaultImplementation
182183

@@ -191,7 +192,8 @@ instance {f : β → HetT m γ} [IteratorToArray α m] :
191192
(fun x => do g ((← (f x).computation).inflate (small := _)))
192193
it.inner.inner
193194

194-
instance MapMH.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] :
195+
instance MapMH.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n]
196+
[Iterator α m β] [Finite α m] :
195197
IteratorFor (MapMH α f) m n :=
196198
.defaultImplementation
197199

Iterator/Combinators/FlatMap.lean

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,8 @@ instance FlatMap.instIteratorToArray [Monad m] [Iterator α₂ m γ] [Finite α
340340
IteratorToArray (FlatMap α f) m :=
341341
.defaultImplementation
342342

343-
instance FlatMap.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α₂ m γ] :
343+
instance FlatMap.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α₂ m γ]
344+
[Finite α m] [Finite α₂ m] :
344345
IteratorFor (FlatMap α f) m n :=
345346
.defaultImplementation
346347

@@ -452,7 +453,8 @@ instance SigmaIterator.instIteratorToArray [Monad m] [∀ b, Iterator (α b) m
452453
IteratorToArray (SigmaIterator α m γ) m :=
453454
.defaultImplementation
454455

455-
instance SigmaIterator.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [∀ b, Iterator (α b) m γ] :
456+
instance SigmaIterator.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n]
457+
[∀ b, Iterator (α b) m γ] [∀ b, Finite (α b) m] :
456458
IteratorFor (SigmaIterator α m γ) m n :=
457459
.defaultImplementation
458460

Iterator/Combinators/MonadLift.lean

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ instance MonadLiftIterator.instIterator {_ : Iterator α m β} {_ : MonadLiftT m
3535
| .skip it' h => pure <| .deflate <| .skip ⟨⟨it'⟩⟩ (.skip h)
3636
| .done h => pure <| .deflate <| .done (.done h)
3737

38-
instance MonadLiftIterator.instIteratorFor [Monad n] [Monad n'] [MonadLiftT n n'] {_ : Iterator α m β} {_ : MonadLiftT m n} :
39-
IteratorFor (MonadLiftIterator α m n) n n' :=
40-
.defaultImplementation
41-
4238
instance {_ : Iterator α m β} [Finite α m] {_ : MonadLiftT m n} : FinitenessRelation (MonadLiftIterator α m n) n where
4339
rel := InvImage IterM.TerminationMeasures.Finite.rel fun it => it.inner.inner.finitelyManySteps
4440
wf := by
@@ -56,6 +52,11 @@ instance {_ : Iterator α m β} [Finite α m] {_ : MonadLiftT m n} : FinitenessR
5652
case done h =>
5753
cases h
5854

55+
instance MonadLiftIterator.instIteratorFor [Monad n] [Monad n'] [MonadLiftT n n']
56+
[Iterator α m β] [Finite α m] {_ : MonadLiftT m n} :
57+
IteratorFor (MonadLiftIterator α m n) n n' :=
58+
.defaultImplementation
59+
5960
variable (n) in
6061
@[always_inline, inline]
6162
def IterM.monadLift [Iterator α m β] {_ : MonadLiftT m n} (it : IterM (α := α) m β) :=

Iterator/Combinators/Take.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ instance Take.instFinitenessRelation [Monad m] [Iterator α m β] [Productive α
168168
instance Take.instIteratorToArray [Monad m] [Iterator α m β] [Productive α m] : IteratorToArray (Take α m β) m :=
169169
.defaultImplementation
170170

171-
instance Take.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] :
171+
instance Take.instIteratorFor [Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] [Finite α m] :
172172
IteratorFor (Take α m β) m n :=
173173
.defaultImplementation
174174
-- TODO: use [IteratorFor α m n]

Iterator/Consumers/Loop.lean

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import Iterator.Basic
22

3-
set_option trace.Elab.Tactic.monotonicity true in
43
@[specialize]
54
def IterM.DefaultConsumers.forIn {m : Type w → Type w'} {n : Type w → Type w''} [Monad n] [MonadLiftT m n]
6-
{α : Type w} {β : Type v} {γ : Type w} [Nonempty (n γ)]
7-
[Iterator α m β]
5+
{α : Type w} {β : Type v} {γ : Type w}
6+
[Iterator α m β] [Finite α m]
87
(it : IterM (α := α) m β) (init : γ) {successor_of : β → γ → γ → Prop}
98
(f : (b : β) → (c : γ) → n (Subtype fun s : ForInStep γ => successor_of b c s.value)) : n γ := do
109
match (← it.stepH).inflate with
@@ -14,24 +13,25 @@ def IterM.DefaultConsumers.forIn {m : Type w → Type w'} {n : Type w → Type w
1413
| ⟨.done c, _⟩ => return c
1514
| .skip it' _ => IterM.DefaultConsumers.forIn it' init f
1615
| .done _ => return init
17-
partial_fixpoint
16+
termination_by it.finitelyManySteps
1817

1918
class IteratorFor (α : Type w) (m : Type w → Type w') {β : Type v} [Iterator α m β] (n : Type w → Type w'') where
2019
forIn : ∀ {γ : Type w}, IterM (α := α) m β → γ → {successor_of : β → γ → γ → Prop} →
2120
((b : β) → (c : γ) → n (Subtype fun s : ForInStep γ => successor_of b c s.value)) →
22-
(IterM.ForInWillTerminate α m successor_of) → n γ
21+
n γ
2322

2423
class LawfulIteratorFor (α : Type w) (m : Type w → Type w') (n : Type w → Type w'')
25-
[Monad n] [Iterator α m β] [IteratorFor α m n] [MonadLiftT m n] where
24+
[Monad n] [Iterator α m β] [Finite α m] [IteratorFor α m n] [MonadLiftT m n] where
2625
lawful : ∀ γ, IteratorFor.forIn (α := α) (m := m) (n := n) (γ := γ) =
2726
IterM.DefaultConsumers.forIn (α := α) (m := m) (n := n) (γ := γ)
2827

2928
def IteratorFor.defaultImplementation {α : Type w} {m : Type w → Type w'} {n : Type w → Type w'}
30-
[Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] : IteratorFor α m n where
29+
[Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] [Finite α m] :
30+
IteratorFor α m n where
3131
forIn := IterM.DefaultConsumers.forIn
3232

3333
instance (α : Type w) (m : Type w → Type w') (n : Type w → Type w')
34-
[Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] :
34+
[Monad m] [Monad n] [MonadLiftT m n] [Iterator α m β] [Finite α m] :
3535
haveI : IteratorFor α m n := .defaultImplementation
3636
LawfulIteratorFor α m n :=
3737
letI : IteratorFor α m n := .defaultImplementation
@@ -40,21 +40,9 @@ instance (α : Type w) (m : Type w → Type w') (n : Type w → Type w')
4040
instance {m : Type w → Type w'} {n : Type w → Type w''}
4141
{α : Type w} {β : Type v} [Iterator α m β] [Finite α m] [IteratorFor α m n] :
4242
ForIn n (IterM (α := α) m β) β where
43-
forIn it init stepper := by
44-
apply IteratorFor.forIn it init (successor_of := fun _ _ _ => True) (fun b c => (⟨·, True.intro⟩) <$> stepper b c)
45-
simp only [IterM.ForInWillTerminate]
46-
refine Subrelation.wf (r := InvImage IterM.TerminationMeasures.Finite.rel (fun p => p.1.finitelyManySteps)) ?_ ?_
47-
· intro p' p h
48-
cases h
49-
· apply IterM.TerminationMeasures.Finite.rel_of_skip
50-
rename_i h
51-
exact h.1
52-
· rename_i h
53-
obtain ⟨out, h, _⟩ := h -- Interesting: Moving `obtain` after `apply` leads to failure
54-
apply IterM.TerminationMeasures.Finite.rel_of_yield
55-
exact h
56-
· apply InvImage.wf
57-
exact WellFoundedRelation.wf
43+
forIn it init stepper := IteratorFor.forIn it init
44+
(successor_of := fun _ _ _ => True)
45+
(fun b c => (⟨·, True.intro⟩) <$> stepper b c)
5846

5947
@[specialize]
6048
def IterM.foldM {m : Type w → Type w'} {n : Type w → Type w'} [Monad n]

Iterator/Producers.lean

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,4 @@ instance [Pure m] : ProductivenessRelation (UnfoldIterator α f) m where
8181
wf := emptyWf.wf
8282
subrelation {it it'} h := by cases h
8383

84-
instance [Monad m] [Monad n] [MonadLiftT m n] : IteratorFor (UnfoldIterator α f) m n :=
85-
.defaultImplementation
86-
8784
end Unfold

Iterator/Pure/Consumers/Loop.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import Iterator.Pure.Basic

0 commit comments

Comments
 (0)