• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ac

[Prolog] Teste de QI - Teste de Einstein

5 mensagens neste tópico

achei nesta página http://rachacuca.com.br/teste-de-einstein/ o seguinte teste e decidi modular-lo em prolog mas tou meio encravado...

%Cor: 1verm 2verd 3azul 4ama 5branc
%Nacionalidade: 1ing 2din 3sue 4ale 5nor
%#Bebida: 1cha 2cafe 3cerv 4agua 5leite
%#Cigarro: 1pall 2blue 3princ 4dun 5blend
%#Animal: 1cao 2cava 3gat 4pass 5peixe

%#O Inglês vive na casa Vermelha.
%#O Sueco tem Cachorros como animais de estimação.
%#O Dinamarquês bebe Chá.
%#A casa Verde fica do lado esquerdo da casa Branca.
%#O homem que vive na casa Verde bebe Café.
%#O homem que fuma Pall Mall cria Pássaros.
%#O homem que vive na casa Amarela fuma Dunhill.
% s2    O homem que vive na casa do meio bebe Leite.
% s1    O Norueguês vive na primeira casa.
%#O homem que fuma Blends vive ao lado do que tem Gatos.
%#O homem que cria Cavalos vive ao lado do que fuma Dunhill.
%#O homem que fuma BlueMaster bebe Cerveja.
%#O Alemão fuma Prince.
% s3    O Norueguês vive ao lado da casa Azul.
%#O homem que fuma Blends é vizinho do que bebe Água.

%casa(A,B,C,D,E,F)

cor(0):-write(' desc').
nac(0):-write(' desc').
beb(0):-write(' desc').
cig(0):-write(' desc').


cor(1):-write(' vermelho').
cor(2):-write(' verde').
cor(3):-write(' azul').
cor(4):-write(' amarelo').
cor(5):-write(' branco').
nac(1):-write(' ingles').
nac(2):-write(' dinamarques').
nac(3):-write(' sueco').
nac(4):-write(' alemao').
nac(5):-write(' noruegues').
beb(1):-write(' cha').
beb(2):-write(' cafe').
beb(3):-write(' cerveja').
beb(4):-write(' agua').
beb(5):-write(' leite').
cig(1):-write(' pall').
cig(2):-write(' blue').
cig(3):-write(' princ').
cig(4):-write(' dun').
cig(5):-write(' blend').
anim(0):-write(' desc').
anim(1):-write(' cao').
anim(2):-write(' cavalo').
anim(4):-write(' gato').
anim(4):-write(' passaro').
anim(5):-write(' peixe').

escreve:-escrev2(1).
escrev2(6).
escrev2(N):-casa(N,A,B,C,D,E),write('casa '),write(N),cor(A),nac(B),beb(C),cig(D),anim(E),write('\n'),M is N+1,escrev2(M).

start:-assert(casa(1,0,0,0,0,0)),assert(casa(2,0,0,0,0,0)),assert(casa(3,0,0,0,0,0)),assert(casa(4,0,0,0,0,0)),assert(casa(5,0,0,0,0,0)).

s1:-casa(1,B,C,D,E,F),retract(casa(1,B,C,D,E,F)),assert(casa(1,B,5,D,E,F)).
s2:-casa(3,B,C,D,E,F),retract(casa(3,B,C,D,E,F)),assert(casa(3,B,C,5,E,F)).
s3:-casa(N,_,5,_,_,_),M is N+1, M > 0, casa(M,B,C,D,E,F),retract(casa(M,B,C,D,E,F)),assert(casa(M,3,C,D,E,F)).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que no semestre passado resolvi isto nas aulas, mas já não sei do ficheiro.... Mas a dica é que tens que fazer isto com Restrições em Prolog....  :hmm: Eu vou tentar encontrar o ficheiro que continha a solução....

cumps  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já consegui rolar isto tudo mas acho que algo nao me está a dar certo:

%Cor: 1verm 2verd 3azul 4ama 5branc
%Nacionalidade: 1ing 2din 3sue 4ale 5nor
%#Bebida: 1cha 2cafe 3cerv 4agua 5leite
%#Cigarro: 1pall 2blue 3princ 4dun 5blend
%#Animal: 1cao 2cava 3gat 4pass 5peixe

% s5    O Inglês vive na casa Vermelha.
%#O Sueco tem Cachorros como animais de estimação.
%#O Dinamarquês bebe Chá.
% s4    A casa Verde fica do lado esquerdo da casa Branca.
% s4    O homem que vive na casa Verde bebe Café.
% s11  O homem que fuma Pall Mall cria Pássaros.
% s7    O homem que vive na casa Amarela fuma Dunhill.
% s2    O homem que vive na casa do meio bebe Leite.
% s1    O Norueguês vive na primeira casa.
%#O homem que fuma Blends vive ao lado do que tem Gatos.
%#O homem que cria Cavalos vive ao lado do que fuma Dunhill.
% s9    O homem que fuma BlueMaster bebe Cerveja.
% s10    O Alemão fuma Prince.
% s3    O Norueguês vive ao lado da casa Azul.
% s8    O homem que fuma Blends é vizinho do que bebe Água.

%casa(A,B,C,D,E,F)

cor(0):-write('\tdesc').
nac(0):-write('\tdesc').
beb(0):-write('\tdesc').
cig(0):-write('\tdesc').


cor(1):-write('\tverme').
cor(2):-write('\tverde').
cor(3):-write('\tazul').
cor(4):-write('\tamarelo').
cor(5):-write('\tbranco').
nac(1):-write('\tingles').
nac(2):-write('\tdina').
nac(3):-write('\tsueco').
nac(4):-write('\talemao').
nac(5):-write('\tnors').
beb(1):-write('\tcha').
beb(2):-write('\tcafe').
beb(3):-write('\tcerveja').
beb(4):-write('\tagua').
beb(5):-write('\tleite').
cig(1):-write('\tpall').
cig(2):-write('\tblue').
cig(3):-write('\tprinc').
cig(4):-write('\tdun').
cig(5):-write('\tblend').
anim(0):-write('\tdesc').
anim(1):-write('\tcao').
anim(2):-write('\tcavalo').
anim(3):-write('\tgato').
anim(4):-write('\tpassaro').
anim(5):-write('\tpeixe').

escreve:-escrev2(1).
escrev2(6).
escrev2(N):-casa(N,A,B,C,D,E),write('casa '),write(N),cor(A),nac(B),beb(C),cig(D),anim(E),write('\n'),M is N+1,escrev2(M).

confirma_desocupado(A,1):-casa(A,0,_,_,_,_).
confirma_desocupado(A,2):-casa(A,_,0,_,_,_).
confirma_desocupado(A,3):-casa(A,_,_,0,_,_).
confirma_desocupado(A,4):-casa(A,_,_,_,0,_).
confirma_desocupado(A,5):-casa(A,_,_,_,_,0).

start:-assert(casa(1,0,0,0,0,0)),assert(casa(2,0,0,0,0,0)),assert(casa(3,0,0,0,0,0)),assert(casa(4,0,0,0,0,0)),assert(casa(5,0,0,0,0,0)).

cs(A,1,V):-casa(A,B1,C1,D1,E1,F1),
   retract(casa(A,_,_,_,_,_)),
   assert(casa(A,V,C1,D1,E1,F1)).
cs(A,2,V):-casa(A,B1,C1,D1,E1,F1),
   retract(casa(A,_,_,_,_,_)),
   assert(casa(A,B1,V,D1,E1,F1)).
cs(A,3,V):-casa(A,B1,C1,D1,E1,F1),
   retract(casa(A,_,_,_,_,_)),
   assert(casa(A,B1,C1,V,E1,F1)).
cs(A,4,V):-casa(A,B1,C1,D1,E1,F1),
   retract(casa(A,_,_,_,_,_)),
   assert(casa(A,B1,C1,D1,V,F1)).
cs(A,5,V):-casa(A,B1,C1,D1,E1,F1),
   retract(casa(A,_,_,_,_,_)),
   assert(casa(A,B1,C1,D1,E1,V)).

s1:-cs(1,2,5).
s2:-cs(3,3,5).
s3:-casa(N,_,5,_,_,_),M is N+1, M > 0, cs(M,1,3).
s4:-s4_2(1).
s4_2(5).
s4_2(N):-M is N+1,
   confirma_desocupado(N,1),
   confirma_desocupado(M,1),
   confirma_desocupado(N,3),
   casa(N,B,C,D,E,F),retract(casa(N,B,C,D,E,F)),assert(casa(N,2,C,2,E,F)),
   casa(M,B,C,D,E,F),retract(casa(M,B,C,D,E,F)),assert(casa(M,5,C,D,E,F)).
s4_2(N):-M is N+1, s4_2(M).

s5:-s5_2(1).
s5_2(5).
s5_2(N):-confirma_desocupado(N,1),
   confirma_desocupado(N,2),
   casa(N,B,C,D,E,F),retract(casa(N,B,C,D,E,F)),assert(casa(N,1,1,D,E,F)).
s5_2(N):-M is N+1, s5_2(M).

s6:-s6_2(1).
s6_2(5).
s6_2(N):-confirma_desocupado(N,1),
   casa(N,B,C,D,E,F),retract(casa(N,B,C,D,E,F)),assert(casa(N,4,C,D,E,F)).
s6_2(N):-M is N+1, s6_2(M).

s7:-casa(N,4,C,D,E,F),retract(casa(N,4,C,D,E,F)),assert(casa(N,4,C,D,4,F)).

s8:-s8_2(1).
s8_2(5).
s8_2(N):-M is N+1,
   confirma_desocupado(N,4),
   confirma_desocupado(M,3),
   cs(N,4,5),
   cs(M,3,4).
s8_2(N):-M is N+1, s8_2(M).

s10:-s10_2(1).
s10_2(6).
s10_2(N):-
   confirma_desocupado(N,2),
   confirma_desocupado(N,4),
   cs(N,2,4),
   cs(N,4,3).
s10_2(N):-M is N+1, s10_2(M).

s9:-s9_2(1).
s9_2(5).
s9_2(N):-
   confirma_desocupado(N,3),
   confirma_desocupado(N,4),
   cs(N,3,3),
   cs(N,4,2).
s9_2(N):-M is N+1, s9_2(M).

s11:-s11_2(1).
s11_2(6).
s11_2(N):-
   confirma_desocupado(N,4),
   confirma_desocupado(N,5),
   cs(N,4,1),
   cs(N,5,4).
s11_2(N):-M is N+1, s11_2(M).

s12:-casa(N,A,B,C,5,D),
   M is N+1,
   cs(M,5,3).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vai por mim, investiga Restrições em ProloG.... Eu já encontrei o ficheiro que contém a solução para este problema (com apenas 40 linhas de código), só ainda não a coloquei aqui porque se calhar não queres que dê a solução imediata....

Estes eram os slides que utilizavamos nas aulas, experimentar dar uma olhadela:

[*]http://paginas.fe.up.pt/~eol/LP/0809/documents/Praticas/PLR/PLR_2004_Slides.PDF

[*]http://paginas.fe.up.pt/~eol/LP/0809/documents/Praticas/PLR/PLR_Sictsus.pdf

cumps  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

neste caso o conceito de "visinho" em termos de restrições é que me está a fazer confusão

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora