Ir para o conteúdo
Nicpeterl

PROLOG - Quem vai pagar qual conta?

Mensagens Recomendadas

Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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.


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


Link para a mensagem
Partilhar noutros sites
Nicpeterl    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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).


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Prolog25    0
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


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

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

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

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.