Jump to content
Nicpeterl

PROLOG - Quem vai pagar qual conta?

Recommended Posts

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.

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other 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

  • Vote 1

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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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)

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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).



%_____________________________________________________________________________________________________________

Edited by Baderous
geshi

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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).

_________________________________________

Edited by Baderous
geshi

Share this post


Link to post
Share on other 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.

  • Vote 1

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

Share this post


Link to post
Share on other 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).

___________________________________________________________________

Edited by Baderous
geshi

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ).

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.