@@ -43,7 +43,7 @@ section SmartConstructor
4343variable
4444 [Reader S ∈ effs]
4545
46- def tmp (p : ProgN effs (Prog effs α) 1 ) : ProgN effs α 2 := sorry
46+ -- def tmp (p : ProgN effs (Prog effs α) 1) : ProgN effs α 2 := sorry
4747
4848def ask : Prog effs S :=
4949 opEff (e:=Reader S) ⟨ReaderOps.askOp, fun s => Prog.var s⟩
@@ -55,14 +55,14 @@ def ask : Prog effs S :=
5555end SmartConstructor
5656
5757-- {n : Nat} → ReaderP effs S α n → S → ProgN effs (ReaderP effs S α n) (n + 1)
58- def run'
59- (p : Prog (Reader S :: effs) (ULift α) ) :
58+ def runL
59+ (p : Prog (Reader S :: effs) α ) :
6060 S → Prog effs (ULift α) :=
6161 Prog.foldP
6262 (effs:=Reader S :: effs)
6363 (n:=1 )
6464 (P := fun n => ReaderP effs S α n)
65- (var0 := id )
65+ (var0 := ULift.up )
6666 (varS := by
6767 intro n p
6868 simp [ReaderP]; intro s
@@ -90,44 +90,43 @@ def run'
9090 | .inl x => nomatch x
9191 | .inr op' => by
9292 simp [ReaderP]; intro s
93- apply ProgN.scp
94- intro resp
9593 simp [ReaderP, Reader] at k
9694 rw [pos_scps_inr] at k
97- sorry
98- -- apply ProgN.varS
99- -- apply k
100- -- exact ((fun a => resp) ∘ k resp) s
101- -- exact s
102- )
103- -- fun st => Prog.scp ⟨s, fun p => ProgN.varS (k p st)⟩ )
95+ apply ProgN.scp op'
96+ intro resp
97+ specialize k resp s
98+ apply Prog.bindN' k
99+ intro scoped_prog
100+ specialize scoped_prog s
101+ exact ProgN.varS scoped_prog )
104102 p
105103
104+ def run' (p : Prog (Reader S :: effs) α) (s : S) : Prog effs α :=
105+ Prog.mapU ULift.down (runL p s)
106+
106107def run
107108 (s : S)
108- (p : Prog (Reader S :: effs) (ULift α) ) :
109- Prog effs (ULift α) :=
109+ (p : Prog (Reader S :: effs) α ) :
110+ Prog effs α :=
110111 run' p s
111112
112113end Reader
113114
114115section Examples
115116
116- -- open Reader
117+ open Reader
117118
118- -- def tick {effs} [Reader Nat ∈ effs] : Prog effs Nat := do
119- -- ask
119+ def tick {effs} [Reader Nat ∈ effs] : Prog effs Nat := do
120+ ask
120121
121- -- def prog : Prog [Reader Nat] (List Nat) := do
122- -- let l1 ← ask
123- -- let l2 ← localR (fun x => x + 1) ask
124- -- let l3 ← ask
125- -- pure [l1, l2 , l3]
122+ def prog : Prog [Reader Nat] (List Nat) := do
123+ let l1 ← ask
124+ -- let l2 ← localR (fun x => x + 1) ask
125+ let l3 ← ask
126+ pure [l1, l3]
126127
127- -- #guard Prog.run (Reader.run 0 prog) = [ 0,1,1 ]
128+ #guard Prog.run (Reader.run 0 prog) = [0 , 0 ]
128129
129130-- #guard Prog.run (Reader.run 0 (do ask)) = 0
130131
131-
132-
133- -- end Examples
132+ end Examples
0 commit comments