33 lines
768 B
Text
33 lines
768 B
Text
#lang lean4
|
|
inductive Expr
|
|
| Val : Int → Expr
|
|
| Var : String → Expr
|
|
| Add : Expr → Expr → Expr
|
|
| Mul : Expr → Expr → Expr
|
|
|
|
namespace Expr
|
|
|
|
protected def Expr.toString : Expr → String
|
|
| Val n => toString n
|
|
| Var x => x
|
|
| Add f g => "(" ++ Expr.toString f ++ " + " ++ Expr.toString g ++ ")"
|
|
| Mul f g => "(" ++ Expr.toString f ++ " * " ++ Expr.toString g ++ ")"
|
|
|
|
instance : ToString Expr :=
|
|
⟨Expr.toString⟩
|
|
|
|
partial def addAux : Expr → Expr → Expr
|
|
| f, Add (Val n) g => addAux (Val n) (addAux f g)
|
|
| f, g => Add f g
|
|
|
|
def add (a b : Expr) : Expr :=
|
|
addAux a b
|
|
|
|
end Expr
|
|
|
|
open Expr
|
|
|
|
def main (xs : List String) : IO UInt32 :=
|
|
do let x := Var "x";
|
|
IO.println (add (Val 1) (Add (Mul (Val 2) x) x));
|
|
pure 0
|