Liste des Groupes | Revenir à l prolog |
Hi,
Lets say there are at least two unification
spilling rewriting techniques in a Prolog system
that would eliminate a (=)/2 call:
/* Left Spilling into the Head */
p(V, Q) :- V = T, ... ~~> p(T, Q) :- ...
/* Right Spilling into a Goal */
..., V = T, p(V, Q), ... ~~> ..., p(T, Q), ...
Maybe the head movement and the indexing benefit
in SWI-Prolog was discovered because of DCG translation
and not to eliminate mode directed compilation.
Take this DCG rule:
p --> [a], !, [b].
I find that SWI-Prolog does left spilling:
/* SWI-Prolog 9.3.19 */
?- listing(p/2).
p([a|A], B) :-
!,
C=A,
C=[b|B].
Bye
Mild Shock schrieb:Hi,
>
Would need more testing but the
present example is immune:
>
/* SWI-Prolog 9.3.19 */
?- X = f(g(1),h(2)), time((between(1,1000000,_), test1(X, Y), fail; true)).
% 1,999,998 inferences, 0.094 CPU in 0.100 seconds (93% CPU, 21333312 Lips)
>
?- X = f(g(1),h(2)), time((between(1,1000000,_), test2(X, Y), fail; true)).
% 1,999,998 inferences, 0.094 CPU in 0.100 seconds (93% CPU, 21333312 Lips)
>
?- Y = j(1,2), time((between(1,1000000,_), test1(X, Y), fail; true)).
% 1,999,998 inferences, 0.109 CPU in 0.100 seconds (109% CPU, 18285696 Lips)
>
?- Y = j(1,2), time((between(1,1000000,_), test2(X, Y), fail; true)).
% 1,999,998 inferences, 0.094 CPU in 0.102 seconds (92% CPU, 21333312 Lips)
>
Not all Prolog systems are that lucky:
>
/* Scryer Prolog 0.9.4-286 */
?- X = f(g(1),h(2)), time((between(1,1000000,_), test1(X, Y), fail; true)).
% CPU time: 1.163s, 11_000_108 inferences
>
?- X = f(g(1),h(2)), time((between(1,1000000,_), test2(X, Y), fail; true)).
% CPU time: 1.248s, 11_000_131 inferences
>
?- Y = j(1,2), time((between(1,1000000,_), test1(X, Y), fail; true)).
% CPU time: 0.979s, 11_000_131 inferences
>
?- Y = j(1,2), time((between(1,1000000,_), test2(X, Y), fail; true)).
% CPU time: 1.338s, 11_000_131 inferences
>
Bye
Les messages affichés proviennent d'usenet.