55 lines
1.6 KiB
Lean4
55 lines
1.6 KiB
Lean4
import Mathlib.Data.Finset.Basic
|
||
|
||
namespace Spa
|
||
|
||
inductive Expr where
|
||
| add (e₁ e₂ : Expr)
|
||
| sub (e₁ e₂ : Expr)
|
||
| var (x : String)
|
||
| num (n : ℕ)
|
||
deriving DecidableEq
|
||
|
||
inductive BasicStmt where
|
||
| assign (x : String) (e : Expr)
|
||
| noop
|
||
deriving DecidableEq
|
||
|
||
inductive Stmt where
|
||
| basic (bs : BasicStmt)
|
||
| andThen (s₁ s₂ : Stmt)
|
||
| ifElse (e : Expr) (s₁ s₂ : Stmt)
|
||
| whileLoop (e : Expr) (s : Stmt)
|
||
deriving DecidableEq
|
||
|
||
inductive Expr.HasVar : String → Expr → Prop
|
||
| addLeft {e₁ e₂ k} : Expr.HasVar k e₁ → Expr.HasVar k (.add e₁ e₂)
|
||
| addRight {e₁ e₂ k} : Expr.HasVar k e₂ → Expr.HasVar k (.add e₁ e₂)
|
||
| subLeft {e₁ e₂ k} : Expr.HasVar k e₁ → Expr.HasVar k (.sub e₁ e₂)
|
||
| subRight {e₁ e₂ k} : Expr.HasVar k e₂ → Expr.HasVar k (.sub e₁ e₂)
|
||
| here {k} : Expr.HasVar k (.var k)
|
||
|
||
inductive BasicStmt.HasVar : String → BasicStmt → Prop
|
||
| assignLeft {k e} : BasicStmt.HasVar k (.assign k e)
|
||
| assignRight {k k' e} : Expr.HasVar k e → BasicStmt.HasVar k (.assign k' e)
|
||
|
||
def Expr.vars : Expr → Finset String
|
||
| .add l r => l.vars ∪ r.vars
|
||
| .sub l r => l.vars ∪ r.vars
|
||
| .var s => {s}
|
||
| .num _ => ∅
|
||
|
||
def BasicStmt.vars : BasicStmt → Finset String
|
||
| .assign x e => {x} ∪ e.vars
|
||
| .noop => ∅
|
||
|
||
def Stmt.vars : Stmt → Finset String
|
||
| .basic bs => bs.vars
|
||
| .andThen s₁ s₂ => s₁.vars ∪ s₂.vars
|
||
| .ifElse e s₁ s₂ => (e.vars ∪ s₁.vars) ∪ s₂.vars
|
||
| .whileLoop e s => e.vars ∪ s.vars
|
||
|
||
def Stmt.varsList (ss : List Stmt) : Finset String :=
|
||
ss.foldr (fun s acc => s.vars ∪ acc) ∅
|
||
|
||
end Spa
|