From e38ee14580ed2bbdbe752b3e3035151a0a0bf18e Mon Sep 17 00:00:00 2001 From: Skgland Date: Sat, 16 Aug 2025 15:29:25 +0200 Subject: [PATCH] add tests for issue 3048 --- .../cli/issues/issue_3048.in/compare.pl | 8 ++++ .../issues/issue_3048.in/compare_get_assoc.pl | 12 ++++++ .../cli/issues/issue_3048.in/minimize1.pl | 39 +++++++++++++++++++ .../issues/issue_3048.in/minimize_final.pl | 6 +++ .../cli/issues/issue_3048.in/original.pl | 24 ++++++++++++ .../cli/issues/issue_3048.in/original_alt.pl | 22 +++++++++++ .../issues/issue_3048.in/pair_string_key.pl | 12 ++++++ tests/scryer/cli/issues/issue_3048.md | 36 +++++++++++++++++ tests/scryer/main.rs | 1 + 9 files changed, 160 insertions(+) create mode 100644 tests/scryer/cli/issues/issue_3048.in/compare.pl create mode 100644 tests/scryer/cli/issues/issue_3048.in/compare_get_assoc.pl create mode 100644 tests/scryer/cli/issues/issue_3048.in/minimize1.pl create mode 100644 tests/scryer/cli/issues/issue_3048.in/minimize_final.pl create mode 100644 tests/scryer/cli/issues/issue_3048.in/original.pl create mode 100644 tests/scryer/cli/issues/issue_3048.in/original_alt.pl create mode 100644 tests/scryer/cli/issues/issue_3048.in/pair_string_key.pl create mode 100644 tests/scryer/cli/issues/issue_3048.md diff --git a/tests/scryer/cli/issues/issue_3048.in/compare.pl b/tests/scryer/cli/issues/issue_3048.in/compare.pl new file mode 100644 index 00000000..a86f6eec --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.in/compare.pl @@ -0,0 +1,8 @@ +:- use_module(library(format)). + + +test :- compare(_, ("0"-'2'), ("1"-'1')). + +?- test. + false, unexpected. + true. diff --git a/tests/scryer/cli/issues/issue_3048.in/compare_get_assoc.pl b/tests/scryer/cli/issues/issue_3048.in/compare_get_assoc.pl new file mode 100644 index 00000000..11900d77 --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.in/compare_get_assoc.pl @@ -0,0 +1,12 @@ +get_assoc(Key, t(K,V,_,L,R), Val) :- + compare(Rel, Key, K), + get_assoc(Rel, Key, V, L, R, Val). + +get_assoc(=, _, Val, _, _, Val). +get_assoc(>, Key, _, _, Tree, Val) :- get_assoc(Key, Tree, Val). + +test :- get_assoc("1"-'0', t("0"-'2',_, _, t(_,_,_,t,t), t("1"-'0',_,_,t,t)), _). + +?- test. + false, unexpected. + true. diff --git a/tests/scryer/cli/issues/issue_3048.in/minimize1.pl b/tests/scryer/cli/issues/issue_3048.in/minimize1.pl new file mode 100644 index 00000000..c7de16e1 --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.in/minimize1.pl @@ -0,0 +1,39 @@ +:- use_module(library(format)). + +% is_assoc copied from library(assoc) and renamed to is_assoc_ +% and `% format("~w~n", [is_assoc_(R,RMin,Max,RDepth)]),` added + +is_assoc_(Assoc) :- + is_assoc_(Assoc, _Min, _Max, _Depth). + +is_assoc_(t,X,X,0) :- !. +is_assoc_(t(K,_,-,t,t),K,K,1) :- !, ground(K). +is_assoc_(t(K,_,>,t,t(RK,_,-,t,t)),K,RK,2) :- + % Ensure right side Key is 'greater' than K + !, ground((K,RK)), K @< RK. + +is_assoc_(t(K,_,<,t(LK,_,-,t,t),t),LK,K,2) :- + % Ensure left side Key is 'less' than K + !, ground((LK,K)), LK @< K. + +is_assoc_(t(K,_,B,L,R),Min,Max,Depth) :- + is_assoc_(L,Min,LMax,LDepth), + % format("~w~n", [is_assoc_(R,RMin,Max,RDepth)]), + is_assoc_(R,RMin,Max,RDepth), + % Ensure Balance matches depth + compare(Rel,RDepth,LDepth), + balance(Rel,B), + % Ensure ordering + ground((LMax,K,RMin)), + LMax @< K, + K @< RMin, + Depth is max(LDepth, RDepth)+1. + +balance(=,-). +balance(>,>). +balance(<,<). + +test :- is_assoc_(t(2,1,-,t(1,1,-,t,t),t(3,1,-,t,t))). + +?- test. + true. diff --git a/tests/scryer/cli/issues/issue_3048.in/minimize_final.pl b/tests/scryer/cli/issues/issue_3048.in/minimize_final.pl new file mode 100644 index 00000000..949e8584 --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.in/minimize_final.pl @@ -0,0 +1,6 @@ +a(t(K),K) :- ground(K). + +test :- a(t(3), M), M=M. + +?- test. + true. diff --git a/tests/scryer/cli/issues/issue_3048.in/original.pl b/tests/scryer/cli/issues/issue_3048.in/original.pl new file mode 100644 index 00000000..7035a514 --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.in/original.pl @@ -0,0 +1,24 @@ +:- use_module(library(assoc)). +:- use_module(library(lists)). +:- use_module(library(iso_ext)). + +put([_], _). +put([Old, New | Tail], Idx) :- + put_assoc(Idx, Old, 1, New), + IdxP is Idx +1, + put([New |Tail], IdxP). + +run(Max, Bad) :- + empty_assoc(A), + length(As, Max), + put([A|As], 1), + findall(Idx, (nth0(Idx, [A|As], Assoc), \+ is_assoc(Assoc)), Bad). + + +?- N = 20, run(N, Bad). + N = 20, Bad = [3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], unexpected + ; false. + N = 20, Bad = [] + ; false. + +test :- run(20, []). diff --git a/tests/scryer/cli/issues/issue_3048.in/original_alt.pl b/tests/scryer/cli/issues/issue_3048.in/original_alt.pl new file mode 100644 index 00000000..718b360f --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.in/original_alt.pl @@ -0,0 +1,22 @@ +:- use_module(library(assoc)). +:- use_module(library(lists)). +:- use_module(library(iso_ext)). +:- use_module(library(between)). + +p(Idx, Idx-1). + +test(N) :- + numlist(N, As), + maplist(p, As, Bs), + list_to_assoc(Bs, Assoc), + is_assoc(Assoc). + +run(Max, Bad) :- + numlist(Max, Num), + findall(N, (member(N, [0|Num]), \+ test(N)), Bad). + +?- N = 20, run(N, Bad). + Bad = [3,4,6,7,8,9,10,12,13,14,15,16,17,18,19,20], unexpected. + N = 20, Bad = []. + +test :- run(20, []). diff --git a/tests/scryer/cli/issues/issue_3048.in/pair_string_key.pl b/tests/scryer/cli/issues/issue_3048.in/pair_string_key.pl new file mode 100644 index 00000000..739c7c44 --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.in/pair_string_key.pl @@ -0,0 +1,12 @@ +:- use_module(library(assoc)). + +test :- + empty_assoc(A1), + put_assoc(([a]-1), A1, 1, A2), + put_assoc(([a]-2), A2, 1, A3), + put_assoc(([b]-1), A3, 1, _). + + +?- test. + false, unexpected. + true. diff --git a/tests/scryer/cli/issues/issue_3048.md b/tests/scryer/cli/issues/issue_3048.md new file mode 100644 index 00000000..67fefadc --- /dev/null +++ b/tests/scryer/cli/issues/issue_3048.md @@ -0,0 +1,36 @@ +Bound Variables are sometimes not considered ground even though they should be ground. + +```trycmd +$ scryer-prolog -f --no-add-history original.pl -g test -g halt + +``` + +```trycmd +$ scryer-prolog -f --no-add-history original_alt.pl -g test -g halt + +``` + +```trycmd +$ scryer-prolog -f --no-add-history minimize1.pl -g test -g halt + +``` + +```trycmd +$ scryer-prolog -f --no-add-history minimize_final.pl -g test -g halt + +``` + +```trycmd +$ scryer-prolog -f --no-add-history pair_string_key.pl -g test -g halt + +``` + +```trycmd +$ scryer-prolog -f --no-add-history compare.pl -g test -g halt + +``` + +```trycmd +$ scryer-prolog -f --no-add-history compare_get_assoc.pl -g test -g halt + +``` \ No newline at end of file diff --git a/tests/scryer/main.rs b/tests/scryer/main.rs index c4430400..e2ad1b61 100644 --- a/tests/scryer/main.rs +++ b/tests/scryer/main.rs @@ -25,6 +25,7 @@ fn cli_tests() { cases .default_bin_name("scryer-prolog") .case("tests/scryer/cli/issues/*.toml") + .case("tests/scryer/cli/issues/*.md") .case("tests/scryer/cli/src_tests/*.toml") .case("tests/scryer/cli/src_tests/*.md"); -- 2.54.0