From 7dc65f925806e2a26c3373583e9c0e1c4fb919cf Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sun, 25 Jan 2026 20:13:07 +0300 Subject: [PATCH 1/2] PPX: Improve documentation for testser Signed-off-by: Kakadu --- ppx/tester/ppx_tester.ml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ppx/tester/ppx_tester.ml b/ppx/tester/ppx_tester.ml index f29121db..a84f8551 100644 --- a/ppx/tester/ppx_tester.ml +++ b/ppx/tester/ppx_tester.ml @@ -1,6 +1,6 @@ (* * OCanren. PPX syntax extensions. - * Copyright (C) 2016-2024 + * Copyright (C) 2016-2026 * Dmitrii Kosarev aka Kakadu * St.Petersburg State University, JetBrains Research *) @@ -11,13 +11,13 @@ Expands - {[ let __ _ = [%tester runR OCanren.reify show_int show_intl (fun q -> q === !!1)] ]} + {[ let __ _ = [%tester run_r OCanren.reify show_intl 1 (fun q -> q === !!1)] ]} to {[ let __ _ = - runR OCanren.reify show_int show_intl q qh + run_r OCanren.reify show_intl 1 q qh ("", (fun q -> q === (!! 1))) ]} From 6efeab8183faf4f928f097d405a210ddd8955d86 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sun, 25 Jan 2026 20:21:23 +0300 Subject: [PATCH 2/2] Sample bechmark: reverso with debug_var and without. Time difference looks negligible Signed-off-by: Kakadu --- samples/bench_reverso.ml | 90 ++++++++++++++++++++++++++++++++++++++++ samples/dune | 26 +++++++++++- 2 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 samples/bench_reverso.ml diff --git a/samples/bench_reverso.ml b/samples/bench_reverso.ml new file mode 100644 index 00000000..b5dbf7e1 --- /dev/null +++ b/samples/bench_reverso.ml @@ -0,0 +1,90 @@ +(* SPDX-License-Identifier: LGPL-2.1-or-later *) +(* + * OCanren. PPX syntax extensions. + * Copyright (C) 2016-2026 + * Dmitrii Kosarev aka Kakadu + * St.Petersburg State University, JetBrains Research + *) + +(* In this demo we benhmark default reverso in a lucky direction + against debug_var reverso, which works in any direction. + For longer lists, performance difference could be neglected +*) + +open OCanren + +let rec appendo xs ys zs = + let open OCanren.Std in + conde + [ + xs === Std.nil () &&& (ys === zs); + fresh (h tl tmp) (xs === h % tl) (zs === h % tmp) (appendo tl ys tmp); + ] + +let rec reverso xs rez = + let open OCanren.Std in + conde + [ + xs === nil () &&& (xs === rez); + (* Good order for forward execution *) + fresh (h tl tmp) (xs === h % tl) (reverso tl tmp) (appendo tmp ! + fresh (h tl tmp) + (xs === h % tl) + (appendo tmp ! + fresh (h tl tmp) + (xs === h % tl) + (reverso_hacky tl tmp) (appendo tmp ! reverso (OCanren.Std.list OCanren.inj [ 1; 2; 3 ]) q)] + +let () = + let open OCanren.Std in + let open Tester in + [%tester + run_r [%reify: GT.int OCanren.Std.List.ground] + ([%show: GT.int OCanren.logic OCanren.Std.List.logic] ()) + (-1) + (fun q -> reverso_hacky q (OCanren.Std.list OCanren.inj [ 1; 2; 3 ]))] + +let make_list n : _ ilogic = + assert (n > 0); + let rec helper acc n = + if n <= 0 then acc else helper (Std.List.cons !!1 acc) (n - 1) + in + helper (Std.nil ()) n + +let () = + let xs700 = make_list 500 in + let test rel () = + let s = + run q + (fun v -> rel xs700 v) + (fun rr -> rr#reify [%reify: GT.int OCanren.Std.List.ground]) + in + let answers = OCanren.Stream.take s in + assert (List.length answers = 1) + in + let open Benchmark in + let res = + throughputN ~style:Nil ~repeat:2 2 + [ ("default", test reverso, ()); ("debug_var", test reverso_hacky, ()) ] + in + tabulate res diff --git a/samples/dune b/samples/dune index 9e98db6e..1b21cbd9 100644 --- a/samples/dune +++ b/samples/dune @@ -43,7 +43,23 @@ (file %{project_root}/camlp5/pp5+ocanren+dump.exe) (file %{project_root}/camlp5/pp5+gt+plugins+ocanren+logger+dump.exe) (file %{project_root}/camlp5/pp5+ocanren+o.exe)) - (libraries GT OCanren benchmark)) + (libraries GT OCanren)) + +(executable + (name bench_reverso) + (modules bench_reverso) + (preprocess + (pps + OCanren-ppx.ppx_tester + OCanren-ppx.ppx_fresh + OCanren-ppx.ppx_deriving_reify + GT.ppx_all)) + (preprocessor_deps + (file %{project_root}/ppx/pp_distrib_gt_reify.exe) + (file %{project_root}/camlp5/pp5+ocanren+dump.exe) + (file %{project_root}/camlp5/pp5+gt+plugins+ocanren+logger+dump.exe) + (file %{project_root}/camlp5/pp5+ocanren+o.exe)) + (libraries GT OCanren OCanren.tester benchmark)) (executable (name JeepProblem) @@ -70,7 +86,13 @@ (alias (name all) - (deps tree.exe sorting.exe WGC.exe JeepProblem.exe len.exe)) + (deps + tree.exe + sorting.exe + WGC.exe + JeepProblem.exe + len.exe + bench_reverso.exe)) (cram (deps