Ir para o conteúdo
Nicpeterl

PROLOG - Quem vai pagar qual conta?

Mensagens Recomendadas

Nicpeterl

Boa noite pessoal, estou fazendo um trabalho que requer de mim a resolução do problema que pode ser encontrado no link que se segue: http://rachacuca.com.br/logica/problemas/fila-do-banco/, chamado de Fila de Banco. O objetivo é descobrir quem no final irá pagar cada uma das contas.

Depois de muito pesquisar consegui algo, mas n sei o que poderia fazer para melhorar até porque somente aprendi a trabalhar com Prolog há uma semana, poderiam me ajudar com dicas de como chegar ao meu objetivo, ou ainda, melhorias?Obrigado.

Segue o código abaixo:

% Fila.pl
% Nicolas P. Lane, Felipe de Avila.

fila :-
fila(Solution),
write_sol(Solution).

fila(Sol) :-
Sol = [
[1,C1,C01,N1,P1,A1,E1],
[2,C2,C02,N2,P2,A2,E2],
[3,C3,C03,N3,P3,A3,E3],
[4,C4,C04,N4,P4,A4,E4],
[5,C5,C05,N5,P5,A5,E5]],
member([4,_,_,_,_,_,sinuca],Sol),      % Na quarta posição está o homem que gosta de Sinuca.
member([5,_,_,_,_,_,futebol],Sol),      % Quem gosta de Futebol está na quinta posição.
member([2,_,_,_,_,_,basquete],Sol),      % O homem que gosta de Basquete está na segunda posição.
       member([2,vermelha,_,_,_,_,volei],Sol),      % Quem gosta de Vôlei está de Vermelho.
       member([PE,branca,_,_,_,_,_],Sol),      % O dono do Peixe está exatamente à esquerda de quem pratica Natação.
       member([NA,_,_,_,_,_,natacao],Sol),
NA =:= PE - 1,
       member([branca,_,_,_,_,tartaruga,_],Sol),    % O homem de Branco é o dono do réptil.
       member([sA,_,_,samuel,_,_,_],Sol),      % O Bombeiro está exatamente à direita do Samuel.
       member([bO,_,_,_,bombeiro,_,_],Sol),
BO =:= SA - 1,
member([5,_,_,_,veterinario,_,_],Sol),       % O Veterinário está na quinta posição.
member([3,_,_,_,pesquisador,_,_],Sol),       % O Pesquisador está na terceira posição.
       member([_,_,_,douglas,fotografo,_,_],Sol),   % Douglas trabalha como Fotógrafo.
member([5,_,_,jose,_,_,_],Sol),      % José está na quinta posição.
member([PES,_,_,_,pesquisador,_,_],Sol),     % O Pesquisador está exatamente à esquerda do Augusto.
       member([AU,_,_,augusto,_,_,_],Sol),
AU =:= PES - 1,
member([_,_,_,douglas,_,cachorro,_],Sol),    % Douglas tem um Cachorro.
       member([5,_,telefone,_,_,_,_],Sol),      % Na quinta posição está o homem da conta de Telefone.
member([_,branco,agua,_,_,_,_],Sol),      % O homem de Branco vai pagar a conta de Água.
member([3,_,luz,_,_,_,_],Sol),              % Na terceira posição está quem vai pagar a conta de Luz.
member([_,_,celular,ronaldo,_,_,_],Sol),     % Ronaldo vai pagar a conta de Celular.
member([_,verde,_,_,passaro,_],Sol),      % O homem de Verde tem um Pássaro.
member([1,azul,_,_,_,_,_],Sol);              % O homem de Azul está em uma das pontas.
member([5,azul,_,_,_,_,_],Sol),
member([sI,_,_,_,_,_,sinuca],Sol),  % O homem que tem um Gato está exatamente à direita de que gosta de Sinuca.
member([GA,_,_,_,_,gato,_],Sol),
SI =:= GA -1,
member([PA,_,_,_,_,passaro,_],Sol),  % O homem que tem um Pássaro está ao lado do que joga Sinuca.
member([sI2,_,_,_,_,water,_],Sol),
(PA =:= SI2 + 1; PA =:= SI2 - 1),
perm([amarela,azul,branca,verde,vermelha],[C1,C2,C3,C4,C5]),
perm([agua,aluguel,celular,luz,telefone],[C01,C02,C03,C04,C05]),
perm([augusto,douglas,jose,ronaldo,samuel],[N1,N2,N3,N4,N5]),
perm([bombeiro,fotografo,massagista,pesquisador,veterinario],[P1,P2,P3,P4,P5]),
perm([cachorro,gato,passaro,peixe,tartaruga],[A1,A2,A3,A4,A5]),
perm([basquete,futebol,sinuca,natacao,volei],[E1,E2,E3,E4,E5]).
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :- takeout(X,R,S).

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

write_sol([A,B,C,D,E]) :-
write('+--+------------+------------+------------+------------+------------+'),nl,
writef('|%2L|%12L|%12L|%12L|%12L|%12L|',A),nl,
writef('|%2L|%12L|%12L|%12L|%12L|%12L|',B),nl,
writef('|%2L|%12L|%12L|%12L|%12L|%12L|',C),nl,
writef('|%2L|%12L|%12L|%12L|%12L|%12L|',D),nl,
writef('|%2L|%12L|%12L|%12L|%12L|%12L|',E),nl,
write('+--+------------+------------+------------+------------+------------+'),nl.

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

isso tem vários erros, o primeiro é que isso nem corre (pelo menos no meu prolog) ...

eu não vou estar a codificar um problema de Einstein (já fiz isso muitas vezes), mas o que tens de fazer é bem mais do que isso (claramente o uso do predicado perm é desnecessário por uma simples razão : só existe uma solução ...

o que tens de fazer é pegar no problema e codificar predicados dos mais simples para os mais complexos :

<definição dos dados de uma pessoa>

- X é cor de camisa

- X é conta a pagar

- ...

<definição de uma pessoa>

- pessoa(A,B,C ...) :- cor_camisa(A), conta_a_pagar(B), ...

<etc, ... todas as outras restrições que aparecem no problema>

- ...

depois é só juntar tudo num só predicado

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

isso tem vários erros, o primeiro é que isso nem corre (pelo menos no meu prolog) ...

eu não vou estar a codificar um problema de Einstein (já fiz isso muitas vezes), mas o que tens de fazer é bem mais do que isso (claramente o uso do predicado perm é desnecessário por uma simples razão : só existe uma solução ...

o que tens de fazer é pegar no problema e codificar predicados dos mais simples para os mais complexos :

<definição dos dados de uma pessoa>

- X é cor de camisa

- X é conta a pagar

- ...

<definição de uma pessoa>

- pessoa(A,B,C ...) :- cor_camisa(A), conta_a_pagar(B), ...

<etc, ... todas as outras restrições que aparecem no problema>

- ...

depois é só juntar tudo num só predicado

Muito obrigado.

Poderias me recomendar uma apostila para aprender mais sobre esta linguagem?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

infelizmente não.

tudo que aprendi foi à imenso tempo e com muito trabalho ... (mesmo muito)

ontem à noite dei-me então ao trabalho de resolver isso. tenho o código só que (obviamente) não o vou amostrar.

posso dizer que este problema em concreto, realmente necessitou de usar o predicado permutation (que já existe em SWI-Prolog) para atribuir os valores restantes após a aplicação de todas as restrições.

o resultado obtido foi único (como o esperado) e foi :

?- fila.
+--+------------+------------+------------+------------+------------+------------+
|1 |vermelho    |aluguer     |douglas     |fotografo   |cachorro    |volei       |
|2 |amarelo     |telemovel   |ronaldo     |massagista  |peixe       |basquete    |
|3 |verde       |luz         |samuel      |pesquisador |passaro     |natacao     |
|4 |branco      |agua        |augusto     |bombeiro    |tartaruga   |snooker     |
|5 |azul        |telefone    |jose        |veterinario |gato        |futebol     |
+--+------------+------------+------------+------------+------------+------------+
true ;
false.

(sim alterei celular para telemovel e sinuca para snooker)

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

infelizmente não.

tudo que aprendi foi à imenso tempo e com muito trabalho ... (mesmo muito)

ontem à noite dei-me então ao trabalho de resolver isso. tenho o código só que (obviamente) não o vou amostrar.

posso dizer que este problema em concreto, realmente necessitou de usar o predicado permutation (que já existe em SWI-Prolog) para atribuir os valores restantes após a aplicação de todas as restrições.

o resultado obtido foi único (como o esperado) e foi :

?- fila.
+--+------------+------------+------------+------------+------------+------------+
|1 |vermelho |aluguer |douglas |fotografo |cachorro |volei |
|2 |amarelo |telemovel |ronaldo |massagista |peixe |basquete |
|3 |verde |luz |samuel |pesquisador |passaro |natacao |
|4 |branco |agua |augusto |bombeiro |tartaruga |snooker |
|5 |azul |telefone |jose |veterinario |gato |futebol |
+--+------------+------------+------------+------------+------------+------------+
true ;
false.

(sim alterei celular para telemovel e sinuca para snooker)

Que bela saída! Digas, em seu código você chegou a usar algo além do perm que eu tentei usar? Estou à todo vapor tentando fazer este código, mas como eu disse antes, tenho um conhecimento muito superficial desta linguagem. Estava tentando adaptar com o que eu aprendi em duas aulas de prolog para fazer este trabalho, mas estou tendo muitos problemas para fazer este código. O que aprendi basicamente seria como montar predicados simples e compostos além de regras simples e então baseado nisto fazer a unificação das variáveis com o que já se sabe da base de dados. Mas não estava tendo sucesso em minha empreitada, então procurei soluções de do exercício de einstein e procurei entender o código e então adaptar, mas não encontrei códigos que geravama solução de einstein sem recursividade, então procurei entender o código e adaptá-lo as minhas necessidades.

O problema então ficava em certos métodos usados pelos autores dos códigos aonde eu não sabia o que fazer para mudá-lo afim de trazer benefício a meu código.

De qualquer forma novamente, muito obrigado!

Vou continuar a tentar e procurar algo que me auxilie a chegar na solução.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

os únicos predicados da linguagem que usei (tirando os operadores) foi mesmo o "permutation" e o "member".

todos os outros tive de os escrever.

é assim ...

em termos práticos, o código que apresentaste aqui, não está completamente errado. a solução passa muito pela estrutura usada. tem é, obviamente, elementos errados.

vamos fazer assim ... como tenho o código todo comentado, vou colocar aqui a lista de comentários que tenho removendo o código para ver se consegues chegar lá só com isso:

/* base de dados >> definição dos valores possiveis para as posicoes */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para as cores */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para as contas a pagar */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os nomes */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os empregos */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os animais de estimacao */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os desportos favoritos */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* definição de um tuplo "pessoa" */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
person(Pos, Col, Bil, Nam, Job, Ani, Spo) :- /* .. do it yourself .. */.

/* predicado usado para determinar que um tuplo "pessoa" se encontra extritamente a esquerda de outra */
left(Per1, Per2, Sol) :- /* a primeira pessoa pertence a solucao */
                        /* .. do it yourself .. */,
                        /* a segunda pessoa pertence a solucao */
                        /* .. do it yourself .. */,

                        /* determinar o valor da posicao da primeira pessoa */
                        /* .. do it yourself .. */,
                        /* determinar o valor da posicao da segunda pessoa */
                        /* .. do it yourself .. */,

                        /* assumir que a posicao da primeira pessoa e o valor da posicao da segunda pessoa menos uma unidade */
                        /* .. do it yourself .. */.

/* predicado usado para determinar que um tuplo "pessoa" se encontra extritamente a direita de outra */
right(Per1, Per2, Sol) :- /* a primeira pessoa pertence a solucao */
                         /* .. do it yourself .. */,
                         /* a segunda pessoa pertence a solucao */
                         /* .. do it yourself .. */,

                         /* determinar o valor da posicao da primeira pessoa */
                         /* .. do it yourself .. */,
                         /* determinar o valor da posicao da segunda pessoa */
                         /* .. do it yourself .. */,

                         /* assumir que a posicao da primeira pessoa e o valor da posicao da segunda pessoa mais uma unidade */
                         /* .. do it yourself .. */.

/* predicado usado para determinar que um tuplo "pessoa" se encontra ao lado de outra */
side(Per1, Per2, Sol) :- /* a primeira pessoa encontrasse extritamente a esquerda da segunda pessoa */
                        ( /* .. do it yourself .. */;
                        /* ou a primeira pessoa encontrasse extritamente a direita da segunda pessoa */
                          /* .. do it yourself .. */ ).

/* predicado usado para determinar que um tuplo se encontra a cabeca de uma lista (primeiro elemento) */
/* .. do it yourself .. */

/* predicado usado para determinar que um tuplo se encontra no fim de uma lista (ultimo elemento) */
/* .. do it yourself .. */

/* predicado usado para determinar que um tuplo se encontra no inico ou no fim de uma lista */
first_or_last(Per, Sol) :- /* o elemento é o primeiro da lista */
                          ( /* .. do it yourself .. */;
                          /* ou e o ultimo */
                            /* .. do it yourself .. */ ).

/* predicado usado para escrever a informacao de uma pessoa */
write_person(person(Pos, Col, Bil, Nam, Job, Ani, Spo)) :- /* .. do it yourself .. */.

/* predicado usado para escrever a informacao de todas as pessoas */
write_sol(Sol) :- /* .. do it yourself .. */.

/* predicado usado para resolver o problema de Einstein */
fila :- /* a solucao e composta por uma lista de cinco valores */
       /* .. do it yourself .. */,

       /* determinar que os cinco valores do resultado sao do tipo "pessoa" com as suas posicoes dadas pela ordem natural dos numeros */
       /* .. do it yourself .. */,

       /* DICA >> Na quarta posição está o homem que gosta de Sinuca. */
       /* .. do it yourself .. */,
       /* DICA >> Quem gosta de Futebol está na quinta posição. */
       /* .. do it yourself .. */,
       /* DICA >> O homem que gosta de Basquete está na segunda posição. */
       /* .. do it yourself .. */,
       /* DICA >> Quem gosta de Vôlei está de Vermelho. */
       /* .. do it yourself .. */,
       /* DICA >> O dono do Peixe está exatamente à left de quem pratica Natação. */
       /* .. do it yourself .. */,
       /* DICA >> O homem de Branco é o dono do réptil. */
       /* .. do it yourself .. */,
       /* DICA >> O Bombeiro está exatamente à right do Samuel. */
       /* .. do it yourself .. */,
       /* DICA >> O Veterinário está na quinta posição. */
       /* .. do it yourself .. */,
       /* DICA >> O Perquisador está na terceira posição. */
       /* .. do it yourself .. */,
       /* DICA >> Douglas trabalha como Fotógrafo. */
       /* .. do it yourself .. */,
       /* DICA >> José está na quinta posição. */
       /* .. do it yourself .. */,
       /* DICA >> O Perquisador está exatamente à left do Augusto. */
       /* .. do it yourself .. */,
       /* DICA >> Douglas tem um Cachorro. */
       /* .. do it yourself .. */,
       /* DICA >> Na quinta posição está o homem da bill de Telefone. */
       /* .. do it yourself .. */,
       /* DICA >> O homem de Branco vai pagar a bill de Água. */
       /* .. do it yourself .. */,
       /* DICA >> Na terceira posição está quem vai pagar a bill de Luz. */
       /* .. do it yourself .. */,
       /* DICA >> Ronaldo vai pagar a bill de Celular. */
       /* .. do it yourself .. */,
       /* DICA >> O homem de Verde tem um Pássaro. */
       /* .. do it yourself .. */,
       /* DICA >> O homem de Azul está em uma das pontas. */
       /* .. do it yourself .. */,
       /* DICA >> O homem que tem um Gato está exatamente à right de que gosta de Sinuca. */
       /* .. do it yourself .. */,
       /* DICA >> O homem que tem um Pássaro está ao side do que joga Sinuca. */
       /* .. do it yourself .. */,

       /* determinar os valores a serem possiveis para os seis diferentes parametros dos tuplos "pessoas" resultado */
       /* fazer isto somente apos a execucao das restricoes anteriores para minimizar a arvore de resultados a ser criada-verificada */
       /* caso contrario, o tempo de execucao ira aumentar imensamente */
       /* .. do it yourself .. */,

       /* apresentar o resultado do problema */
       /* .. do it yourself .. */.

agora é só colocar o código correcto onde diz : /* .. do it yourself .. */


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

os únicos predicados da linguagem que usei (tirando os operadores) foi mesmo o "permutation" e o "member".

todos os outros tive de os escrever.

é assim ...

em termos práticos, o código que apresentaste aqui, não está completamente errado. a solução passa muito pela estrutura usada. tem é, obviamente, elementos errados.

vamos fazer assim ... como tenho o código todo comentado, vou colocar aqui a lista de comentários que tenho removendo o código para ver se consegues chegar lá só com isso:

/* base de dados >> definição dos valores possiveis para as posicoes */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para as cores */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para as contas a pagar */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os nomes */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os empregos */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os animais de estimacao */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* base de dados >> definição dos valores possiveis para os desportos favoritos */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
/* .. do it yourself .. */

/* definição de um tuplo "pessoa" */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
person(Pos, Col, Bil, Nam, Job, Ani, Spo) :- /* .. do it yourself .. */.

/* predicado usado para determinar que um tuplo "pessoa" se encontra extritamente a esquerda de outra */
left(Per1, Per2, Sol) :- /* a primeira pessoa pertence a solucao */
					 /* .. do it yourself .. */,
					 /* a segunda pessoa pertence a solucao */
					 /* .. do it yourself .. */,

					 /* determinar o valor da posicao da primeira pessoa */
					 /* .. do it yourself .. */,
					 /* determinar o valor da posicao da segunda pessoa */
					 /* .. do it yourself .. */,

					 /* assumir que a posicao da primeira pessoa e o valor da posicao da segunda pessoa menos uma unidade */
					 /* .. do it yourself .. */.

/* predicado usado para determinar que um tuplo "pessoa" se encontra extritamente a direita de outra */
right(Per1, Per2, Sol) :- /* a primeira pessoa pertence a solucao */
					  /* .. do it yourself .. */,
					  /* a segunda pessoa pertence a solucao */
					  /* .. do it yourself .. */,

					  /* determinar o valor da posicao da primeira pessoa */
					  /* .. do it yourself .. */,
					  /* determinar o valor da posicao da segunda pessoa */
					  /* .. do it yourself .. */,

					  /* assumir que a posicao da primeira pessoa e o valor da posicao da segunda pessoa mais uma unidade */
					  /* .. do it yourself .. */.

/* predicado usado para determinar que um tuplo "pessoa" se encontra ao lado de outra */
side(Per1, Per2, Sol) :- /* a primeira pessoa encontrasse extritamente a esquerda da segunda pessoa */
					 ( /* .. do it yourself .. */;
					 /* ou a primeira pessoa encontrasse extritamente a direita da segunda pessoa */
					   /* .. do it yourself .. */ ).

/* predicado usado para determinar que um tuplo se encontra a cabeca de uma lista (primeiro elemento) */
/* .. do it yourself .. */

/* predicado usado para determinar que um tuplo se encontra no fim de uma lista (ultimo elemento) */
/* .. do it yourself .. */

/* predicado usado para determinar que um tuplo se encontra no inico ou no fim de uma lista */
first_or_last(Per, Sol) :- /* o elemento é o primeiro da lista */
					   ( /* .. do it yourself .. */;
					   /* ou e o ultimo */
						 /* .. do it yourself .. */ ).

/* predicado usado para escrever a informacao de uma pessoa */
write_person(person(Pos, Col, Bil, Nam, Job, Ani, Spo)) :- /* .. do it yourself .. */.

/* predicado usado para escrever a informacao de todas as pessoas */
write_sol(Sol) :- /* .. do it yourself .. */.

/* predicado usado para resolver o problema de Einstein */
fila :- /* a solucao e composta por uma lista de cinco valores */
	/* .. do it yourself .. */,

	/* determinar que os cinco valores do resultado sao do tipo "pessoa" com as suas posicoes dadas pela ordem natural dos numeros */
	/* .. do it yourself .. */,

	/* DICA >> Na quarta posição está o homem que gosta de Sinuca. */
	/* .. do it yourself .. */,
	/* DICA >> Quem gosta de Futebol está na quinta posição. */
	/* .. do it yourself .. */,
	/* DICA >> O homem que gosta de Basquete está na segunda posição. */
	/* .. do it yourself .. */,
	/* DICA >> Quem gosta de Vôlei está de Vermelho. */
	/* .. do it yourself .. */,
	/* DICA >> O dono do Peixe está exatamente à left de quem pratica Natação. */
	/* .. do it yourself .. */,
	/* DICA >> O homem de Branco é o dono do réptil. */
	/* .. do it yourself .. */,
	/* DICA >> O Bombeiro está exatamente à right do Samuel. */
	/* .. do it yourself .. */,
	/* DICA >> O Veterinário está na quinta posição. */
	/* .. do it yourself .. */,
	/* DICA >> O Perquisador está na terceira posição. */
	/* .. do it yourself .. */,
	/* DICA >> Douglas trabalha como Fotógrafo. */
	/* .. do it yourself .. */,
	/* DICA >> José está na quinta posição. */
	/* .. do it yourself .. */,
	/* DICA >> O Perquisador está exatamente à left do Augusto. */
	/* .. do it yourself .. */,
	/* DICA >> Douglas tem um Cachorro. */
	/* .. do it yourself .. */,
	/* DICA >> Na quinta posição está o homem da bill de Telefone. */
	/* .. do it yourself .. */,
	/* DICA >> O homem de Branco vai pagar a bill de Água. */
	/* .. do it yourself .. */,
	/* DICA >> Na terceira posição está quem vai pagar a bill de Luz. */
	/* .. do it yourself .. */,
	/* DICA >> Ronaldo vai pagar a bill de Celular. */
	/* .. do it yourself .. */,
	/* DICA >> O homem de Verde tem um Pássaro. */
	/* .. do it yourself .. */,
	/* DICA >> O homem de Azul está em uma das pontas. */
	/* .. do it yourself .. */,
	/* DICA >> O homem que tem um Gato está exatamente à right de que gosta de Sinuca. */
	/* .. do it yourself .. */,
	/* DICA >> O homem que tem um Pássaro está ao side do que joga Sinuca. */
	/* .. do it yourself .. */,

	/* determinar os valores a serem possiveis para os seis diferentes parametros dos tuplos "pessoas" resultado */
	/* fazer isto somente apos a execucao das restricoes anteriores para minimizar a arvore de resultados a ser criada-verificada */
	/* caso contrario, o tempo de execucao ira aumentar imensamente */
	/* .. do it yourself .. */,

	/* apresentar o resultado do problema */
	/* .. do it yourself .. */.

agora é só colocar o código correcto onde diz : /* .. do it yourself .. */

Entendo.

Com certeza vou tentar, obrigado pela sua valiosa ajuda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

Entendo.

Com certeza vou tentar, obrigado pela sua valiosa ajuda.

Boa tarde, HappyHippyHippo. Tentei implementar me baseando em seus comentários, mas não estou conseguindo fazer nada satisfatório.

O problema em si não é difícil de ser feito, eu sei disto, tanto que no caderno eu o fiz. Mas para mim, implementar para que o Prolog o faça está sendo difícil de ser feito. Eu preciso aprender como fazer estes códigos complexos. Comecei então a fazer uma tentativa lendo seus comentários e então usando algumas partes do meu código que achei que dava de ser aproveitado, mas a maior parte não estar a resultar em algo bom.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

Fazer a construção dos predicados, por exemplo:

No meu código inicial eu usei

[1,C1,C01,N1,P1,A1,E1],

[2,C2,C02,N2,P2,A2,E2],

[3,C3,C03,N3,P3,A3,E3],

[4,C4,C04,N4,P4,A4,E4],

[5,C5,C05,N5,P5,A5,E5]],

Ordenações de dados em predicados com variáveis que ao longo do programa iriam sendo substituidas pelos fatos (ao menos era o objetivo :))

Mas meu problema está em fazer a programaçao adequada.

________________________________________

Nas estruturas opcionais, como eu as usaria para poder facilitar o processo de dedução do Prolog na varredura?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

mas afinal o que queres ? que te resolva o problema ?

pega no teu próprio código e vai testando, exemplo :

fila(Sol) :-
Sol = [
[1,C1,C01,N1,P1,A1,E1],
[2,C2,C02,N2,P2,A2,E2],
[3,C3,C03,N3,P3,A3,E3],
[4,C4,C04,N4,P4,A4,E4],
[5,C5,C05,N5,P5,A5,E5]],
member([4,_,_,_,_,_,sinuca],Sol).

?- fila(Sol).

ve o resultado e vai adicionando mais restrições


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

mas afinal o que queres ? que te resolva o problema ?

pega no teu próprio código e vai testando, exemplo :

fila(Sol) :-
Sol = [
[1,C1,C01,N1,P1,A1,E1],
[2,C2,C02,N2,P2,A2,E2],
[3,C3,C03,N3,P3,A3,E3],
[4,C4,C04,N4,P4,A4,E4],
[5,C5,C05,N5,P5,A5,E5]],
member([4,_,_,_,_,_,sinuca],Sol).

?- fila(Sol).

ve o resultado e vai adicionando mais restrições

Não, lógico que não. Desculpe se minhas perguntas parecem redundantes, mas eu realmente tenho dúvidas quando trata-se da sintaxe do prolog.

Por exemplo, apenas a pouco descobri o que são listas em Prolog, meu código tinha eles e eu simplesmente não sabia o que eram assim como muitos símbolos. Entenda, não quero lhe estressar, realmente me perdoe, mas ainda estou em um período de aprendizagem nesta linguagem e com um trabalho certamente além do básico que me foi ensinado em sala sobre Prolog.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

Boas, consegui melhorar o meu código significativamente.

Mas tenho uma problema quanto a lógica para definir vizinhos sejam à esquerda ou à direita,o código nao está gerando a resposta final provavelmente por causa dela. Se me ajudassem a enteder a lógica das vizinhanças eu poderia terminá-lo.

Segue abaixo o código:

%_____________________________________________________________________________________________________________

%Autor: Nicpeterl
%Data:18/11/2013
%Exe Fila.pl

gerando_ca(homem(A, _, _, _, _, _), [A], []) :- !.
gerando_ca(homem(A, _, _, _, _, _), Camisas, Resto) :- select(A, Camisas, Resto).

gerando_co(homem(_, B, _, _, _, _), [b], []) :- !.
gerando_co(homem(_, B, _, _, _, _), Contas, Resto) :- select(B, Contas, Resto).

gerando_no(homem(_, _, C, _, _, _), [C], []) :- !.
gerando_no(homem(_, _, C, _, _, _), Nomes, Resto) :- select(C, Nomes, Resto).

gerando_pr(homem(_, _, _, D, _, _), [D], []) :- !.
gerando_pr(homem(_, _, _, D, _, _), Profissoes, Resto) :- select(D, Profissoes, Resto).

gerando_an(homem(_, _, _, _, E, _), [E], []) :- !.
gerando_an(homem(_, _, _, _, E, _), Animais, Resto) :- select(E, Animais, Resto).

gerando_es(homem(_, _, _, _, _, F), [F], []) :- !.
gerando_es(homem(_, _, _, _, _, F), Esportes, Resto) :- select(F, Esportes, Resto).

gerando_homem(X, atr(Cas, Cos, Nes, Pes, Ais, Ets), atr(Cas2, Cos2, Nes2, Pes2, Ais2, Ets2)) :-
	gerando_ca(X, Cas, Cas2), gerando_co(X, Cos, Cos2), gerando_no(X, Nes, Nes2),
gerando_pr(X, Pes, Pes2), gerando_an(X, Ais, Ais2), gerando_es(X, Ets, Ets2).

gerando_homens([], _) :- !.
gerando_homens([X|Cas], Atribs) :-
	gerando_homem(X, Atribs, Atribs2), gerando_homens(Cas, Atribs2).

gr_sol([H1, H2, H3, H4, H5]) :-
	Camisas = [amarelo,azul,branco,verde,vermelho],
	Contas = [agua,aluguel,celular,luz,telefone],
	Nomes = [augusto,douglas,jose,ronaldo,samuel],
	Profissoes = [bombeiro,fotografo,massagista,pesquisador,veterinario],
	Animais = [cachorro,gato,passaro,peixe,tartaruga],
	Esportes = [basquete,futebol,sinuca,natacao,volei],
gerando_homens([H1, H2, H3, H4, H5], atr(Camisas, Contas, Nomes, Profissoes, Animais, Esportes)).

%funcionalidade (faltando complementar)->errada

vizinho_esq(H2, H3, [H2,H3|_]).
vizinho_esq(H2, H3, [H4|T]) :- vizinho_esq(H2, H3, T).

vizinho_dir(H2, H3, [H3,H2|_]).
vizinho_dir(H2, H3, [H4|T]) :- vizinho_dir(H2, H3, T).

vizinho(H2, H3, S) :- vizinho_esq(H2, H3, S).
vizinho(H2, H3, S) :- vizinho_dir(H2, H3, S).

%--------------------------------------
solucao(S):-
(H1=homem(azul,_,_,_,_,_)),not((H2=homem(azul,_,_,_,_,_))),  % Azul está em uma das pontas (H1, H5)
not((H3=homem(azul,_,_,_,_,_))),not((H4=homem(azul,_,_,_,_,_))),not((H5=azul,_,_,_,_,_)); % Enfatizando apenas as pontas
(H5=homem(azul,_,_,_,_,_)),not((H1=homem(azul,_,_,_,_,_))),not((H2=homem(azul,_,_,_,_,_))),% Enfatizando apenas as pontas
not((H3=homem(azul,_,_,_,_,_))),not((H4=homem(azul,_,_,_,_,_))), % Enfatizando apenas as pontas

H2=homem(_,_,_,_,_,futebol), % Quem gosta de basquete está na 2ª posição.
H3=homem(_,_,_,pesquisador,_,_), % O pesquisador está na 3ª posição.
H3=homem(_,luz,_,_,_,_), % Quem vai pagar a conta de luz está na 3ª posição.
H4=homem(_,_,_,_,_,sinuca), % Quem gosta de sinuca está na 4ª posição.
H5=homem(_,_,_,_,_,futebol), % Quem gosta de futebol está na 5ª posição.
H5=homem(_,_,_,veterinario,_,_),% veterinario está na 5ª posicao.
H5=homem(_,_,jose,_,_), %Jose está na 5ª posição.
H5=homem(_,telefone,_,_,_,_), %Quem paga a conta de telefone está na 5ª posição.

S=[H1,H2,H3,H4,H5], !,
%complemento de inf. da função anterior (vizinho_esq e vizinho)
%//Completar dados
   vizinho_esq(homem(_,_,_,_,_,_),homem(_,_,_,_,_,_), S),
	vizinho(homem(_,_,_,_,_,_), homem(_,_,_,_,_,_), S),
	vizinho(homem(_,_,_,_,_,_),homem(_,_,_,_,_,_), S),
	vizinho(homem(_,_,_,_,_,_),homem(_,_,_,_,_,_), S),
	vizinho(homem(_,_,_,_,_,_),homem(_,_,_,_,_,_), S),
%-------------------------------
member(homem(vermelho,_,_,_,_,volei), S), %Quem usa vermelho gosta de volei.
member(homem(branco,_,_,_,tartaruga,_), S), % Quem usa branco tem réptil(tartaruga)
member(homem(_,_,douglas,fotografo,_,_), S), %Douglas é fotógrafo
member(homem(_,_,douglas,cachorro,_,_), S), % Douglas tem um cão.
member(homem(_,celular,ronaldo,_,_,_), S), % Ronaldo vai pagar uma conta de celular.
member(homem(verde,_,_,_,passaro,_), S), % O homem que tem um passaro usa verde.
gr_sol(S).



%_____________________________________________________________________________________________________________

Editado por Baderous
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não tive a ver o código, só mesmo o da vizinhança.

mas o problema parece estar aqui:

não existe relação entre H4 e H2 ou H3

o próprio PorLog te deve dizer que H4 é uma variável sem relação nenhuma quando carregas o código

deverá faltar somente que H4 é diferente de H2


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

não tive a ver o código, só mesmo o da vizinhança.

mas o problema parece estar aqui:

não existe relação entre H4 e H2 ou H3

o próprio PorLog te deve dizer que H4 é uma variável sem relação nenhuma quando carregas o código

deverá faltar somente que H4 é diferente de H2

Muito Bem, sim...isso ocorreu-me durante a noite de ter percebido, mas esquecido de editar a postagem.

Agora a pouco estava revendo como poderia fazer para conseguir vizinhança.

E consegui o seguinte:

__________________________________________________________

vizinho_esq(A, B, [A,B|_]).
vizinho_esq(A, B, [_|S]) :- vizinho_esq(A, B, S), A\==S, B\==S, A\==B.

vizinho_dir(A, B, [b,A|_]).
vizinho_dir(A, B, [_|S]) :- vizinho_dir(A, B, S), A\==S, B\==S, A\==B.

vizinho(A, B, S) :- vizinho_esq(A, B, S) ; vizinho_dir(A, B, S).
_________________________________________

Isso me parece estar certo, mas algo ainda está a dar errado ao pedir pela  "solução(S). " no swi-prolog.
O código mais atual é este abaixo:
_________________________________________

gerando_ca(homem(A, _, _, _, _, _), [A], []) :- !.
gerando_ca(homem(A, _, _, _, _, _), Camisas, Resto) :- select(A, Camisas, Resto).

gerando_co(homem(_, B, _, _, _, _), [b], []) :- !.
gerando_co(homem(_, B, _, _, _, _), Contas, Resto) :- select(B, Contas, Resto).

gerando_no(homem(_, _, C, _, _, _), [C], []) :- !.
gerando_no(homem(_, _, C, _, _, _), Nomes, Resto) :- select(C, Nomes, Resto).

gerando_pr(homem(_, _, _, D, _, _), [D], []) :- !.
gerando_pr(homem(_, _, _, D, _, _), Profissoes, Resto) :- select(D, Profissoes, Resto).

gerando_an(homem(_, _, _, _, E, _), [E], []) :- !.
gerando_an(homem(_, _, _, _, E, _), Animais, Resto) :- select(E, Animais, Resto).

gerando_es(homem(_, _, _, _, _, F), [F], []) :- !.
gerando_es(homem(_, _, _, _, _, F), Esportes, Resto) :- select(F, Esportes, Resto).

gerando_homem(X, atr(Cas, Cos, Nes, Pes, Ais, Ets), atr(Cas2, Cos2, Nes2, Pes2, Ais2, Ets2)) :-
	gerando_ca(X, Cas, Cas2), gerando_co(X, Cos, Cos2), gerando_no(X, Nes, Nes2),
gerando_pr(X, Pes, Pes2), gerando_an(X, Ais, Ais2), gerando_es(X, Ets, Ets2).

gerando_homens([], _) :- !.
gerando_homens([X|Cas], Atribs) :-
	gerando_homem(X, Atribs, Atribs2), gerando_homens(Cas, Atribs2).

gr_sol([H1, H2, H3, H4, H5]) :-
	Camisas = [amarelo,azul,branco,verde,vermelho],
	Contas = [agua,aluguel,celular,luz,telefone],
	Nomes = [augusto,douglas,jose,ronaldo,samuel],
	Profissoes = [bombeiro,fotografo,massagista,pesquisador,veterinario],
	Animais = [cachorro,gato,passaro,peixe,tartaruga],
	Esportes = [basquete,futebol,sinuca,natacao,volei],
gerando_homens([H1, H2, H3, H4, H5], atr(Camisas, Contas, Nomes, Profissoes, Animais, Esportes)).

%funcionalidade faltando complementar

vizinho_esq(A, B, [A,B|_]).
vizinho_esq(A, B, [_|S]) :- vizinho_esq(A, B, S), A\==S, B\==S, A\==B.

vizinho_dir(A, B, [b,A|_]).
vizinho_dir(A, B, [_|S]) :- vizinho_dir(A, B, S), A\==S, B\==S, A\==B.

vizinho(A, B, S) :- vizinho_esq(A, B, S) ; vizinho_dir(A, B, S).

%--------------------------------------
solucao(S):-
  (H1=homem(azul,_,_,_,_,_)),not((H2=homem(azul,_,_,_,_,_))),  % Azul está em uma das pontas (H1 ou H5)
not((H3=homem(azul,_,_,_,_,_))),not((H4=homem(azul,_,_,_,_,_))),not((H5=azul,_,_,_,_,_)); % Enfatizando apenas as pontas
  (H5=homem(azul,_,_,_,_,_)),not((H1=homem(azul,_,_,_,_,_))),not((H2=homem(azul,_,_,_,_,_))),% Enfatizando apenas as pontas
  not((H3=homem(azul,_,_,_,_,_))),not((H4=homem(azul,_,_,_,_,_))), % Enfatizando apenas as pontas

H2=homem(_,_,_,_,_,futebol), % Quem gosta de basquete está na 2ª posição.
H3=homem(_,_,_,pesquisador,_,_), % O pesquisador está na 3ª posição.
H3=homem(_,luz,_,_,_,_), % Quem vai pagar a conta de luz está na 3ª posição.
H4=homem(_,_,_,_,_,sinuca), % Quem gosta de sinuca está na 4ª posição.
H5=homem(_,_,_,_,_,futebol), % Quem gosta de futebol está na 5ª posição.
H5=homem(_,_,_,veterinario,_,_),% Veterinário está na 5ª posicao.
H5=homem(_,_,jose,_,_,_), %Jose está na 5ª posição.
H5=homem(_,telefone,_,_,_,_), %Quem paga a conta de telefone está na 5ª posição.

S=[H1,H2,H3,H4,H5], !,
%complemento de inf. da função anterior
	%//Completar dados
	vizinho_esq(homem(_,_,_,_,natacao,_),homem(_,_,_,_,peixe,_), S),%Quem faz natacao está à direita de quem tem peixe.
	vizinho_esq(homem(_,_,augusto,_,_,_),homem(_,_,_,pesquisador,_,_), S),%Augusto está à esquerda do pesquisador.
vizinho_dir(homem(_,_,_,bombeiro,_,_),homem(_,_,samuel,_,_,_), S), %Samuel está à direita do Bombeiro.
vizinho_dir(homem(_,_,_,_,_,sinuca),homem(_,_,_,_,gato,_), S),%Quem tem um gato está a direta de quem joga Sinuca.
vizinho(homem(_,_,_,_,passaro,_),homem(_,_,_,_,_,sinuca), S),%Quem tem um pássaro é vizinho de quem joga sinuca.
%-------------------------------
member(homem(vermelho,_,_,_,_,volei), S), %Quem usa vermelho gosta de volei.
member(homem(branco,_,_,_,tartaruga,_), S), % Quem usa branco tem réptil(tartaruga)
member(homem(_,_,douglas,fotografo,_,_), S), %Douglas é fotógrafo
member(homem(_,_,douglas,cachorro,_,_), S), % Douglas tem um cão.
member(homem(_,celular,ronaldo,_,_,_), S), % Ronaldo vai pagar uma conta de celular.
member(homem(verde,_,_,_,passaro,_), S), % O homem que tem um passaro usa verde.
gr_sol(S).

_________________________________________

Editado por Baderous
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

tens um problema grave (razão da qual eu disse que usei permutações).

quando atribuis valores aos atributos da pessoa, não estás a garantir que mais nenhum registo possa ter esse atributo.

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

tens um problema grave (razão da qual eu disse que usei permutações).

quando atribuis valores aos atributos da pessoa, não estás a garantir que mais nenhum registo possa ter esse atributo.

Certo, tentei usar o que você indicou...mas não sei aonde estou errando em seu uso.

Poderias olhar meu código e dizer-me se estou fazendo certo ou aonde estou errando?

_____________________________________________________________________________
Minha atual função de permutação:


takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :- takeout(X,R,S).

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

_____________________________________________________________________________
%Código com perm aplicado.


gerando_ca(homem(A, _, _, _, _, _), [A], []) :- !.
gerando_ca(homem(A, _, _, _, _, _), Camisas, Resto) :- select(A, Camisas, Resto).

gerando_co(homem(_, B, _, _, _, _), [b], []) :- !.
gerando_co(homem(_, B, _, _, _, _), Contas, Resto) :- select(B, Contas, Resto).

gerando_no(homem(_, _, C, _, _, _), [C], []) :- !.
gerando_no(homem(_, _, C, _, _, _), Nomes, Resto) :- select(C, Nomes, Resto).

gerando_pr(homem(_, _, _, D, _, _), [D], []) :- !.
gerando_pr(homem(_, _, _, D, _, _), Profissoes, Resto) :- select(D, Profissoes, Resto).

gerando_an(homem(_, _, _, _, E, _), [E], []) :- !.
gerando_an(homem(_, _, _, _, E, _), Animais, Resto) :- select(E, Animais, Resto).

gerando_es(homem(_, _, _, _, _, F), [F], []) :- !.
gerando_es(homem(_, _, _, _, _, F), Esportes, Resto) :- select(F, Esportes, Resto).

gerando_homem(X, atr(Cas, Cos, Nes, Pes, Ais, Ets), atr(Cas2, Cos2, Nes2, Pes2, Ais2, Ets2)) :-
	gerando_ca(X, Cas, Cas2), gerando_co(X, Cos, Cos2), gerando_no(X, Nes, Nes2),
gerando_pr(X, Pes, Pes2), gerando_an(X, Ais, Ais2), gerando_es(X, Ets, Ets2).

gerando_homens([], _) :- !.
gerando_homens([X|Cas], Atribs) :-
	gerando_homem(X, Atribs, Atribs2), gerando_homens(Cas, Atribs2).

gr_sol([H1, H2, H3, H4, H5]) :-
	Camisas = perm([amarelo,azul,branco,verde,vermelho]),
	Contas = perm([agua,aluguel,celular,luz,telefone]),
	Nomes = perm([augusto,douglas,jose,ronaldo,samuel]),
	Profissoes = perm([bombeiro,fotografo,massagista,pesquisador,veterinario]),
	Animais = perm([cachorro,gato,passaro,peixe,tartaruga]),
	Esportes = perm([basquete,futebol,sinuca,natacao,volei]),
gerando_homens([H1, H2, H3, H4, H5], atr(Camisas, Contas, Nomes, Profissoes, Animais, Esportes)).

%funcionalidade faltando complementar

vizinho_esq(A, B, [A,B|_]).
vizinho_esq(A, B, [_|S]) :- vizinho_esq(A, B, S), A\==S, B\==S, A\==B.

vizinho_dir(A, B, [b,A|_]).
vizinho_dir(A, B, [_|S]) :- vizinho_dir(A, B, S), A\==S, B\==S, A\==B.

vizinho(A, B, S) :- vizinho_esq(A, B, S) ; vizinho_dir(A, B, S).

%--------------------------------------
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :- takeout(X,R,S).

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

solucao(S):-
  (H1=perm(homem(azul,_,_,_,_,_))),not((H2=perm(homem(azul,_,_,_,_,_)))),not((H3=perm(homem(azul,_,_,_,_,_)))),
  not((H4=perm(homem(azul,_,_,_,_,_)))),not((H5=perm(homem(azul,_,_,_,_,_)))); % Azul está unicamente na posicao 1 ou 5.
  (H5=perm(homem(azul,_,_,_,_,_))),not((H1=perm(homem(azul,_,_,_,_,_)))),not((H2=perm(homem(azul,_,_,_,_,_)))),
  not((H3=perm(homem(azul,_,_,_,_,_)))),not((H4=perm(homem(azul,_,_,_,_,_)))),

H2=perm(homem(_,_,_,_,_,futebol)), % Quem gosta de basquete está na 2ª posição.
H3=perm(homem(_,_,_,pesquisador,_,_)), % O pesquisador está na 3ª posição.
H3=perm(homem(_,luz,_,_,_,_)), % Quem vai pagar a conta de luz está na 3ª posição.
H4=perm(homem(_,_,_,_,_,sinuca)), % Quem gosta de sinuca está na 4ª posição.
H5=perm(homem(_,_,_,_,_,futebol)), % Quem gosta de futebol está na 5ª posição.
H5=perm(homem(_,_,_,veterinario,_,_)),% Veterinário está na 5ª posicao.
H5=perm(homem(_,_,jose,_,_,_)), %Jose está na 5ª posição.
H5=perm(homem(_,telefone,_,_,_,_)), %Quem paga a conta de telefone está na 5ª posição.


S=[H1,H2,H3,H4,H5], !,
%complemento de inf. da função anterior
	%//Completar dados
	vizinho_esq(perm(homem(_,_,_,_,natacao,_)),perm(homem(_,_,_,_,peixe,_)), S),
%Quem faz natacao está à direita de quem tem peixe.
	vizinho_esq(perm(homem(_,_,augusto,_,_,_)),perm(homem(_,_,_,pesquisador,_,_)), S),
%Augusto está à esquerda do pesquisador.
vizinho_dir(perm(homem(_,_,_,bombeiro,_,_)),perm(homem(_,_,samuel,_,_,_)), S),
	%Samuel está à direita do Bombeiro.
vizinho_dir(perm(homem(_,_,_,_,_,sinuca)),perm(homem(_,_,_,_,gato,_)), S),
%Quem tem um gato está a direta de quem joga Sinuca.
vizinho(perm(homem(_,_,_,_,passaro,_)),perm(homem(_,_,_,_,_,sinuca)), S),
%Quem tem um pássaro é vizinho de quem joga sinuca.
%-------------------------------
member(perm(homem(vermelho,_,_,_,_,volei)), S), %Quem usa vermelho gosta de volei.
member(perm(homem(branco,_,_,_,tartaruga,_)), S), % Quem usa branco tem réptil(tartaruga)
member(perm(homem(_,_,douglas,fotografo,_,_)), S), %Douglas é fotógrafo
member(perm(homem(_,_,douglas,cachorro,_,_)), S), % Douglas tem um cão.
member(perm(homem(_,celular,ronaldo,_,_,_)), S), % Ronaldo vai pagar uma conta de celular.
member(perm(homem(verde,_,_,_,passaro,_)), S), % O homem que tem um passaro usa verde.
gr_sol(S).

___________________________________________________________________

Editado por Baderous
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

Certo, tentei usar o que você indicou...mas não sei aonde estou errando em seu uso.

Poderias olhar meu código e dizer-me se estou fazendo certo ou aonde estou errando?

_____________________________________________________________________________
Minha atual função de permutação:


takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :- takeout(X,R,S).

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

_____________________________________________________________________________
%Código com perm aplicado.


gerando_ca(homem(A, _, _, _, _, _), [A], []) :- !.
gerando_ca(homem(A, _, _, _, _, _), Camisas, Resto) :- select(A, Camisas, Resto).

gerando_co(homem(_, B, _, _, _, _), [b], []) :- !.
gerando_co(homem(_, B, _, _, _, _), Contas, Resto) :- select(B, Contas, Resto).

gerando_no(homem(_, _, C, _, _, _), [C], []) :- !.
gerando_no(homem(_, _, C, _, _, _), Nomes, Resto) :- select(C, Nomes, Resto).

gerando_pr(homem(_, _, _, D, _, _), [D], []) :- !.
gerando_pr(homem(_, _, _, D, _, _), Profissoes, Resto) :- select(D, Profissoes, Resto).

gerando_an(homem(_, _, _, _, E, _), [E], []) :- !.
gerando_an(homem(_, _, _, _, E, _), Animais, Resto) :- select(E, Animais, Resto).

gerando_es(homem(_, _, _, _, _, F), [F], []) :- !.
gerando_es(homem(_, _, _, _, _, F), Esportes, Resto) :- select(F, Esportes, Resto).

gerando_homem(X, atr(Cas, Cos, Nes, Pes, Ais, Ets), atr(Cas2, Cos2, Nes2, Pes2, Ais2, Ets2)) :-
	gerando_ca(X, Cas, Cas2), gerando_co(X, Cos, Cos2), gerando_no(X, Nes, Nes2),
gerando_pr(X, Pes, Pes2), gerando_an(X, Ais, Ais2), gerando_es(X, Ets, Ets2).

gerando_homens([], _) :- !.
gerando_homens([X|Cas], Atribs) :-
	gerando_homem(X, Atribs, Atribs2), gerando_homens(Cas, Atribs2).

gr_sol([H1, H2, H3, H4, H5]) :-
	Camisas = perm([amarelo,azul,branco,verde,vermelho]),
	Contas = perm([agua,aluguel,celular,luz,telefone]),
	Nomes = perm([augusto,douglas,jose,ronaldo,samuel]),
	Profissoes = perm([bombeiro,fotografo,massagista,pesquisador,veterinario]),
	Animais = perm([cachorro,gato,passaro,peixe,tartaruga]),
	Esportes = perm([basquete,futebol,sinuca,natacao,volei]),
gerando_homens([H1, H2, H3, H4, H5], atr(Camisas, Contas, Nomes, Profissoes, Animais, Esportes)).

%funcionalidade faltando complementar

vizinho_esq(A, B, [A,B|_]).
vizinho_esq(A, B, [_|S]) :- vizinho_esq(A, B, S), A\==S, B\==S, A\==B.

vizinho_dir(A, B, [b,A|_]).
vizinho_dir(A, B, [_|S]) :- vizinho_dir(A, B, S), A\==S, B\==S, A\==B.

vizinho(A, B, S) :- vizinho_esq(A, B, S) ; vizinho_dir(A, B, S).

%--------------------------------------
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :- takeout(X,R,S).

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

solucao(S):-
  (H1=perm(homem(azul,_,_,_,_,_))),not((H2=perm(homem(azul,_,_,_,_,_)))),not((H3=perm(homem(azul,_,_,_,_,_)))),
  not((H4=perm(homem(azul,_,_,_,_,_)))),not((H5=perm(homem(azul,_,_,_,_,_)))); % Azul está unicamente na posicao 1 ou 5.
  (H5=perm(homem(azul,_,_,_,_,_))),not((H1=perm(homem(azul,_,_,_,_,_)))),not((H2=perm(homem(azul,_,_,_,_,_)))),
  not((H3=perm(homem(azul,_,_,_,_,_)))),not((H4=perm(homem(azul,_,_,_,_,_)))),

H2=perm(homem(_,_,_,_,_,futebol)), % Quem gosta de basquete está na 2ª posição.
H3=perm(homem(_,_,_,pesquisador,_,_)), % O pesquisador está na 3ª posição.
H3=perm(homem(_,luz,_,_,_,_)), % Quem vai pagar a conta de luz está na 3ª posição.
H4=perm(homem(_,_,_,_,_,sinuca)), % Quem gosta de sinuca está na 4ª posição.
H5=perm(homem(_,_,_,_,_,futebol)), % Quem gosta de futebol está na 5ª posição.
H5=perm(homem(_,_,_,veterinario,_,_)),% Veterinário está na 5ª posicao.
H5=perm(homem(_,_,jose,_,_,_)), %Jose está na 5ª posição.
H5=perm(homem(_,telefone,_,_,_,_)), %Quem paga a conta de telefone está na 5ª posição.


S=[H1,H2,H3,H4,H5], !,
%complemento de inf. da função anterior
	%//Completar dados
	vizinho_esq(perm(homem(_,_,_,_,natacao,_)),perm(homem(_,_,_,_,peixe,_)), S),
%Quem faz natacao está à direita de quem tem peixe.
	vizinho_esq(perm(homem(_,_,augusto,_,_,_)),perm(homem(_,_,_,pesquisador,_,_)), S),
%Augusto está à esquerda do pesquisador.
vizinho_dir(perm(homem(_,_,_,bombeiro,_,_)),perm(homem(_,_,samuel,_,_,_)), S),
	%Samuel está à direita do Bombeiro.
vizinho_dir(perm(homem(_,_,_,_,_,sinuca)),perm(homem(_,_,_,_,gato,_)), S),
%Quem tem um gato está a direta de quem joga Sinuca.
vizinho(perm(homem(_,_,_,_,passaro,_)),perm(homem(_,_,_,_,_,sinuca)), S),
%Quem tem um pássaro é vizinho de quem joga sinuca.
%-------------------------------
member(perm(homem(vermelho,_,_,_,_,volei)), S), %Quem usa vermelho gosta de volei.
member(perm(homem(branco,_,_,_,tartaruga,_)), S), % Quem usa branco tem réptil(tartaruga)
member(perm(homem(_,_,douglas,fotografo,_,_)), S), %Douglas é fotógrafo
member(perm(homem(_,_,douglas,cachorro,_,_)), S), % Douglas tem um cão.
member(perm(homem(_,celular,ronaldo,_,_,_)), S), % Ronaldo vai pagar uma conta de celular.
member(perm(homem(verde,_,_,_,passaro,_)), S), % O homem que tem um passaro usa verde.
gr_sol(S).

___________________________________________________________________

Consegui.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

não com esse código ... isso dá false.

Não, tentei fazer sem recursividade.

Usando a base de dados e formando um único predicado principal.

Com ele consegui.

% Exercício -> Substituido por:
% Augusto   -> Ronaldo
% Douglas   -> Alexsando
% Jose      -> Nico
% Ronaldo   -> Renan
% Samuel    -> Airton
%

camisas(amarela).
camisas(azul).
camisas(branca).
camisas(vermelha).
contas(agua).
contas(aluguel).
contas(celular).
nomes(alexsandro).
nomes(renan).
nomes(airton).
profissoes(bombeiro).
profissoes(fotografo).
profissoes(massagista).
animais(cachorro).
animais(peixe).
animais(tartaruga).
esportes(volei).
esportes(natacao).

x :- deduz(A,B,C,D,E),write(A),nl,write(B),nl,write(C),nl,write(D),nl,write(E),nl,!.

deduz((homem_1  ,CAMISA1 , CONTA1   , NOME1   , PROFISSAO1  , ANIMAL1 , ESPORTE1),
     (homem_2  ,CAMISA2 , CONTA2   , NOME2   , PROFISSAO2  , ANIMAL2 , basquete),
     (homem_3  ,verde   , luz      , NOME3   , pesquisador , passaro , ESPORTE3),
     (homem_4  ,CAMISA4 , CONTA4   , ronaldo , PROFISSAO4  , ANIMAL4 , sinuca  ),
     (homem_5  ,CAMISA5 , telefone , nico    , veterinario , gato    , futebol )):-

camisas(CAMISA1),camisas(CAMISA2),camisas(CAMISA4),camisas(CAMISA5),
CAMISA1 \== CAMISA2,
CAMISA1 \== CAMISA4,
CAMISA1 \== CAMISA5,
CAMISA2 \== CAMISA4,
CAMISA2 \== CAMISA5,
CAMISA4 \== CAMISA5,
contas(CONTA1),contas(CONTA2),contas(CONTA4),
CONTA1\==CONTA2,
CONTA1\==CONTA4,
CONTA2\==CONTA4,
nomes(NOME1),nomes(NOME2),nomes(NOME3),
NOME1\==NOME2,
NOME1\==NOME3,
NOME2\==NOME3,
profissoes(PROFISSAO1),profissoes(PROFISSAO2),profissoes(PROFISSAO4),
PROFISSAO1\==PROFISSAO2,
PROFISSAO1\==PROFISSAO4,
PROFISSAO2\==PROFISSAO4,
animais(ANIMAL1),animais(ANIMAL2),animais(ANIMAL4),
ANIMAL1\==ANIMAL2,
ANIMAL1\==ANIMAL4,
ANIMAL2\==ANIMAL4,
esportes(ESPORTE1), esportes(ESPORTE3),
ESPORTE1 \== ESPORTE3,
((ESPORTE1 == volei , CAMISA1 == vermelha )),
(ESPORTE3 == natacao , ANIMAL2 == peixe ) ,
((CAMISA1 == branca , ANIMAL1 == tartaruga ) ; (CAMISA2 == branca, ANIMAL2 == tartaruga );
(CAMISA4 == branca , ANIMAL4 == tartaruga )),
((NOME1 == airton , PROFISSAO2 == bombeiro ); (NOME3 == airton , PROFISSAO4 == bombeiro )),
((NOME1 == alexsandro , PROFISSAO1 == fotografo ); (NOME2 == alexsandro , PROFISSAO2 == fotografo )),
((NOME1 == alexsandro , ANIMAL1 == cachorro ); (NOME2 == alexsandro , ANIMAL2 == cachorro )),
((CAMISA1 == branca , CONTA1 == agua ); (CAMISA4 == branca , CONTA4 == agua )),
((NOME1 == renan , CONTA1 == celular ); (NOME2 == renan , CONTA2 == celular )),
(CAMISA1 == azul ; CAMISA5 == azul ).

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

dei uma vista de olhos pelo código, e parece que andas-te a fazer metado do trabalho da aplicação ...

exemplo:

((NOME1 == renan , CONTA1 == celular ); (NOME2 == renan , CONTA2 == celular ))

como sabes que só pode estar na primeira ou na segunda posição ?

é objectivo da programação que não sejas tu a fazer esse tipo de trabalho. deveria ser o código a determinar essas condições


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nicpeterl

dei uma vista de olhos pelo código, e parece que andas-te a fazer metado do trabalho da aplicação ...

exemplo:

((NOME1 == renan , CONTA1 == celular ); (NOME2 == renan , CONTA2 == celular ))

como sabes que só pode estar na primeira ou na segunda posição ?

é objectivo da programação que não sejas tu a fazer esse tipo de trabalho. deveria ser o código a determinar essas condições

Bem, lembra-se que havia dito que apenas havia tido poucas aulas de Prolog?

Pois bem o professor autorizou que nós fizéssimos algumas simplificações para o prolog deduzir mais rapidamente.

Mas, sim você está certo geramente deixa-se o Prolog realizar todas as inferências.

Em todo o caso, muito obrigado pela sua ajuda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Bem, lembra-se que havia dito que apenas havia tido poucas aulas de Prolog?

Pois bem o professor autorizou que nós fizéssimos algumas simplificações para o prolog deduzir mais rapidamente.

Mas, sim você está certo geramente deixa-se o Prolog realizar todas as inferências.

Em todo o caso, muito obrigado pela sua ajuda.

bem ... já que tens isso arrumado com o teu professor, aqui vai o meu código:

/* base de dados >> definição dos valores possíveis para as posições */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
position(1).
position(2).
position(3).
position(4).
position(5).

/* base de dados >> definição dos valores possíveis para as cores */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
color('amarelo').
color('azul').
color('branco').
color('verde').
color('vermelho').

/* base de dados >> definição dos valores possíveis para as contas a pagar */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
bill('agua').
bill('aluguer').
bill('luz').
bill('telefone').
bill('telemovel').

/* base de dados >> definição dos valores possíveis para os nomes */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
name('augusto').
name('douglas').
name('jose').
name('ronaldo').
name('samuel').

/* base de dados >> definição dos valores possíveis para os empregos */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
job('bombeiro').
job('fotografo').
job('massagista').
job('pesquisador').
job('veterinario').

/* base de dados >> definição dos valores possíveis para os animais de estimação */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
animal('cachorro').
animal('gato').
animal('passaro').
animal('peixe').
animal('tartaruga').

/* base de dados >> definição dos valores possíveis para os desportos favoritos */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
sport('basquete').
sport('futebol').
sport('snooker').
sport('natacao').
sport('volei').

/* definição de um tuplo "pessoa" */
/* (não é obrigatório para a solução, é usado somente para forçar a validade dos dados) */
person(Pos, Col, Bil, Nam, Job, Ani, Spo) :-
 position(Pos),
 color(Col),
 bill(Bil),
 name(Nam),
 job(Job),
 animal(Ani),
 sport(Spo).

/* predicado usado para determinar que um tuplo "pessoa" se encontra estritamente a esquerda de outra */
left(Per1, Per2, Sol) :-
 /* a primeira pessoa pertence a solução */
 member(Per1, Sol),
 /* a segunda pessoa pertence a solução */
 member(Per2, Sol),

 /* determinar o valor da posição da primeira pessoa */
 Per1 = person(Pos1, _, _, _, _, _, _),
 /* determinar o valor da posição da segunda pessoa */
 Per2 = person(Pos2, _, _, _, _, _, _),

 /* assumir que a posição da primeira pessoa e o valor da posição da segunda pessoa menos uma unidade */
 Pos1 is Pos2 - 1.

/* predicado usado para determinar que um tuplo "pessoa" se encontra estritamente a direita de outra */
right(Per1, Per2, Sol) :-
 /* a primeira pessoa pertence a solução */
 member(Per1, Sol),
 /* a segunda pessoa pertence a solução */
 member(Per2, Sol),

 /* determinar o valor da posição da primeira pessoa */
 Per1 = person(Pos1, _, _, _, _, _, _),
 /* determinar o valor da posição da segunda pessoa */
 Per2 = person(Pos2, _, _, _, _, _, _),

 /* assumir que a posição da primeira pessoa e o valor da posição da segunda pessoa mais uma unidade */
 Pos1 is Pos2 + 1.

/* predicado usado para determinar que um tuplo "pessoa" se encontra ao lado de outra */
side(Per1, Per2, Sol) :-
 /* a primeira pessoa encontrasse estritamente a esquerda da segunda pessoa */
 ( left(Per1, Per2, Sol);
   /* ou a primeira pessoa encontrasse extritamente a direita da segunda pessoa */
   right(Per1, Per2, Sol) ).

/* predicado usado para determinar que um tuplo se encontra a cabeça de uma lista (primeiro elemento) */
first(Per, [Per|_]).

/* predicado usado para determinar que um tuplo se encontra no fim de uma lista (ultimo elemento) */
last(Per, [Per]).
last(Per, [_|T]) :-
 last(Per, T).

/* predicado usado para determinar que um tuplo se encontra no início ou no fim de uma lista */
first_or_last(Per, Sol) :-
 /* o elemento é o primeiro da lista */
 ( first(Per, Sol);
   /* ou e o ultimo */
   last(Per, Sol) ).

/* predicado usado para escrever a informação de uma pessoa */
write_person(person(Pos, Col, Bil, Nam, Job, Ani, Spo)) :-
 writef('|%2l', [Pos]),
 writef('|%12l', [Col]),
 writef('|%12l', [bil]),
 writef('|%12l', [Nam]),
 writef('|%12l', [Job]),
 writef('|%12l', [Ani]),
 writef('|%12l|', [spo]),
 nl.

/* predicado usado para escrever a informação de todas as pessoas */
write_sol(Sol) :-
 Sol = [Per1, Per2, Per3, Per4, Per5],
 write('+--+------------+------------+------------+------------+------------+------------+'),nl,
 write_person(Per1),
 write_person(Per2),
 write_person(Per3),
 write_person(Per4),
 write_person(Per5),
 write('+--+------------+------------+------------+------------+------------+------------+'),nl.

/* predicado usado para resolver o problema de Einstein */
fila :-
 /* a solução e composta por uma lista de cinco valores */
 Sol = [Per1, Per2, Per3, Per4, Per5],

 /* determinar que os cinco valores do resultado são do tipo "pessoa" com as suas posições dadas pela ordem natural dos números */
 Per1 = person(1, Col1, Bil1, Nam1, Job1, Ani1, Spo1),
 Per2 = person(2, Col2, Bil2, Nam2, Job2, Ani2, Spo2),
 Per3 = person(3, Col3, Bil3, Nam3, Job3, Ani3, Spo3),
 Per4 = person(4, Col4, Bil4, Nam4, Job4, Ani4, Spo4),
 Per5 = person(5, Col5, Bil5, Nam5, Job5, Ani5, Spo5),

 /* DICA >> Na quarta posição está o homem que gosta de Sinuca. */
 member(person(4, _, _, _, _, _, 'snooker'), Sol),
 /* DICA >> Quem gosta de Futebol está na quinta posição. */
 member(person(5, _, _, _, _, _, 'futebol'), Sol),
 /* DICA >> O homem que gosta de Basquete está na segunda posição. */
 member(person(2, _, _, _, _, _, 'basquete'), Sol),
 /* DICA >> Quem gosta de Vôlei está de Vermelho. */
 member(person(_, 'vermelho', _, _, _, _, 'volei'), Sol),
 /* DICA >> O dono do Peixe está exactamente à esquerda de quem pratica Natação. */
 left(person(_, _, _, _, _, 'peixe', _), person(_, _, _, _, _, _, 'natacao'), Sol),
 /* DICA >> O homem de Branco é o dono do réptil. */
 member(person(_, 'branco', _, _, _, 'tartaruga', _), Sol),
 /* DICA >> O Bombeiro está exactamente à direita do Samuel. */
 right(person(_, _, _, _, 'bombeiro', _, _), person(_, _, _, 'samuel', _, _, _), Sol),
 /* DICA >> O Veterinário está na quinta posição. */
 member(person(5, _, _, _, 'veterinario', _, _), Sol),
 /* DICA >> O Pesquisador está na terceira posição. */
 member(person(3, _, _, _, 'pesquisador', _, _), Sol),
 /* DICA >> Douglas trabalha como Fotógrafo. */
 member(person(_, _, _, 'douglas', 'fotografo', _, _), Sol),
 /* DICA >> José está na quinta posição. */
 member(person(5, _, _, 'jose', _, _, _), Sol),
 /* DICA >> O Pesquisador está exactamente à esquerda do Augusto. */
 left(person(_, _, _, _, 'pesquisador', _, _), person(_, _, _, 'augusto', _, _, _), Sol),
 /* DICA >> Douglas tem um Cachorro. */
 member(person(_, _, _, 'douglas', _, 'cachorro', _), Sol),
 /* DICA >> Na quinta posição está o homem da conta de Telefone. */
 member(person(5, _, 'telefone', _, _, _, _), Sol),
 /* DICA >> O homem de Branco vai pagar a conta de Água. */
 member(person(_, 'branco', 'agua', _, _, _, _), Sol),
 /* DICA >> Na terceira posição está quem vai pagar a conta de Luz. */
 member(person(3, _, 'luz', _, _, _, _), Sol),
 /* DICA >> Ronaldo vai pagar a conta de Celular. */
 member(person(_, _, 'telemovel', 'ronaldo', _, _, _), Sol),
 /* DICA >> O homem de Verde tem um Pássaro. */
 member(person(_, 'verde', _, _, _, 'passaro', _), Sol),
 /* DICA >> O homem de Azul está em uma das pontas. */
 first_or_last(person(_, 'azul', _, _, _, _, _), Sol),
 /* DICA >> O homem que tem um Gato está exactamente à direita de que gosta de Sinuca. */
 right(person(_, _, _, _, _, 'gato', _), person(_, _, _, _, _, _, 'snooker'), Sol),
 /* DICA >> O homem que tem um Pássaro está ao lado do que joga Sinuca. */
 side(person(_, _, _, _, _, 'passaro', _), person(_, _, _, _, _, _, 'snooker'), Sol),

 /* determinar os valores a serem possíveis para os seis diferentes parâmetros dos tuplos "pessoas" resultado */
 /* fazer isto somente após a execução das restrições anteriores para minimizar a árvore de resultados a ser criada-verificada */
 /* caso contrario, o tempo de execução ira aumentar imensamente */
 permutation(['amarelo', 'azul', 'branco', 'verde', 'vermelho'], [Col1, Col2, Col3, Col4, Col5]),
 permutation(['agua', 'aluguer', 'luz', 'telefone', 'telemovel'], [bil1, Bil2, Bil3, Bil4, Bil5]),
 permutation(['augusto', 'douglas', 'jose', 'ronaldo', 'samuel'], [Nam1, Nam2, Nam3, Nam4, Nam5]),
 permutation(['bombeiro', 'fotografo', 'massagista', 'pesquisador', 'veterinario'], [Job1, Job2, Job3, Job4, Job5]),
 permutation(['cachorro', 'gato', 'passaro', 'peixe', 'tartaruga'], [Ani1, Ani2, Ani3, Ani4, Ani5]),
 permutation(['basquete', 'futebol', 'snooker', 'natacao', 'volei'], [spo1, Spo2, Spo3, Spo4, Spo5]),

 /* apresentar o resultado do problema */
 write_sol(Sol).

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Prolog25

Boa noite!

Estou com um problema muito parecido com esse, mas o swi prolog apenas fica carregando e não resolve, poderiam me ajudar a descobrir onde está o problema?

imprime :- solucao(A,B,C,D,E),write(A),nl,write(B),nl,write(C),nl,write(D),nl,write(E),nl,!.
solucao((1 ,MO1, NO1, SU1, LA1, AN1, MA1),
     (2  ,MO2, jessica, SU2, chocolate, AN2, MA2),
     (3  ,MO3, NO3, SU3, LA3, AN3 , MA3),
     (4  ,MO4, NO4, SU4, maca, AN4 , biologia),
     (5  ,MO5, NO5, SU5, LA5 , AN5, MA5 )):-
mochila(MO1), mochila(MO2), mochila(MO3), mochila(MO4), mochila(MO5),
alldifferent([MO1, MO2, MO3, MO4, MO5]),
nome(NO1), nome(NO3), nome(NO4), nome(NO5),
alldifferent([NO1, NO3, NO4, NO5]),suco(SU1),suco(SU2), suco(SU3), suco(SU4), suco(SU5),
alldifferent([sU1 ,SU2, SU3, SU4, SU5]),
lanche(LA1), lanche(LA3), lanche(LA5),
alldifferent([LA1, LA3, LA5]),animal(AN1), animal(AN2), animal(AN3), animal(AN4), animal(AN5),
alldifferent([AN1, AN2, AN3, AN4, AN5]),
materia(MA1), materia(MA2), materia(MA3), materia(MA5),
alldifferent([MA1, MA2, MA3, MA5]),%A menina que gosta de suco de Morango está em uma das pontas da fila.
((SU1==morango);
(SU5==morango)),
%A menina que gosta de suco de Morango está exatamente à direita de quem gosta de suco de Maracujá.
(SU4==maracuja, SU5==morango),%A garota que prefere suco de Abacaxi está em uma das pontas da fila.
((SU1==abacaxi);
(SU5==abacaxi)),
%O suco preferido da Pati é o de Limão.
(NO3==pati, SU3==limao),
%A garota da mochila Amarela gosta de tomar limonada.
(SU3==limao, MO3==amarela),
%A menina que gosta de História gosta de suco de Laranja.
(SU2==laranja, MA2==historia),%A menina de mochila Amarela está em algum lugar à esquerda da garota que gosta de Português.
(MO3==amarelo, MA5==portugues),
%A Pati está exatamente à esquerda da garota que quer ver a Girafa.
(NO3==pati, AN4==girafa),%A garota que vai comer Sanduíche gosta de Português.
(MA5==portugues, LA5==sanduiche),
%A menina que gosta de História está em algum lugar entre a Joana e a menina que gosta de Geografia, nesta ordem.
((MA2==historia, NO1==joana, MA3=geografia);
(MA2==historia, NO1==joana, MA5==geografia)),%A garota que gosta de Geografia vai comer Salgadinho.
(MA3==geografia, LA3==salgadinho),
%A Renata está entre a menina que vai comer Banana e a Ana, nesta ordem.
((LA1==banana, NO5==ana, NO4==renata);
(LA1==banana, NO5==ana, NO5==renata)),%A menina que gosta de suco de Limão está entre a garota que quer ver o Elefante e a que gosta de suco de Maracujá, nesta ordem.
(SU3==limao, SU4==maracuja, AN1==elefante),
%A garota que que ver a Arara está ao lado da que quer ver o Leão.
((AN1==arara, AN2==leao);
(AN1==leao, AN2==arara);
(AN2==arara, AN3==leao);
(AN2==leao, AN3==arara)),
%A garota que quer ver o Macaco usa uma mochila Branca.
(AN5==macaco, MO5==branca),%A menina da mochila Vermelha está em algum lugar à esquerda da que quer ver o Leão.
((AN3==leao, MO2==vermelha);
(AN2==leao, MO1==vermelha)),
%A menina da mochila Vermelha está exatamente à direita da de mochila Verde.
(MO2==vermelha, MO1==verde),
%A garota que gosta de Geografia está ao lado da de mochila Azul.
((MO2==azul);
(MO4==azul)).mochila(amarela).
mochila(azul).
mochila(branca).
mochila(vermelha).
mochila(verde).
nome(ana).
nome(joana).
nome(pati).
nome(renata).
suco(laranja).
suco(limao).
suco(maracuja).
suco(morango).
suco(abacaxi).
lanche(banana).
lanche(salgadinho).
lanche(sanduiche).
animal(arara).
animal(elefante).
animal(girafa).
animal(macaco).
animal(leao).
materia(geografia).
materia(historia).
materia(portugues).
materia(matematica).
alldifferent([]).
alldifferent([H|T]):- not(member(H,T)), alldifferent(T).

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.