Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Goal expansion in lib reif #2433

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions benches/reif.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
Copied from^W^W Inspired by memberbench[1], but has only benchmarks relevant to
goal expansion of if_/3 and is adapted to be better integrated into Scryer's
benchmarking subsystem: which doesn't need time reporting, and supports only
single test at a time.

[1]: http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/sicstus/memberbench.pl
*/

:- use_module(library(reif)).
:- use_module(library(lists)).
:- use_module(library(si)).


run(Test, Count) :-
atom_si(Test),
integer_si(Count),
exptrue(Count),
\+ benchmark(Test, z, "abcdefghijklmnopqrstuvwxyz ")
; true.


% Baseline test – the fastest possible implementation
benchmark(memberchk, E, Es) :- memberchk(E, Es).

% Expanded if_/3
benchmark(memberd_ifc, E, Es) :- memberd_ifc(E, Es).

% Non-expanded if_/3
benchmark(memberd_fif, E, Es) :- memberd_fif(E, Es).


memberd_ifc(X, [E|Es]) :-
if_(X = E, true, memberd_ifc(X, Es)).

memberd_fif(X, [E|Es]) :-
fif_(X = E, true, memberd_fif(X, Es)).


% Copy of _if/3, but with a different name, so it won't be expanded
fif_(If_1, Then_0, Else_0) :-
call(If_1, T),
( T == true -> Then_0
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why, these variables will be wrapped with call/1 during term-to-body conversion anyway

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No clear reason, it just looked more clean.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With call/1 it's no longer a copy of if_/3, making the comment wrong:

http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/sicstus/reif.pl

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we mark this thread as resolved?

; T == false -> Else_0
; nonvar(T) -> throw(error(type_error(boolean, T), _))
; throw(error(instantiation_error, _))
).


%% exptrue(N).
%
% Succeeds 10^N times if N is ground, usefull as a cheap way to repeat a given
% predicate many times in benchmarks. There are many more ways to generate
% choice points, but this one by far has the lowest overhead.
exptrue(0).
exptrue(1) :- ten.
exptrue(2) :- ten, ten.
exptrue(3) :- ten, ten, ten.
exptrue(4) :- ten, ten, ten, ten.
exptrue(5) :- ten, ten, ten, ten, ten.
exptrue(6) :- ten, ten, ten, ten, ten, ten.

ten. ten. ten. ten. ten. ten. ten. ten. ten. ten.
3 changes: 3 additions & 0 deletions benches/run_iai.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ mod iai {
#[bench::count_edges(setup::prolog_benches()["count_edges"].setup())]
#[bench::numlist(setup::prolog_benches()["numlist"].setup())]
#[bench::csv_codename(setup::prolog_benches()["csv_codename"].setup())]
#[bench::memberbench_baseline(setup::prolog_benches()["memberbench_baseline"].setup())]
#[bench::memberbench_if_expanded(setup::prolog_benches()["memberbench_if_expanded"].setup())]
#[bench::memberbench_if_not_expanded(setup::prolog_benches()["memberbench_if_not_expanded"].setup())]
fn bench(mut run: impl FnMut() -> Vec<LeafAnswer>) -> Vec<LeafAnswer> {
run()
}
Expand Down
27 changes: 27 additions & 0 deletions benches/setup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,33 @@ pub fn prolog_benches() -> BTreeMap<&'static str, PrologBenchmark> {
Strategy::Reuse,
btreemap! { "Name" => Term::string("SPACE") },
),
/* FIXME: Following 3 benchmarks don't bind any variables and shouldn't
* produce any leaf answer, but test validate_benchmarks() fails if last
* element is `btreemap! {}`, because result of a query is `[True]`, but
* test case expects `[LeafAnswer { bindings: {} }]`. As a workaround
* I've just added dummy variable unification.
*/
(
"memberbench_baseline",
"benches/reif.pl",
"run(memberchk,4),X=done.",
Strategy::Reuse,
btreemap! { "X" => Term::atom("done") },
),
(
"memberbench_if_expanded",
"benches/reif.pl",
"run(memberd_ifc,4),Y=done.",
Strategy::Reuse,
btreemap! { "Y" => Term::atom("done") },
),
(
"memberbench_if_not_expanded",
"benches/reif.pl",
"run(memberd_fif,4),Z=done.",
Strategy::Reuse,
btreemap! { "Z" => Term::atom("done") },
),
]
.map(|b| {
(
Expand Down
Loading
Loading