Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
d562e6f
feat(core): Change Core.ExpressionMetadata from Unit to SourceRange (…
MikaelMayer Apr 28, 2026
75554c5
fix: Replace fragile repr string matching with AST pattern matching i…
MikaelMayer Apr 28, 2026
df191e1
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 28, 2026
2214b98
fix: Use DDM formatter for axiom extraction guard_msgs test
MikaelMayer Apr 28, 2026
cdc5568
fix: Propagate source range metadata instead of using SourceRange.none
MikaelMayer Apr 28, 2026
a5bae51
style: Remove stray blank line in match block
MikaelMayer Apr 28, 2026
faa5bfc
refactor: Address PR review nits — remove extra blank lines, extract …
MikaelMayer Apr 28, 2026
35b7bdd
fix: Make SourceRange equality trivial to prevent metadata-sensitive …
MikaelMayer Apr 28, 2026
1d366a5
merge: Resolve conflict with main after Laurel metadata removal
MikaelMayer Apr 28, 2026
679c9cd
fix: Document or propagate SourceRange for all SourceRange.none occur…
MikaelMayer Apr 28, 2026
262de85
style: Add group comment for semantic typeclass instances using Sourc…
MikaelMayer Apr 28, 2026
877e5fc
fix: Update pyInterpret golden-file expectations for SourceRange meta…
MikaelMayer Apr 28, 2026
199002a
feat: Add CI check for unsuppressed SourceRange.none usage
MikaelMayer Apr 28, 2026
315d1d7
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 28, 2026
c2c2b02
style: Rename suppression markers to nosourcerange: with required exp…
MikaelMayer Apr 28, 2026
229e024
fix: Use SourceRange.isNone instead of == default for source location…
MikaelMayer Apr 28, 2026
23b0657
fix: Restore test_unsupported_config.expected golden file
MikaelMayer Apr 28, 2026
e1285c0
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 28, 2026
5587774
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 29, 2026
1c5cfab
ci: Retrigger CI after transient label-conflicts bot failure
MikaelMayer Apr 29, 2026
21acdf1
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 29, 2026
d5d5e0d
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 29, 2026
cdda793
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 29, 2026
dbd7340
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 29, 2026
d7f9c91
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 29, 2026
1521c69
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 30, 2026
ce09d71
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 30, 2026
fad8a91
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer Apr 30, 2026
43a46d0
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 1, 2026
780972f
Fix SMTEncoderTests: use Strata.SourceRange.none instead of () for me…
MikaelMayer May 1, 2026
31618de
Add Uri to ExpressionMetadata via ExprSourceLoc struct
MikaelMayer May 1, 2026
933dea8
Address review: unify URI helpers, fix missing URI propagation
MikaelMayer May 1, 2026
db0bdf6
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 1, 2026
640527d
Fix guard_msgs: update SourceRange.eq_trivial to ExprSourceLoc.eq_tri…
MikaelMayer May 1, 2026
5778a48
Preserve source location in Traceable.combine during expression evalu…
MikaelMayer May 1, 2026
1cf5e73
Store all source locations in ExprSourceLoc.relatedLocs during combine
MikaelMayer May 1, 2026
026c021
Fix dedup check in combine and ToExpr for ExprSourceLoc.relatedLocs
MikaelMayer May 1, 2026
9a87891
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 1, 2026
91b2659
Extend check script to detect ExprSourceLoc.none and guard against re…
MikaelMayer May 1, 2026
dc8e381
Add wget retry flags to CI to handle transient GitHub 500 errors
MikaelMayer May 1, 2026
e63aa2b
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 4, 2026
b1dd19d
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 4, 2026
fdeb26e
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 4, 2026
ca1f082
Remove unsound axiom SourceRange.eq_trivial, use BEq + sound DecidableEq
MikaelMayer May 4, 2026
100d56c
Remove unsound axioms, use standard BEq/DecidableEq for metadata
MikaelMayer May 4, 2026
a9abb8e
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 4, 2026
15b6e55
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 4, 2026
83da0e1
Add wget retry flags to ion-java download for CI resilience
MikaelMayer May 4, 2026
42d0d3d
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 5, 2026
01598df
Fix CI: save lake cache before tests to prevent cascading cache-miss …
MikaelMayer May 5, 2026
b4c8ac1
Retry CI: trigger fresh cache generation after transient cache-miss f…
MikaelMayer May 5, 2026
afa4139
Replace ExprSourceLoc.none with provenance-carrying alternatives in t…
MikaelMayer May 5, 2026
3dab19c
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 5, 2026
dcf8c3d
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 5, 2026
1c15802
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 5, 2026
96633bb
Retry CI: trigger fresh run after transient cache-miss failure
MikaelMayer May 5, 2026
2fcf38d
Propagate Python AST source positions to Core expressions via pyLoc h…
MikaelMayer May 5, 2026
b6e6b7d
Add nosourcerange suppression markers for legitimate ExprSourceLoc.no…
MikaelMayer May 5, 2026
787ac54
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 5, 2026
8e9f72d
Retry CI: trigger fresh run after transient cache-miss failure
MikaelMayer May 6, 2026
3eec371
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 6, 2026
53b81c5
Retry CI: trigger fresh run after transient cache-miss failure
MikaelMayer May 6, 2026
f3e9d26
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 6, 2026
63b20c4
Retry CI: trigger fresh run after transient cache-miss failure
MikaelMayer May 6, 2026
37255e2
Retry CI: trigger fresh run after transient cache-miss failure
MikaelMayer May 6, 2026
b1e472a
Remove ExprSourceLoc.none: require explicit provenance for all synthe…
MikaelMayer May 6, 2026
4ddfe14
Retry CI: trigger fresh run after transient cache-miss failure
MikaelMayer May 6, 2026
a0f2855
Retry CI: trigger fresh run after transient cache-miss failure
MikaelMayer May 7, 2026
cb1b1bf
Add nosourcerange suppression comments to fix lint check
MikaelMayer May 7, 2026
72d03c8
Make lint script comment stateless (remove historical reference)
MikaelMayer May 7, 2026
6a8ded0
feat: introduce Provenance type to track AST node origins (#1139)
MikaelMayer May 7, 2026
0d39d74
refactor: deduplicate metadata creation with shared MetaData.ofSource…
MikaelMayer May 7, 2026
beb77de
Merge remote-tracking branch 'origin/main' into issue-1139-sourcerang…
MikaelMayer May 7, 2026
9a60e78
feat: complete Provenance migration — SMT translator, metadata, and F…
MikaelMayer May 7, 2026
5e72a7e
refactor: deduplicate getFileRange via getProvenance, migrate remaini…
MikaelMayer May 7, 2026
8197406
fix: erase existing provenance before setting call site file range
MikaelMayer May 7, 2026
702c393
refactor: remove MetaDataElem.Value.fileRange variant, use .provenanc…
MikaelMayer May 7, 2026
9f8c8e2
fix: handle missing file range in getNameFromMd without dbg_trace
MikaelMayer May 7, 2026
67e77c1
fix: restore assert label format for synthesized provenance in getNam…
MikaelMayer May 7, 2026
c2f9fe1
refactor: address PR review - remove dead code, fix naming consistenc…
MikaelMayer May 8, 2026
0571c6a
merge: resolve conflict with issue-1065-extract-core-expression-metad…
MikaelMayer May 8, 2026
a6d5001
refactor: address PR review - restore doc comment, refactor synthesiz…
MikaelMayer May 8, 2026
7c438f6
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 8, 2026
192a43a
refactor: add canonical provenance constants, rename ann to smtProv
MikaelMayer May 8, 2026
2755d9d
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 8, 2026
d292bfc
ci: retrigger CI after transient cache miss
MikaelMayer May 8, 2026
336314e
refactor: replace synthesized origin strings with SynthesizedOrigin i…
MikaelMayer May 8, 2026
d59267e
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 8, 2026
297d61a
Merge remote-tracking branch 'origin/main' into issue-1139-sourcerang…
MikaelMayer May 8, 2026
9801a67
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 8, 2026
0e8a827
fix: use ExprSourceLoc metadata in TerminationCheck instead of Unit
MikaelMayer May 8, 2026
c084fbf
refactor: address PR review - restore doc comment, refactor synthesiz…
MikaelMayer May 8, 2026
7e0c150
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 8, 2026
034053a
Merge remote-tracking branch 'origin/main' into issue-1139-sourcerang…
MikaelMayer May 8, 2026
b1c4e47
Merge branch 'main' into issue-1065-extract-core-expression-metadata-…
MikaelMayer May 8, 2026
5c28c0c
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 8, 2026
a71ad55
CI: add comment explaining cache save ordering
MikaelMayer May 8, 2026
fe66bcd
CI: remove if: always() from cache save (now before tests, broken cac…
MikaelMayer May 9, 2026
4f128e4
CI: add explicit permissions to build_and_test_lean job
MikaelMayer May 9, 2026
0fcdc25
Add PR template warning about repository split (#1166)
atomb May 14, 2026
127b40b
Merge remote-tracking branch 'origin/main' into issue-1139-sourcerang…
MikaelMayer May 14, 2026
f43acb8
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 14, 2026
99b84e5
lake: build Strata lib as a test-driver dependency (#1138)
tautschnig May 15, 2026
c9210e8
Merge remote-tracking branch 'origin/main' into issue-1139-sourcerang…
MikaelMayer May 15, 2026
f42d2dd
Merge remote-tracking branch 'origin/issue-1139-sourcerange-none-and-…
MikaelMayer May 15, 2026
8acaa4b
The small-step semantics of Imperative must have scoped var init, rem…
aqjune-aws May 15, 2026
a5d36ed
Support SMT string literals and common string ops in translateTerm (#…
tautschnig May 15, 2026
e669711
CI: grant actions:write to build_and_test_lean for cache save
MikaelMayer May 15, 2026
50b0e12
feat: introduce Provenance type and migrate metadata from FileRange (…
MikaelMayer May 15, 2026
f7b1a82
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 15, 2026
97cfec2
ci: retrigger CI after transient cache miss
MikaelMayer May 15, 2026
1d47569
Fix bug: ADT constructors do not change `Map` to `Array` when using u…
thanhnguyen-aws May 18, 2026
75e806e
Core.formatProgram to produce round-trip-parseable output for all con…
MikaelMayer May 18, 2026
a66e9c9
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 18, 2026
192b780
Abstract Solver Interface: Decouple Term Construction from SMT-LIB En…
MikaelMayer May 18, 2026
6835d65
Fix #1146: require command_datatypes to be non-empty (#1155)
tautschnig May 18, 2026
64e4c1f
ci: retrigger CI after transient cache miss
MikaelMayer May 18, 2026
e446a5b
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 18, 2026
d7a390d
ci: retrigger CI after transient cache miss
MikaelMayer May 18, 2026
f6d195a
Split StrataMain.lean into importable library and thin executable roo…
MikaelMayer May 18, 2026
09c2e63
Merge remote-tracking branch 'origin/main' into issue-1065-extract-co…
MikaelMayer May 18, 2026
a424e47
Merge remote-tracking branch 'origin/main2' into issue-1065-extract-c…
MikaelMayer May 18, 2026
adefdac
Merge remote-tracking branch 'origin/main2' into issue-1065-extract-c…
MikaelMayer May 19, 2026
c1061d0
Merge remote-tracking branch 'origin/main2' into issue-1065-extract-c…
MikaelMayer May 19, 2026
8defae4
Merge remote-tracking branch 'origin/main2' into issue-1065-extract-c…
MikaelMayer May 20, 2026
cbcde3e
Remove checkNoSourceRangeNone CI check (SourceRange.none removed upst…
MikaelMayer May 21, 2026
2115df1
Merge remote-tracking branch 'origin/main2' into issue-1065-extract-c…
MikaelMayer May 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Strata/Backends/CBMC/CoreToCBMC.lean
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ end

def listToExpr (l: ListMap CoreLabel Core.Procedure.Check) : Core.Expression.Expr :=
match l with
| _ => .true ()
| _ => Core.true

def createContractSymbolFromAST (func : Core.Procedure) : Except String CBMCSymbol := do
let location : Location := {
Expand Down
3 changes: 2 additions & 1 deletion Strata/DDM/Util/SourceRange.lean
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@ structure SourceRange where
start : String.Pos.Raw
/-- One past the end of the range. -/
stop : String.Pos.Raw
deriving DecidableEq, Inhabited, Repr
deriving Inhabited, Repr, DecidableEq, BEq

namespace SourceRange

@[expose]
def none : SourceRange := { start := 0, stop := 0 }

def isNone (loc : SourceRange) : Bool := loc.start = 0 ∧ loc.stop = 0
Expand Down
3 changes: 3 additions & 0 deletions Strata/DL/Imperative/PureExpr.lean
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ class HasBool (P : PureExpr) where
ff : P.Expr
tt_is_not_ff: tt ≠ ff
boolTy : P.Ty
/-- Check if an expression represents `true`. Defaults to `e == tt` but
implementations may override to ignore metadata. -/
isTt : [BEq P.Expr] → P.Expr → Bool := fun e => e == tt

class HasNot (P : PureExpr) extends HasBool P where
not : P.Expr → P.Expr
Expand Down
4 changes: 2 additions & 2 deletions Strata/DL/Imperative/StmtEval.lean
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def runStep [BEq P.Expr] [HasBool P]
| .det e =>
match ops.evalExpr ρ e with
| some v =>
if v == HasBool.tt then .stmts tss ρ
if HasBool.isTt v then .stmts tss ρ
else .stmts ess ρ
| none => .terminal (ops.addError ρ "ITE condition did not reduce to bool")

Expand All @@ -71,7 +71,7 @@ def runStep [BEq P.Expr] [HasBool P]
| .det g =>
match ops.evalExpr ρ g with
| some v =>
if v == HasBool.tt then .stmts (body ++ [s]) ρ
if HasBool.isTt v then .stmts (body ++ [s]) ρ
else .terminal ρ
| none => .terminal (ops.addError ρ "Loop guard did not reduce to bool")

Expand Down
62 changes: 39 additions & 23 deletions Strata/DL/Lambda/LExpr.lean
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,21 @@ instance {T: LExprParamsT} [DecidableEq T.base.Metadata] [DecidableEq T.TypeType
else
isFalse (fun heq => h (LExpr.beq_eq e1 e2 |>.mpr heq))

/-- Structural equality ignoring metadata fields. Does not allocate intermediate expressions. -/
def LExpr.beqIgnoringMetadata [BEq T.TypeType] [BEq (Identifier T.base.IDMeta)] : LExpr T → LExpr T → Bool
| .const _ c1, .const _ c2 => c1 == c2
| .op _ o1 ty1, .op _ o2 ty2 => o1 == o2 && ty1 == ty2
| .bvar _ i1, .bvar _ i2 => i1 == i2
| .fvar _ n1 ty1, .fvar _ n2 ty2 => n1 == n2 && ty1 == ty2
| .abs _ name1 ty1 e1, .abs _ name2 ty2 e2 => name1 == name2 && ty1 == ty2 && beqIgnoringMetadata e1 e2
| .quant _ k1 name1 ty1 tr1 e1, .quant _ k2 name2 ty2 tr2 e2 =>
k1 == k2 && name1 == name2 && ty1 == ty2 && beqIgnoringMetadata tr1 tr2 && beqIgnoringMetadata e1 e2
| .app _ fn1 e1, .app _ fn2 e2 => beqIgnoringMetadata fn1 fn2 && beqIgnoringMetadata e1 e2
| .ite _ c1 t1 f1, .ite _ c2 t2 f2 =>
beqIgnoringMetadata c1 c2 && beqIgnoringMetadata t1 t2 && beqIgnoringMetadata f1 f2
| .eq _ e1a e1b, .eq _ e2a e2b => beqIgnoringMetadata e1a e2a && beqIgnoringMetadata e1b e2b
| _, _ => false

def LExpr.noTrigger {T : LExprParamsT} (m : T.base.Metadata) : LExpr T := .bvar m 0
def LExpr.allTr {T : LExprParamsT} (m : T.base.Metadata) (name : String) (ty : Option T.TypeType) := @LExpr.quant T m .all name ty
def LExpr.all {T : LExprParamsT} (m : T.base.Metadata) (name : String) (ty : Option T.TypeType) := @LExpr.quant T m .all name ty (LExpr.noTrigger m)
Expand Down Expand Up @@ -694,6 +709,7 @@ open Lean Elab Meta
meta class MkLExprParams (T: LExprParams) where
elabIdent : Lean.Syntax → MetaM Expr
toExpr : Expr
defaultMetadata : MetaM Expr := mkAppM ``Unit.unit #[]

declare_syntax_cat lidentmono

Expand All @@ -720,30 +736,30 @@ meta def mkNegLit (n: NumLit) := Expr.app (.const ``Int.neg []) (mkIntLit n)

meta def elabLConstMono [MkLExprParams T] : Lean.Syntax → MetaM Expr
| `(lconstmono| #$n:num) => do
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let intVal := mkIntLit n
let lconstVal ← mkAppM ``LConst.intConst #[intVal]
return mkAppN (.const ``LExpr.const []) #[tMono, metadata, lconstVal]
| `(lconstmono| #-$n:num) => do
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let intVal := mkNegLit n
let lconstVal ← mkAppM ``LConst.intConst #[intVal]
return mkAppN (.const ``LExpr.const []) #[tMono, metadata, lconstVal]
| `(lconstmono| #true) => do
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let lconstVal ← mkAppM ``LConst.boolConst #[toExpr true]
return mkAppN (.const ``LExpr.const []) #[tMono, metadata, lconstVal]
| `(lconstmono| #false) => do
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let lconstVal ← mkAppM ``LConst.boolConst #[toExpr false]
return mkAppN (.const ``LExpr.const []) #[tMono, metadata, lconstVal]
| `(lconstmono| #$s:ident) => do
let s := toString s.getId
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let lconstVal ← mkAppM ``LConst.strConst #[mkStrLit s]
return mkAppN (.const ``LExpr.const []) #[tMono, metadata, lconstVal]
Expand All @@ -757,13 +773,13 @@ scoped syntax lopmono : lexprmono
meta def elabLOpMono [MkLExprParams T] : Lean.Syntax → MetaM Expr
| `(lopmono| ~$s:lidentmono) => do
let none ← mkNone (mkConst ``LMonoTy)
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.op []) #[tMono, metadata, ← MkLExprParams.elabIdent T s, none]
| `(lopmono| (~$s:lidentmono : $ty:lmonoty)) => do
let lmonoty ← Lambda.LTy.Syntax.elabLMonoTy ty
let lmonoty ← mkSome (mkConst ``LMonoTy) lmonoty
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.op []) #[tMono, metadata, ← MkLExprParams.elabIdent T s, lmonoty]
| _ => throwUnsupportedSyntax
Expand All @@ -772,7 +788,7 @@ declare_syntax_cat lbvarmono
scoped syntax "%" noWs num : lbvarmono
meta def elabLBVarMono [MkLExprParams T] : Lean.Syntax → MetaM Expr
| `(lbvarmono| %$n:num) => do
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.bvar []) #[tMono, metadata, mkNatLit n.getNat]
| _ => throwUnsupportedSyntax
Expand All @@ -785,13 +801,13 @@ scoped syntax "(" lidentmono ":" lmonoty ")" : lfvarmono
meta def elabLFVarMono [MkLExprParams T] : Lean.Syntax → MetaM Expr
| `(lfvarmono| $i:lidentmono) => do
let none ← mkNone (mkConst ``LMonoTy)
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.fvar []) #[tMono, metadata, ← MkLExprParams.elabIdent T i, none]
| `(lfvarmono| ($i:lidentmono : $ty:lmonoty)) => do
let lmonoty ← Lambda.LTy.Syntax.elabLMonoTy ty
let lmonoty ← mkSome (mkConst ``LMonoTy) lmonoty
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.fvar []) #[tMono, metadata, ← MkLExprParams.elabIdent T i, lmonoty]
| _ => throwUnsupportedSyntax
Expand Down Expand Up @@ -842,32 +858,32 @@ meta partial def elabLExprMono [MkLExprParams T] : Lean.Syntax → MetaM Expr
| `(lexprmono| λ $e:lexprmono) => do
let e' ← elabLExprMono (T:=T) e
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
return mkAppN (.const ``LExpr.absUntyped []) #[tMono, metadata, e']
| `(lexprmono| λ ($mty:lmonoty): $e:lexprmono) => do
let lmonoty ← Lambda.LTy.Syntax.elabLMonoTy mty
let lmonoty ← mkSome (mkConst ``LMonoTy) lmonoty
let e' ← elabLExprMono (T:=T) e
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
return mkAppN (.const ``LExpr.abs []) #[tMono, metadata, mkStrLit "", lmonoty, e']
| `(lexprmono| ∀ $e:lexprmono) => do
let e' ← elabLExprMono (T:=T) e
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
return mkAppN (.const ``LExpr.allUntyped []) #[tMono, metadata, e']
| `(lexprmono| ∀ {$tr}$e:lexprmono) => do
let e' ← elabLExprMono (T:=T) e
let tr' ← elabLExprMono (T:=T) tr
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
return mkAppN (.const ``LExpr.allUntypedTr []) #[tMono, metadata, tr', e']
| `(lexprmono| ∀ ($mty:lmonoty): $e:lexprmono) => do
let lmonoty ← Lambda.LTy.Syntax.elabLMonoTy mty
let lmonoty ← mkSome (mkConst ``LMonoTy) lmonoty
let e' ← elabLExprMono (T:=T) e
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let emptyName := mkStrLit ""
return mkAppN (.const ``LExpr.all []) #[tMono, metadata, emptyName, lmonoty, e']
| `(lexprmono| ∀ ($mty:lmonoty):{$tr} $e:lexprmono) => do
Expand All @@ -876,15 +892,15 @@ meta partial def elabLExprMono [MkLExprParams T] : Lean.Syntax → MetaM Expr
let e' ← elabLExprMono (T:=T) e
let tr' ← elabLExprMono (T:=T) tr
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let emptyName := mkStrLit ""
return mkAppN (.const ``LExpr.allTr []) #[tMono, metadata, emptyName, lmonoty, tr', e']
| `(lexprmono| ∃ ($mty:lmonoty): $e:lexprmono) => do
let lmonoty ← Lambda.LTy.Syntax.elabLMonoTy mty
let lmonoty ← mkSome (mkConst ``LMonoTy) lmonoty
let e' ← elabLExprMono (T:=T) e
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let emptyName := mkStrLit ""
return mkAppN (.const ``LExpr.exist []) #[tMono, metadata, emptyName, lmonoty, e']
| `(lexprmono| ∃ ($mty:lmonoty):{$tr} $e:lexprmono) => do
Expand All @@ -893,37 +909,37 @@ meta partial def elabLExprMono [MkLExprParams T] : Lean.Syntax → MetaM Expr
let e' ← elabLExprMono (T:=T) e
let tr' ← elabLExprMono (T:=T) tr
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let emptyName := mkStrLit ""
return mkAppN (.const ``LExpr.existTr []) #[tMono, metadata, emptyName, lmonoty, tr', e']
| `(lexprmono| ∃ $e:lexprmono) => do
let e' ← elabLExprMono (T:=T) e
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.existUntyped []) #[tMono, metadata, e']
| `(lexprmono| ∃{$tr} $e:lexprmono) => do
let e' ← elabLExprMono (T:=T) e
let tr' ← elabLExprMono (T:=T) tr
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.existUntypedTr []) #[tMono, metadata, tr', e']
| `(lexprmono| ($e1:lexprmono $e2:lexprmono)) => do
let e1' ← elabLExprMono (T:=T) e1
let e2' ← elabLExprMono (T:=T) e2
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.app []) #[tMono, metadata, e1', e2']
| `(lexprmono| $e1:lexprmono == $e2:lexprmono) => do
let e1' ← elabLExprMono (T:=T) e1
let e2' ← elabLExprMono (T:=T) e2
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.eq []) #[tMono, metadata, e1', e2']
| `(lexprmono| if $e1:lexprmono then $e2:lexprmono else $e3:lexprmono) => do
let e1' ← elabLExprMono (T:=T) e1
let e2' ← elabLExprMono (T:=T) e2
let e3' ← elabLExprMono (T:=T) e3
let metadata ← mkAppM ``Unit.unit #[]
let metadata ← MkLExprParams.defaultMetadata T
let tMono ← mkAppM ``LExprParams.mono #[MkLExprParams.toExpr T]
return mkAppN (.const ``LExpr.ite []) #[tMono, metadata, e1', e2', e3']
| `(lexprmono| ($e:lexprmono)) => elabLExprMono (T:=T) e
Expand Down
2 changes: 1 addition & 1 deletion Strata/DL/Lambda/Scopes.lean
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def Scope.merge (cond : LExpr T.mono) (m1 m2 : Scope T) : Scope T :=
(k, (ty1, mkIte cond e1 e2)) ::
Scope.merge cond rest (m2.erase k)
where mkIte (cond tru fals : LExpr T.mono) : LExpr T.mono :=
if tru == fals then tru
if tru.beqIgnoringMetadata fals then tru
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖🔍 This uses beqIgnoringMetadata while the ANF encoder uses eqModuloMeta (which calls eraseMetadata then ==). Having two different metadata-ignoring comparison functions with slightly different semantics is a maintenance risk. beqIgnoringMetadata is O(n) structural recursion; eqModuloMeta allocates a new tree then compares. They should produce the same result, but having both invites divergence.

Consider consolidating to one approach (preferably beqIgnoringMetadata since it avoids allocation).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Agreed that consolidating would be ideal. eqModuloMeta exists because it has formal proofs about it (eqModuloMeta_true_implies_denote_eq in LExprDenoteEq.lean). beqIgnoringMetadata was introduced in this PR for the Scopes.lean use case where allocation-free comparison matters (it is called in a hot loop during scope merging) and no proof obligations exist. Unifying them (e.g., proving beqIgnoringMetadata equivalent to eqModuloMeta and switching the ANF encoder) is a valid follow-up but would touch the proof infrastructure and is out of scope here.

else (LExpr.ite (default : T.Metadata) cond tru fals)


Expand Down
Loading
Loading