Thank you for the bug report. It was in a bagof/3 when used in place of a 
findall/3 (it is the case in your code). 
Fixed in the git.

Workaround: replace setoff by findall in your program. This gives:

actionBagof(CONF, ALL_CONF) :-
        findall(RES, action(CONF, RES), ALL_CONF).


Daniel



Le 11 août 2014 à 14:44, [email protected] a écrit :

> 
> %************************************ DATA
> piece(0, [(4, -1), (0, 0), (1, 0), (2, 0), (3, 0), (5, 0), (6, 0), (7, 0), 
> (8,0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (8, 
> 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (1, 8), (2, 8), 
> (3, 8), (4, 8), (5, 8), (6, 8), (7, 8), (1, 1), (7, 1), (1, 7), (7, 7)]). 
> %the container box
> piece(1, [(0, 0), (1, 0), (2, 0), (0, 1), (2, 1)]).
> piece(2, [(0, 0), (0, 1), (0, 2)]).
> piece(3, [(0, 0), (1, 0), (2, 0)]).
> piece(4, [(0, 0), (1, 0), (1, 1), (0, 2), (1, 2)]).
> piece(5, [(0, 0), (1, 0), (0, 1)]).
> piece(6, [(0, 0), (1, 0), (2, 0)]).
> piece(7, [(0, 0), (0, 1), (0, 2)]).
> piece(8, [(1, 0), (1, 1), (1, 2), (0, 2)]).
> piece(9, [(0, 0), (1, 0)]).
> piece(10, [(0, 0), (0, 1)]).
> piece(11, [(0, 0)]). %the diamond
> confInit([(0,0,0),(1,4,1),(2,2,1),(3,5,3),(4,6,4),(5,4,4),(6,1,6),(7,3,1),(8,4,5),(9,2,7),(10,2,4),(11,3,4)]).
> solution(11, 4, 1).
> %*********************************** PROGRAM
> move(up, 0, -1).
> move(right, 1, 0).
> move(down, 0, 1).
> move(left, -1, 0).
> 
> calcPos([], _, []).
> calcPos([(PX1, PY1)|L], (ATx, ATy), [(PX_RES, PY_RES)|L_RES]) :-
>         PX_RES is PX1 + ATx,
>         PY_RES is PY1 + ATy,
>         calcPos(L, (ATx, ATy), L_RES).
> 
> isAnyCommon(L1, L2) :-
>         member(X, L1),
>         member(X, L2), !.
> 
> isOverlapsSub((P1, X1, Y1), (P2, X2, Y2)) :-
>         piece(P1, LP1),
>         piece(P2, LP2),
>         calcPos(LP1, (X1, Y1), LP1prime),
>         calcPos(LP2, (X2, Y2), LP2prime),
>         isAnyCommon(LP1prime, LP2prime).
> 
> isOverlaps(P1info, CONF) :-
>         select(P2info, CONF, _),
>         isOverlapsSub(P1info, P2info), !.
> 
> action((LM, CONF), ([(P, M)|LM], [Pprime|CONF_RES])) :-
>         select((P, Px, Py), CONF, CONF_RES),
>         P =\= 0, %0 is the container (static)
>         move(M, INCx, INCy),
>         Px_prime is Px + INCx,
>         Py_prime is Py + INCy,
>         Pprime = (P, Px_prime, Py_prime),
>         \+ isOverlaps(Pprime, CONF_RES).
> 
> actionBagof(CONF, ALL_CONF) :-
>         bagof(RES, action(CONF, RES), ALL_CONF).
> 
> histoPurge([], []).
> histoPurge([(M, CONF1)|LCONF], [(M, CONF1prime)|LCONFres]) :-
>         sort(CONF1, CONF1prime),
>         \+ histo(CONF1prime), !,
>         asserta(histo(CONF1prime)),
>         histoPurge(LCONF, LCONFres).
> histoPurge([_|LCONF], LCONFres) :-
>         histoPurge(LCONF, LCONFres).
> 
> soluceSub([], []).
> soluceSub([X|LCONF], RES) :-
>         actionBagof(X, LCONFprime),
>         histoPurge(LCONFprime, LCONFsecond),
>         append(LCONFsecond, INTER, RES),
>         soluceSub(LCONF, INTER).
> 
> soluceFound([], _) :- !, fail.
> soluceFound([(RES, Lconf)|_], (RES, Lconf)) :-
>         solution(Psol, Px, Py),
>         member((Psol, Px, Py), Lconf), !.
> soluceFound([_|L], RES) :-
>         soluceFound(L, RES).
> 
> soluce(INIT, RES) :-
>         asserta(tree(INIT)),
>         repeat,
>         retract(tree(LCONF)),
>         soluceSub(LCONF, LRES),
>         asserta(tree(LRES)),
>         retract(rec(REC)),
>         RECprime is REC + 1,
>         length(LRES, LEN),
>         asserta(rec(RECprime)),
>         print(RECprime + LEN),nl,
>         ((LRES = [], !, fail) ; soluceFound(LRES, RES)).
> 
> %(0,0,0) always : it's the container of the pieces.
> main :-
>         confInit(CONF),
>         INIT = ([], CONF),
>         asserta(tree(x)),
>         retractall(tree(_)),
>         asserta(histo(x)),
>         retractall(histo(_)),
>         asserta(rec(0)),
>         retractall(rec(_)),
>         asserta(rec(0)),!,
>         soluce([INIT], RES),
>         print(RES).


-- 
Ce message a ete verifie par MailScanner
pour des virus ou des polluriels et rien de
suspect n'a ete trouve.

_______________________________________________
Bug-prolog mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-prolog

Reply via email to