Í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