Ami kimaradt: kell hozza a lists library.
2009/5/2 Levente Zsíros <zslevi(a)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