prologzebra-puzzle

Somebody could help me with this little program in prolog?


When I run my program with this sentence:

| ?- constraints(C).

and the result is:

C = [espacio(chuck,brenda,lewis,cafe,treintayuno),
     espacio(bill,mary,tread,rojo,veinteynueve),
     espacio(steve,cindy,branch,negra,cuarentaytres),
     espacio(tom,laura,forrest,azul,treintaycinco)|_A] ?

The result is fine but at the end is there an "|A" and I don't know what is wrong??? It is my code:

/*

Cuatro parejas deciden ir a acampar a la selva del estado un fin de semana.
Cada pareja viajo en una van diferente y cada una eligio un espacio de 

campo separado. Todos los sitios para acampar estan etiquetados con un 

numero y mientras estan en la misma area los sitios no se juntan entre si.
Determina el nombre completo de cada pareja, color de van y numero de su 

espacio de campo.

TRADUCCION
1.- BIll quie no esta casado con Laura, no manejo una Van Negra
2.- Chuck y su esposa Brenda no acamparon en el espacio #35. El apellido de 

Breanda no es Forrest
3.- La pareja Lewis quien manejo una van Cafe, acamparon en el espacio 31
4.- Tom acampo en un espacio mas bajo del que acampo Cindy pero mas alto 

que la pareja que manejo una Van Roja.
5.- Tom no esta casado con Mary Tread. Steve Branch no maneja una van azul.
6.- La pareja que maneja la van negra acampo en el espacio #43

ORIGINAL
1. Bill, who is not married to Laura, didn't drive a black van.
2. Chuck and his wife Brenda were not camped in space #35. Brenda's last 

name is not 
Forrest.
3. The Lewis couple, who drove a tan van, camped in space #31.
4. Tom camped in a space numbered lower than the one Cindy camped in but 

higher than the 
couple who drove in the red van did. 
5. Tom isn't married to Mary Tread. Steve Branch didn't drive a blue van. 
6. The couple driving the black van camped in space #43.

*/


use_module( library(basics)).

use_module(library(lists)).

% UN CAMPAMENTO ES UNA LISTA DE 5 ESPACIOS; CADA ESPACIO TIENE UNA PAREJA 

(HOMBRE Y MUJER Y APELLIDO) UNA VAN Y UN NUMERO DE ESPACIO.

campamento([espacio(_,_,_,_,_),
        espacio(_,_,_,_,_),
        espacio(_,_,_,_,_),
            espacio(_,_,_,_,_)]).

% De acuerdo a las sentencias previas podemos establecer lo siguiente:

constraints( Campamento ):-
    member(espacio(chuck,brenda,_,_,_), Campamento), % 2)
    member(espacio(_,_,lewis,cafe,treintayuno), Campamento), % 3)
    member(espacio(_,mary,tread,_,_), Campamento), % 5)
    member(espacio(_,_,_,rojo,veinteynueve), Campamento), %  implicito 

)
    member(espacio(_,_,_,negra,cuarentaytres), Campamento), % 6)
    member(espacio(_,_,_,azul,treintaycinco), Campamento), %  implicito 

)
    member(espacio(bill,_,_,_,veinteynueve), Campamento), %  implicito 

)
    member(espacio(steve,cindy,branch,_,_), Campamento), %  implicito )
    member(espacio(_,cindy,_,_,cuarentaytres), Campamento), %  

implicito )
    member(espacio(tom,laura,forrest,_,_), Campamento). %  implicito )

%   member(espacio(tom,_,_,blue,_), Campamento). %  implicito )
%   member(espacio(_,mary,_,red,_), Campamento). %  implicito )


append([X|Y],Z,[X|W]) :- append(Y,Z,W).  
append([],X,X).

member(X,[X|_]).
member(X,[_|T]) :- member(X,T).

% perm2(X,Y, X,Y).
% perm2(X,Y, Y,X).


/*member(X,[X|T]).
member(X,[H|T]) :- member(X,T).*/

Solution

  • (Your program has several errors: In particular use_module(xx) must be prefixed with :-)

    constraints/1 essentially looks like this:

    constraints(L) :-
       member(a, L),
       member(b, L),
       member(c, L),
       member(d, L).
    

    So you demand that a, b, c, and d are elements of L. But nowhere do you state how long the list should be. You can observe this by looking at alternate answers pressing ;Return.

    ?- constraints(L).
       L = [a, b, c, d|_A]
    ;  L = [a, b, c, _A, d|_B]
    ;  L = [a, b, c, _A, _B, d|_C]
    ;  false.
    

    To fix this, add length(L, 4) at the beginning, before any goal member/2.