This is a hint (Hinweis) text of GUPU taken literally from the system. It's probably not very interesting reading for you.
**NEXT:To continue the guided tour go back where You came from
**NEXT:Continue reading the hints in German (...)

Dieser Hinweis ist aus der Übung im WS 1994/95 oder aus einer noch älteren Übung oder war nie Teil einer Übung und ist daher möglicherweise für spätere Übungen nicht gültig!


      Was zu tun ist, wenn die partielle
    Evaluation eines Ziels zu lange dauert

Mixtus bemüht sich, möglichst große Teile eines
Programms bereits auszuwerten. Gelegentlich
führt dies aber dazu, daß nur besonders
uninteressante Teile ,,aufgefaltet`` werden;
Teile, die besser in ihrer ursprünglichen Form
belassen worden wären.

:- summanden_summe(Is, S). % S Summe über Is.

summanden_summe([], 0).
summanden_summe([I], I). % Optimierung
summanden_summe([I|Is], S1) :-
	Is = [_|_]
	summe(I, S2, S1),
	summanden_summe(Is, S2).

Sagen wir, Sie würden nun in Ihrem Programm
sich einmal nur für length(Is,5) und
S = s(s(s(0))) interessieren.

summanden_anzahl_summe(Is,N,S) :-
	length(Is,N),
	summanden_summe(Is, S).

:- pe summanden_anzahl_summe(Is,6,s(s(s(0)))).

Das dauert zu lang und Sie schreiben nun longpe
stattdessen, um die normalerweise eingebaute
Zeitschranke zu umgehen. Das dauert nun...
Sie können währenddessen vielleicht
\hinweis{Frosch}, oder die englische
Übersetzung dessen \hinweis{frog} lesen.
Letztendlich erhalten ein ziemlich
\hinweis{ätzendes_Programm}, das wahrscheinlich
noch langsamer sein wird, als das
ursprüngliche!

War es wirklich nötig, dem partiellen Evaluator
zu verraten, wie groß die Summe sein soll?

Stattdessen versuchen wir nun:

:- pe summanden_anzahl_summe(Is,6,S).

und erhalten in Sekundenschnelle:

summanden_anzahl_summe(A, 6, B) :-
	summanden_anzahl_summe1(A, B).

% summanden_anzahl_summe1(A,B):-summanden_anzahl_summe(A,6,B)
summanden_anzahl_summe1([B,C,D,E,F,G], A) :-
	summe1(B, A, H),
	summe1(C, H, I),
	summe1(D, I, J),
	summe1(E, J, K),
	summe2(F, G, K).

% summe1(A,B,C):-summe(A,C,B)
summe1(0, A, A).
summe1(s(B), s(C), A) :-
	summe1(B, C, A).

% summe2(A,B,C):-summe(A,B,C)
summe2(0, A, A).
summe2(s(B), A, s(C)) :-
	summe2(B, A, C).

So richtig perfekt ist dieses Programm auch
nicht, weil der partielle Evaluator summe/2
zweimal erneut definiert hat, aber immerhin...
Passen Sie auf, das Prädikat summe1/3 hat nun
auch die beiden Argumente vertauscht.

Ok, also war nicht gar so schlecht, aber
richtig toll wäre es eigentlich, wenn mixtus
summe/3 in diesem Beipiel erst gar nicht zu
Gesicht bekäme. Kommentieren Sie dazu einmal
Summe aus... Jetzt erhalten wir das, was wir
wohl eigentlich wollten:

summanden_anzahl_summe(A, 6, B) :-
	summanden_anzahl_summe1(A, B).

% summanden_anzahl_summe1(A,B):-summanden_anzahl_summe(A,6,B)
summanden_anzahl_summe1([B,C,D,E,F,G], A) :-
	summe(B, H, A),
	summe(C, I, H),
	summe(D, J, I),
	summe(E, K, J),
	summe(F, L, K),
	G=L.

Wieso das G=L jetzt da ist? Wenn mixtus die
Definition eines Prädikats nicht sehen kann,
muß es annehmen, daß in diesem Prädikat
möglicherweise Seiteneffekte (na, nicht bei
uns) vorkommen. Deshalb muß die letzte Bindung
nach dem letzten Ziel durchgeführt werden, und
kann nicht vorverlegt werden.

Zurück: \hinweis{pe} \hinweis{init}

**NEXT:To continue the guided tour go back where You came from
**NEXT:Continue reading the hints in German