Program always returning "false"

Asked

Viewed 52 times

0

I’m honing 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 (What shouldn’t). So I wonder if there are any structural problem in my code, if not, it should just be something wrong in some affirmative (which I checked, but found nothing). Follow 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 you type start. it returns a "false" instead of the ordered information, I think it’s like it’s not possible. I use the SWI Prolog, by the way

1 answer

0


Your problem is that you are making concrete value comparisons with variables not yet instantiated. The operator == will succeed only if the terms of both sides are already equal, without any further unification. So already in the first rule he can’t find results - because although you instantiated motorista, you have not yet urged 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 "Let’s deal with the plates" to before this code, it will get past that point. But you will fail at the next point because you have not yet urged the fates...

That explains the mistakes, but my suggestion is not to do it this way - so it will generate all the combinations of all attributes before doing tests that would discard invalid results. Instead, do the tests first - using = instead of == (since this operator yes unifies free variables when possible) - and only in the end unify what is missing and test for uniqueness. So not only will the program work, it will end much faster (example in the 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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.