Ami kimaradt: kell hozza a lists library.
2009/5/2 Levente Zsíros 
<zslevi@gmail.com>
Írtam egy univerzális kvantort, amivel korlátokat is el lehet helyezni. Gondolom másnak is jól jöhet.
tmp_id(X):- 
   tmp_id_counter(X),
   X1 is X+1,
   abolish(tmp_id_counter/1),
   assert(tmp_id_counter(X1)).
   
% reconsult eseten ne induljon elolrol az tmp_id_counter
:- \+ ((clause(tmp_id_counter(X),_),integer(X))),
   assert(tmp_id_counter(1)).
   
/* Olyan eljaras, amely a bagof-hoz hasonloan mukodik,
de nem keszit masolatot bizonyos adatstruktukturakrol (Nocopy).
NCS- nocopy symbol (a selectorban szerepelhet)
X - index, ami a Filterben szerepelhet; tomornek kell lennie, maskulonben masolat keszul rola (ugyanis a lehetseges indexeket assert-el taroljuk)
Iterator - Egy cel. Iterator es szuro egyben (az X-ek halmazat generalja, visszalepessel)
Selector - Egy cel. Miutan megvan az X-ek halmaza, kivalaszthatjuk Nocopy-bol a
   szukseges elemet; a Selector-ban levo kifejezesnek az ervenyes (vagyis a      
   Filternek megfelelo) X-ekre sikerulnie kell, kivetel nelkul (a kulonbozo
   Selector kifejezesek ES kapcsolatba kerulnek majd egymassal; korlatok
   felvetlere kivaloan hasznalhato; a Nocopy-ban lehetnek korlat valtozok is!).
   A Selector-ban nem szerepelhet a Nocopy valtozo! Ehelyett az NCS hasznalando.
   Az Y-nak is itt kell erteket kapnia.
Y - a minket erdeklo valtozo (ebbol keszul az YL lista)   
pelda:
NC legyen egy harom hosszu lista, es minden eleme egyezzen meg a listaban
elfoglalt helyevel (ez meg mukodne bagoffal is)
length(NC,3),anditerator(NC-NCS,Index,nth0(Index,NC,_),
(nth0(Index,NCS,Index)),Index,L).
pelda2: (Ez mar FD-vel)
a listaban legyenek egymast koveto szamok
length(NC,3),anditerator(NC-NCS,Index,nth0(Index,NC,_),
   (      
      Index>0 -> nth0(Index,NCS,E),I2 is Index-1,nth0(I2,NCS,E2),E#=E2+1;
      Index=0 % e nelkul meghiusulna az anditerator
   ),
   Index,L).
   
*/
anditerator(Nocopy-NCS,X,Iterator,Selector,Y,YL):-
   tmp_id(Id),
   ( 
      call(Iterator),assertz(tmp_goal(Id,X)),fail
      ;
      true
   ),
   callgoallist(Id,Nocopy-NCS,X,Selector,Y,YL).
callgoallist(Id,Nocopy-NCS,X,Selector,Y,YL):-
   copy_term(X-Selector-Y-NCS,XC-SelectorC-YC-NCSC),
   % ez lekoti SelectorC-ben az XC valtozot
   call(tmp_goal(Id,XC)), nondeb:remclaus(tmp_goal(_,_)) ->
   (
      % SelectorC-ben leköti A Nocopy szimbólumot (NCSC)
      NCSC = Nocopy,      
      retract(tmp_goal(Id,XC)),      
      % itt helyettesitodik be YC
      call(SelectorC),      
      callgoallist(Id,Nocopy-NCS,X,Selector,Y,YT),
      YL=[YC|YT]           
   )
   ;
   YL=[].
   
   
% ez a ketto csak a debuggolashoz kell   
   
nondeb:remclaus(H):-
   write('\n********************\n'),
   bagof(H,(clause(H,_),mdeb(H,'---clause')),_).
   
mdeb(V,S):-
   write('\n'),
   write(S),
   write(':'),
   write(V),
   write('\n').
      
-- 
Zsíros Levente
-- 
Zsíros Levente