Skip to content

Commit 61b0cc9

Browse files
committed
fix: handling metavariables in real-to-float
1 parent ba30d9e commit 61b0cc9

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

β€ŽCvxLean/Command/Solve/Float/RealToFloat.lean

+18-5
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,29 @@ partial def realToFloat (e : Expr) : MetaM Expr := do
2323
let translations ← discrTree.getMatch e
2424
for translation in translations do
2525
let (mvars, _, pattern) ← lambdaMetaTelescope translation.real
26+
trace[Meta.debug] (s!"`real-to-float` trying:\n{pattern}\n{e}")
27+
trace[Meta.debug] (s!"`real-to-float` mvars:\n{mvars}")
2628
if ← isDefEq pattern e then
27-
-- TODO: Search for conditions.
29+
-- TODO: Search for conditions.
2830
let args ← mvars.mapM instantiateMVars
31+
trace[Meta.debug] (s!"`real-to-float` matched:\n{pattern}\n{e}")
2932
return mkAppNBeta translation.float args
3033
else
3134
trace[Meta.debug] "`real-to-float` error: no match for \n{pattern} \n{e}"
3235
match e with
3336
| Expr.app a b => return mkApp (← realToFloat a) (← realToFloat b)
34-
| Expr.lam n ty b d => return mkLambda n d (← realToFloat ty) (← realToFloat b)
35-
| Expr.forallE n ty b d => return mkForall n d (← realToFloat ty) (← realToFloat b)
37+
| Expr.lam n ty b d => do
38+
withLocalDecl n d (← realToFloat ty) fun fvar => do
39+
let b := b.instantiate1 fvar
40+
let bF ← realToFloat b
41+
mkLambdaFVars #[fvar] bF
42+
-- return mkLambda n d (← realToFloat ty) (← realToFloat b)
43+
| Expr.forallE n ty b d => do
44+
withLocalDecl n d (← realToFloat ty) fun fvar => do
45+
let b := b.instantiate1 fvar
46+
let bF ← realToFloat b
47+
mkForallFVars #[fvar] bF
48+
-- return mkForall n d (← realToFloat ty) (← realToFloat b)
3649
| Expr.mdata m e => return mkMData m (← realToFloat e)
3750
| Expr.letE n ty t b _ => return mkLet n (← realToFloat ty) (← realToFloat t) (← realToFloat b)
3851
| Expr.proj typeName idx struct => return mkProj typeName idx (← realToFloat struct)
@@ -183,7 +196,7 @@ addRealToFloat (i) : @instHDiv Real i :=
183196
addRealToFloat (i) : @HPow.hPow Real Nat Real i :=
184197
fun f n => Float.pow f (Float.ofNat n)
185198

186-
addRealToFloat (i) : @HPow.hPow Real Real Real i :=
199+
addRealToFloat (i) : @HPow.hPow.{0, 0, 0} Real Real Real i :=
187200
fun f n => Float.pow f n
188201

189202
addRealToFloat (Ξ²) (i) : @instHPow Real Ξ² i :=
@@ -217,7 +230,7 @@ addRealToFloat : @Real.log :=
217230
Float.log
218231

219232
def Float.norm {n : β„•} (x : Fin n β†’ Float) : Float :=
220-
Float.sqrt (Vec.Computable.sum (Vec.map (Float.pow Β· 2) x))
233+
Float.sqrt (Vec.Computable.sum (fun i => (Float.pow (x i) 2)))
221234

222235
addRealToFloat (n) (i) : @Norm.norm.{0} (Fin n β†’ ℝ) i :=
223236
@Float.norm n

0 commit comments

Comments
Β (0)