Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 28s
Recursive ADT with three constructors (Num/Add/Mul). simp does bottom-up rewrite using algebraic identities: x + 0 -> x 0 + x -> x x * 0 -> 0 0 * x -> 0 x * 1 -> x 1 * x -> x constant folding for Num + Num and Num * Num Uses tuple pattern in nested match: 'match (simp a, simp b) with'. Add (Mul (Num 3, Num 5), Add (Num 0, Mul (Num 1, Num 7))) -> simp -> Add (Num 15, Num 7) -> eval -> 22 51 baseline programs total.
34 lines
717 B
OCaml
34 lines
717 B
OCaml
type expr =
|
|
| Num of int
|
|
| Add of expr * expr
|
|
| Mul of expr * expr
|
|
|
|
let rec simp e =
|
|
match e with
|
|
| Num n -> Num n
|
|
| Add (a, b) ->
|
|
(match (simp a, simp b) with
|
|
| (Num 0, x) -> x
|
|
| (x, Num 0) -> x
|
|
| (Num n, Num m) -> Num (n + m)
|
|
| (a', b') -> Add (a', b'))
|
|
| Mul (a, b) ->
|
|
(match (simp a, simp b) with
|
|
| (Num 0, _) -> Num 0
|
|
| (_, Num 0) -> Num 0
|
|
| (Num 1, x) -> x
|
|
| (x, Num 1) -> x
|
|
| (Num n, Num m) -> Num (n * m)
|
|
| (a', b') -> Mul (a', b'))
|
|
|
|
let rec eval e =
|
|
match e with
|
|
| Num n -> n
|
|
| Add (a, b) -> eval a + eval b
|
|
| Mul (a, b) -> eval a * eval b
|
|
|
|
;;
|
|
|
|
let e = Add (Mul (Num 3, Num 5), Add (Num 0, Mul (Num 1, Num 7))) in
|
|
eval (simp e)
|