1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(** Copyright 2026, Kirill K. Smirnov *)

(** SPDX-License-Identifier: LGPL-3.0-or-later *)

open Mardukml_lib

let%test "lterm_to_string var" = Lambda.lterm_to_string (Var "x") = "x"
let%test "lterm_to_string app" = Lambda.lterm_to_string (App (Var "x", Var "y")) = "(x y)"
let%test "lterm_to_string abs" = Lambda.lterm_to_string (Abs ("x", Var "y")) = "(\\x.y)"
let%test "fvars 1" = Lambda.fvars (Var "x") = [ "x" ]
let%test "fvars 2" = Lambda.fvars (Abs ("x", Var "x")) = []

let%test "subst 1" =
  Lambda.subst (Var "x") "x" (App (Var "x", Var "y")) = App (Var "x", Var "y")
;;

let%test "subst 2" = Lambda.subst (Var "x") "y" (App (Var "x", Var "y")) = Var "x"

let%test "subst 3" =
  Lambda.subst (Abs ("x", App (Var "x", Var "y"))) "y" (Var "x")
  = Abs ("fv0", App (Var "fv0", Var "x"))
;;

let%test "compile 1" = Mardukml.compile_to_lambda_cbv (Var "x") = Var "x"

let%test "compile 2" =
  Mardukml.compile_to_lambda_cbv (Fun ("x", Var "y")) = Abs ("x", Var "y")
;;