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}