- Spa.Language.Base: Expr/BasicStmt/Stmt + HasVar relations; StringSet lifts to Finset String - Spa.Language.Semantics: Value/Env/Env.Mem, big-step relations, LatticeInterpretation (respects-≈ field drops out with =) - Spa.Language.Graphs: Graph with nodes : Fin size → List BasicStmt (Vec lookup lemmas lift to Fin.append_left/right), comp/link/loop/ skipto/singleton/wrap/buildCfg, predecessors via List.finRange - Spa.Language.Traces: Trace + EndToEndTrace (Prop-valued) - Spa.Language.Properties: trace embeddings, loop lemmas, buildCfg_sufficient; the 80-line Fin-disjointness block reduces to castAdd_ne_natAdd + mathlib list lemmas - Spa.Language: Program (vars via Finset.sort — toList is noncomputable) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
39 lines
1.6 KiB
Lean4
39 lines
1.6 KiB
Lean4
/-
|
|
Port of `Language/Traces.agda`.
|
|
|
|
Correspondence:
|
|
Trace ↦ Trace (a `Prop`-valued inductive; only used in proofs)
|
|
_++⟨_⟩_ ↦ Trace.concat
|
|
EndToEndTrace ↦ EndToEndTrace (a `Prop`-valued structure, like `∃`; its
|
|
fields are accessed by destructuring inside proofs)
|
|
-/
|
|
import Spa.Language.Semantics
|
|
import Spa.Language.Graphs
|
|
|
|
namespace Spa
|
|
|
|
/-- Agda: `Trace`. -/
|
|
inductive Trace (g : Graph) : g.Index → g.Index → Env → Env → Prop
|
|
| single {ρ₁ ρ₂ : Env} {idx : g.Index} :
|
|
EvalBasicStmts ρ₁ (g.nodes idx) ρ₂ → Trace g idx idx ρ₁ ρ₂
|
|
| edge {ρ₁ ρ₂ ρ₃ : Env} {idx₁ idx₂ idx₃ : g.Index} :
|
|
EvalBasicStmts ρ₁ (g.nodes idx₁) ρ₂ → (idx₁, idx₂) ∈ g.edges →
|
|
Trace g idx₂ idx₃ ρ₂ ρ₃ → Trace g idx₁ idx₃ ρ₁ ρ₃
|
|
|
|
/-- Agda: `_++⟨_⟩_`. -/
|
|
theorem Trace.concat {g : Graph} {idx₁ idx₂ idx₃ idx₄ : g.Index}
|
|
{ρ₁ ρ₂ ρ₃ : Env} (tr₁ : Trace g idx₁ idx₂ ρ₁ ρ₂)
|
|
(he : (idx₂, idx₃) ∈ g.edges) (tr₂ : Trace g idx₃ idx₄ ρ₂ ρ₃) :
|
|
Trace g idx₁ idx₄ ρ₁ ρ₃ := by
|
|
induction tr₁ with
|
|
| single hbs => exact Trace.edge hbs he tr₂
|
|
| edge hbs he' _ ih => exact Trace.edge hbs he' (ih he tr₂)
|
|
|
|
/-- Agda: `EndToEndTrace` (an existential package, destructured in proofs). -/
|
|
inductive EndToEndTrace (g : Graph) (ρ₁ ρ₂ : Env) : Prop
|
|
| intro (idx₁ : g.Index) (idx₁_mem : idx₁ ∈ g.inputs)
|
|
(idx₂ : g.Index) (idx₂_mem : idx₂ ∈ g.outputs)
|
|
(trace : Trace g idx₁ idx₂ ρ₁ ρ₂) : EndToEndTrace g ρ₁ ρ₂
|
|
|
|
end Spa
|