Program always returning "false"

0

I'm tweaking my Prolog skills, and I'm solving a RachaCuca problem.

This is the first one I try to do, and for some reason it returns everything as false (which it should not). So I would like to know if there is any structural problem in my code, if not, it should be just something wrong in some statement (which I checked, but found nothing). Here is the code:

%%Adicionando biblioteca

cor(amarelo).
cor(azul).
cor(branco).
cor(verde).
cor(vermelho).

motorista(vinicius).
motorista(joao).
motorista(limao).
motorista(carol).
motorista(leo).

destino(amazonas).
destino(bahia).
destino(mato_grosso).
destino(minas_gerais).
destino(parana).

carga(adubo).
carga(carvao).
carga(enxofre).
carga(soda_caustica).
carga(trigo).

placa('AAA-1111').
placa('BBB-2222').
placa('CCC-3333').
placa('DDD-4444').
placa('EEE-5555').

km(50).
km(100).
km(150).
km(200).
km(250).

% Definindo alldiferent 
alldifferent([]).
alldifferent([H|T]):- not(member(H,T)),
                      alldifferent(T).


start:- caminhoes([C1, C2, C3, C4,C5]),
         writeln("\n CAMINHAO 1: ":C1),
         writeln("\n CAMINHAO 2: ":C2),
         writeln("\n CAMINHAO 3: ":C3),
         writeln("\n CAMINHAO 4: ":C4),
         writeln("\n CAMINHAO 5: ":C5).


caminhoes([(COR1, MOTORISTA1, DESTINO1, CARGA1, PLACA1, KM1),
         (COR2, MOTORISTA2, DESTINO2, CARGA2, PLACA2, KM2),
         (COR3, MOTORISTA3, DESTINO3, CARGA3, PLACA3, KM3),
         (COR4, MOTORISTA4, DESTINO4, CARGA4, PLACA4, KM4),
         (COR5, MOTORISTA5, DESTINO5, CARGA5, PLACA5, KM5)]):-

    %%Vamos lidar com os motoristas

    motorista(MOTORISTA1), motorista(MOTORISTA2), motorista(MOTORISTA3),
    motorista(MOTORISTA4), motorista(MOTORISTA5), 
    alldifferent([MOTORISTA1, MOTORISTA2, MOTORISTA3, MOTORISTA4, MOTORISTA5]),

    %%O número 1 fala que Jorge é o motorista do caminhão de placa DDD-4444.
(
(MOTORISTA1==limao,PLACA1=='DDD-4444');
(MOTORISTA2==limao,PLACA2=='DDD-4444');
(MOTORISTA3==limao,PLACA3=='DDD-4444');
(MOTORISTA4==limao,PLACA4=='DDD-4444');
(MOTORISTA5==limao,PLACA5=='DDD-4444')
),

    %%O número 15 fala que Stênio está dirigindo para Minas Gerais.

(
(MOTORISTA1==leo,DESTINO1==minas_gerais);
(MOTORISTA2==leo,DESTINO2==minas_gerais);
(MOTORISTA3==leo,DESTINO3==minas_gerais);
(MOTORISTA4==leo,DESTINO4==minas_gerais);
(MOTORISTA5==leo,DESTINO5==minas_gerais)
),

    %%O 19 fala que Antônio é o motorista do caminhão de placa EEE-5555.

(
(MOTORISTA1==vinicius,PLACA1=='EEE-5555');
(MOTORISTA2==vinicius,PLACA2=='EEE-5555');
(MOTORISTA3==vinicius,PLACA3=='EEE-5555');
(MOTORISTA4==vinicius,PLACA4=='EEE-5555');
(MOTORISTA5==vinicius,PLACA5=='EEE-5555')
),

    %%O número 21 fala que Pedro está ao lado do caminhão que vai para 
    %%o Mato Grosso.

(
(MOTORISTA1==carol,DESTINO2==mato_grosso);
(MOTORISTA2==carol,(DESTINO1==mato_grosso;DESTINO3==mato_grosso));
(MOTORISTA3==carol,(DESTINO2==mato_grosso;DESTINO4==mato_grosso));
(MOTORISTA4==carol,(DESTINO3==mato_grosso;DESTINO5==mato_grosso));
(MOTORISTA5==carol,DESTINO4==mato_grosso)
),

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %%Vamos lidar com as cores 

cor(COR1), cor(COR2), cor(COR3), cor(COR4), cor(COR5), 
alldifferent([COR1, COR2, COR3, COR4, COR5]),

    %%O número 4 diz que o caminhão Vermelho está em algum lugar à esquerda 
    %%do caminhão que vai para o Amazonas.

(
(COR1==vermelho,(DESTINO2==amazonas;DESTINO3==amazonas;DESTINO4==amazonas;DESTINO5==amazonas));
(COR2==vermelho,(DESTINO3==amazonas;DESTINO4==amazonas;DESTINO5==amazonas));
(COR3==vermelho,(DESTINO4==amazonas;DESTINO5==amazonas));
(COR4==vermelho,DESTINO5==amazonas)
),

    %%O número 6 fala que o caminhão Vermelho está em algum lugar entre o 
    %%caminhão que está carregando Enxofre e o caminhão Azul, nessa ordem.

(
(CARGA1==enxofre,COR3==azul,(COR2==vermelho));
(CARGA1==enxofre,COR4==azul,(COR2==vermelho;COR3==vermelho));
(CARGA1==enxofre,COR5==azul,(COR2==vermelho;COR3==vermelho;COR4==vermelho));
(CARGA2==enxofre,COR4==azul,(COR3==vermelho));
(CARGA2==enxofre,COR5==azul,(COR3==vermelho;COR4==vermelho));
(CARGA3==enxofre,COR5==azul,(COR4==vermelho))
),

    %%O número 10 fala que o caminhão Branco está em algum lugar à direita do caminhão Verde.

(
(COR1==verde,(COR2==branco;COR3==branco;COR4==branco;COR5==branco));
(COR2==verde,(COR3==branco;COR4==branco;COR5==branco));
(COR3==verde,(COR4==branco;COR5==branco));
(COR4==verde,COR5==branco)
),

    %%O número 13 fala que o caminhão Amarelo está exatamente à esquerda do 
    %%caminhão que tem 200 mil Km rodados.

(
(COR1==amarelo,KM2==200);
(COR2==amarelo,KM3==200);
(COR3==amarelo,KM4==200);
(COR4==amarelo,KM5==200)
),

    %%O número 17 fala que o veículo Azul está em algum lugar à direita do 
    %%veículo de placa AAA-1111.

(
(PLACA1=='AAA-1111',(COR2==azul;COR3==azul;COR4==azul;COR5==azul));
(PLACA2=='AAA-1111',(COR3==azul;COR4==azul;COR5==azul));
(PLACA3=='AAA-1111',(COR4==azul;COR5==azul));
(PLACA4=='AAA-1111',COR5==azul)
),

    %%O número 20 fala que o caminhão Azul está em algum lugar à 
    %%esquerda do caminhão Branco.

(
(COR5==branco,(COR4==azul;COR3==azul;COR2==azul;COR1==azul));
(COR4==branco,(COR3==azul;COR2==azul;COR1==azul));
(COR3==branco,(COR2==azul;COR1==azul));
(COR2==branco,COR1==azul)
),

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %%Vamos lidar com os destinos


destino(DESTINO1), destino(DESTINO2), destino(DESTINO3), 
destino(DESTINO4), destino(DESTINO5), 
alldifferent([DESTINO1, DESTINO2, DESTINO3, DESTINO4, DESTINO5]),

    %%O número 2 fala que na quarta posição está o caminhão que vai 
    %%para Belo Horizonte.
    %%LEMBRANDO que Belo Horizonte fica em Minas Gerais.

DESTINO4==minas_gerais,

    %%O número 5 fala que o veículo que vai para a região Centro-oeste
    %% está ao lado do caminhão que já rodou 100 mil Km.
    %%LEMBRANDO que o Mato Grosso fica no centro-oeste.

(
(DESTINO1==mato_grosso,KM2==100);
(DESTINO2==mato_grosso,(KM1==100;KM3==100));
(DESTINO3==mato_grosso,(KM2==100;KM4==100));
(DESTINO4==mato_grosso,(KM3==100;KM5==100));
(DESTINO5==mato_grosso,KM4==100)
),

    %%O número 12 fala que quem vai para a região Nordeste está em 
    %%algum lugar à direita do caminhão Vermelho.
    %%LEMBRANDO que a Bahia fica no nordeste.

(
(DESTINO2==bahia,COR1==vermelho);
(DESTINO3==bahia,(COR1==vermelho;COR2==vermelho));
(DESTINO4==bahia,(COR1==vermelho;COR2==vermelho;COR3==vermelho));
(DESTINO5==bahia,(COR1==vermelho;COR2==vermelho;COR3==vermelho;COR4==vermelho))
),

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %%Vamos lidar com as cargas

carga(CARGA1), carga(CARGA2), carga(CARGA3), carga(CARGA4), 
carga(CARGA5), 
alldifferent([CARGA1, CARGA2, CARGA3, CARGA4, CARGA5]),

    %%O número 9 fala que o caminhão de placa DDD-4444 está transportando Soda cáustica.

(
(PLACA1=='DDD-4444',CARGA1==soda_caustica);
(PLACA2=='DDD-4444',CARGA2==soda_caustica);
(PLACA3=='DDD-4444',CARGA3==soda_caustica);
(PLACA4=='DDD-4444',CARGA4==soda_caustica);
(PLACA5=='DDD-4444',CARGA5==soda_caustica)
),

    %%O número 16 fala que o caminhão com Adubo está em algum lugar entre o caminhão
    %%que vai para Bahia e o caminhão com Carvão, nessa ordem.

(
(DESTINO1==bahia,CARGA3==carvao,(CARGA2==adubo));
(DESTINO1==bahia,CARGA4==carvao,(CARGA2==adubo;CARGA3==adubo));
(DESTINO1==bahia,CARGA5==carvao,(CARGA2==adubo;CARGA3==adubo;CARGA4==adubo));
(DESTINO2==bahia,CARGA4==carvao,(CARGA3==adubo));
(DESTINO2==bahia,CARGA5==carvao,(CARGA3==adubo;CARGA4==adubo));
(DESTINO3==bahia,CARGA5==carvao,(CARGA4==adubo))
),

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %%Vamos lidar com as placas

placa(PLACA1), placa(PLACA2), placa(PLACA3), placa(PLACA4), 
placa(PLACA5), 

alldifferent([PLACA1, PLACA2, PLACA3, PLACA4, PLACA5]),

    %%O número 8 fala que em uma das pontas está o caminhão de placa AAA-1111.

(PLACA1=='AAA-1111';PLACA5=='AAA-1111'),

    %%O número 11 fala que o veículo de placa BBB-2222 está ao lado
    %%do veículo mais rodado.

(
(PLACA1=='BBB-2222',KM2==250);
(PLACA2=='BBB-2222',(KM1==250;KM3==250));
(PLACA3=='BBB-2222',(KM2==250;KM4==250));
(PLACA4=='BBB-2222',(KM3==250;KM5==250));
(PLACA5=='BBB-2222',KM4==250)
),

    %%O número 14 fala que o veículo de placa CCC-3333 está exatamente
    %%à direita do veículo de placa DDD-4444.

(
(PLACA1=='DDD-4444',PLACA2=='CCC-3333');
(PLACA2=='DDD-4444',PLACA3=='CCC-3333');
(PLACA3=='DDD-4444',PLACA4=='CCC-3333');
(PLACA4=='DDD-4444',PLACA5=='CCC-3333')
),

    %%O número 18 fala que o caminhão de placa DDD-4444 está ao lado do
    %%caminhão que já rodou 100 mil Km.

(
(PLACA1=='DDD-4444',KM2==100);
(PLACA2=='DDD-4444',(KM1==100;KM3==100));
(PLACA3=='DDD-4444',(KM2==100;KM4==100));
(PLACA4=='DDD-4444',(KM3==100;KM5==100));
(PLACA5=='DDD-4444',KM4==100)
),

    %%O número 22 fala que em uma das pontas está o caminhão de placa EEE-5555.

(PLACA1=='EEE-5555';PLACA5=='EEE-5555'),

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %%Vamos lidar com as quilometragem

km(KM1), km(KM2), km(KM3), km(KM4), km(KM5), 

alldifferent([KM1, KM2, KM3, KM4, KM5]),

    %%O número 3 diz que o caminhão menos rodado está transportando Carvão.

(
(KM1==50,CARGA1==carvao);
(KM2==50,CARGA2==carvao);
(KM3==50,CARGA3==carvao);
(KM4==50,CARGA4==carvao);
(KM5==50,CARGA5==carvao)
),

    %%O número 7 diz que na primeira posição está o caminhão que 
    %%tem 150 mil Km rodados.

KM1==150.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Please, I'm out of ideas for what's failing :( When I type start., It returns a "false" instead of the ordered information, I think it is as if it concludes that it is not possible. I use SWI prolog, incidentally

    
asked by anonymous 21.06.2018 / 15:10

1 answer

0

Your problem is that you are doing concrete value comparisons with variables not yet instantiated. The == operator will only succeed if the terms on both sides are already equal, without any further unification. So in the first rule it can not find results - even though you instantiated motorista , you have not yet instantiated placa :

%%Vamos lidar com os motoristas

motorista(MOTORISTA1), motorista(MOTORISTA2), motorista(MOTORISTA3),
motorista(MOTORISTA4), motorista(MOTORISTA5), 
alldifferent([MOTORISTA1, MOTORISTA2, MOTORISTA3, MOTORISTA4, MOTORISTA5]),

%%O número 1 fala que Jorge é o motorista do caminhão de placa DDD-4444.
(
(MOTORISTA1==limao,PLACA1=='DDD-4444'); % Aqui PLACA1 ainda é uma variável livre

If you move the "Let's deal with the boards" to before this code, it will get you past that point. But it will fail at the next point, because you have not yet instantiated the destinations ...

This explains the errors, but my suggestion is not to do it this way - so it will generate all combinations of all attributes before doing the tests that would discard invalid results. Instead, do the tests first - using = instead of == (since this operator does unify free variables when possible) - and only at the end unify what is missing and test on its own. So not only will the program work as it will end much faster ( example in ideone ).

%%O número 1 fala que Jorge é o motorista do caminhão de placa DDD-4444.
(
(MOTORISTA1=limao,PLACA1='DDD-4444'); % Aqui PLACA1 ainda é uma variável livre...
                                  % ...mas isso não importa, porque variáveis
                                  % livres podem ser unificadas com qualquer coisa
    
21.06.2018 / 17:30