| Deutsch English Français Italiano |
|
<veeove$bbu7$1@solani.org> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.mixmin.net!weretis.net!feeder8.news.weretis.net!reader5.news.weretis.net!news.solani.org!.POSTED!not-for-mail
From: Mild Shock <janburse@fastmail.fm>
Newsgroups: comp.lang.prolog
Subject: Re: variant_term/2 is faster than variant/1 (Was: Request for
comments, Novacore the sequel to ISO modules)
Date: Sat, 12 Oct 2024 23:16:30 +0200
Message-ID: <veeove$bbu7$1@solani.org>
References: <db8a6771-3e54-485b-b391-310658dd6f52n@googlegroups.com>
<aa869ef6-7f90-405b-a84a-2c11ac7979a3n@googlegroups.com>
<vcukob$n3q2$1@solani.org> <veekkd$b9uf$1@solani.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 12 Oct 2024 21:16:30 -0000 (UTC)
Injection-Info: solani.org;
logging-data="372679"; mail-complaints-to="abuse@news.solani.org"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101
Firefox/91.0 SeaMonkey/2.53.19
Cancel-Lock: sha1:T4GojxNlWPI0E/YmFj2rSXfE5zw=
In-Reply-To: <veekkd$b9uf$1@solani.org>
X-User-ID: eJwFwQkBACAIA8BKImxoHD77R/AOSmG5ETQ8vCaL05kWV2WyolMNsSY0avykVrvmdqlLJGyhi3143mzBB4r0Fnk=
Bytes: 3331
Lines: 96
How much faster is it?
Here some test harness:
test :- length(L, 6), length(R, 6),
enum_list(_, L), enum_list(_, R),
variant(L, R), fail; true.
test2 :- length(L, 6), length(R, 6),
enum_list(_, L), enum_list(_, R),
variant_term(L, R), fail; true.
Here some results:
- SWI-Prolog 9.3.11:
?- time(test).
% 2,126,498 inferences, 0.734 CPU in 0.752 seconds
(98% CPU, 2895657 Lips)
true.
?- time(test2).
% 2,159,795 inferences, 0.234 CPU in 0.236 seconds
(99% CPU, 9215125 Lips)
true.
- Trealla Prolog 2.57.16:
?- time(test).
% Time elapsed 3.128s, 14827949 Inferences, 4.741 MLips
true.
?- time(test2).
% Time elapsed 1.079s, 7775516 Inferences, 7.206 MLips
true.
- Scryer Prolog :
?- time(test3).
% CPU time: 5.653s, 5_192_831 inferences
true.
?- time(test2).
% CPU time: 1.544s, 6_116_163 inferences
true.
Note: test3 is like test, only it uses builtins:variant/2.
Mild Shock schrieb:
> The ISO core standard probably set the
> stage for a couple of performance sins.
> In 7.1.6.1 Variants of a term we find
>
> these test cases:
>
> - f(A, B, A) is a variant of f(X, Y, X).
> - g(A, B) is a variant of g(_, _).
> - P+Q is a variant of P+Q.
>
> What is doubious here, is the last test
> case with P+Q. Do we need to test terms
> that have common variables?
>
> Lets assume we have situations where we
> don't need variant working with common
> variables in the two argument terms, what
>
> about then using this bootstrapping:
>
> variant_term(X, Y) :-
> subsumes_term(X, Y),
> subsumes_term(Y, X).
>
> Here some testing, does it work ok? Take this code:
>
> enum_arg(_, 1).
> enum_arg(_, _).
> enum_arg(X, X).
>
> enum_list(_, []).
> enum_list(X, [H|T]) :- enum_arg(X, H), enum_list(X, T).
>
> boole(G, 1) :- G, !.
> boole(_, 0).
>
> nok(L, R) :- length(L, 6), length(R, 6),
> enum_list(_, L), enum_list(_, R),
> boole(variant(L, R), A), boole(variant_term(L, R), B),
> A \== B.
>
> Seems to work fine:
>
> ?- nok(L, R).
> false.
>
>