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

dougmettal

AJUDA EM PROLOG

7 mensagens neste tópico

Olá,

Preciso fazer um trabalho em Prolog que faça algumas perguntas e baseado nelas da uma resposta e precisa usar listas. Gostaria de fazer um especie de classificador das divisoes do heavy metal.

O programa farias as perguntas:

1-Qual o tipo de voz?

2-Qual a velocidade do ritimo?

3-O que descreve as letras?

As resposta dessas perguntas poderiam ser:

1-lirico,gutural,rasgado,limpo,agudo

2-lenta, media, rapida

3-morte,dor,satanismo,varios,deus,medieval,sociedade

E a classificacao seria a seguinte:

'melodico' se as respostas forem respectivamente: agudo,medio,varios

'trash' se limpo,rapido,sociedade

'black_s' se rasgado,rapido,satanismo

black_c se rasgado,rapido,deus

death se gutural,rapido,morte

viking se limpo,medio,viking

power se agudo,medio,medieval

sinfonico se lirico,medio,varios

doom se limpo,lento,dor

Eu procurei alguns exemplos na internet... O mais proximo que encontrei está aqui em baixo mas nao entendi:

":- dynamic(resp/2)" , "assert(resp(A,Resp))," , e como ele chega na resposta...

:- dynamic(resp/2).
caracteristica(animal,mamifero,[tem_pelo]).
caracteristica(animal,mamifero,[da_leite]).
caracteristica(animal,ave,[tem_penas]).
caracteristica(animal,ave,[voa,bota_ovos]).
caracteristica(mamifero,carnivoro,[come_carne]).
caracteristica(mamifero,carnivoro,[tem_dentes_pontudos,tem_garras,tem_olhos_frontais]).
caracteristica(mamifero,ungulado,[tem_casco]).
caracteristica(mamifero,ungulado,[rumina,tem_dedos_pares]).
caracteristica(carnivoro,leopardo,[tem_cor_amarelo_tostado,tem_manchas_escuras]).
caracteristica(carnivoro,tigre,[tem_cor_amarelo_tostado,tem_listras_pretas]).
caracteristica(ungulado,girafa,[tem_pernas_longas,tem_pescoco_comprido,
tem_cor_amarelo_tostado,tem_manchas_escuras]).
caracteristica(ungulado,zebra,[tem_cor_branca,tem_listras_pretas]).
caracteristica(ave,avestruz,[tem_pernas_longas,tem_pescoco_comprido,tem_cor_pre ta_branca]).
caracteristica(ave,pinguim,[nao_voa,nada,tem_cor_preta_branca]).
caracteristica(ave,albatroz,[e_um_bom_voador]).

/* Programa que manipula o conhecimento acima definido. */
go:- nl, 
write('Responda (sim ou nao)... '),
nl, nl,
encontra(X),
nl,
limpa_base,
!.
encontra(Classe):-
caracteristica(Classe,Subclasse,Lista),
verifica_lista(Lista),
encontra(Subclasse).
encontra(leopardo):- write('O animal eh um leopardo').
encontra(tigre):- write('O animal eh um tigre').
encontra(girafa):- write('O animal eh uma girafa ').
encontra(zebra):- write('O animal eh uma zebra ').
encontra(avestruz):- write('O animal eh um avestruz').
encontra(pinguim):- write('O animal eh um pinguim').
encontra(albatroz):- write('O animal eh um albatroz').
encontra(_):-
nl,
write('Nao conheco esse animal'),
nl.
verifica_lista([]).
verifica_lista([X|Cauda]):-
pergunte(X),
verifica_lista(Cauda).
pergunte(A):-
resp(A,sim).
pergunte(A):-
resp(A,nao),fail.
pergunte(A):-
not(resp(A,_)),
write('O animal '),
write(A),
write('?'),
read(Resp),
nl,
assert(resp(A,Resp)),
Resp = sim.
limpa_base:- retract(resp(_,_)), fail.
limpa_base.

Desde já agradeço

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só mais uma coisa: de preferencia queria jogar as resposta eu uma lista e depois comparar com a lista q define um estilo tipo:

carac(melodico,[agudo,medio,varios]).

nesse caso eu teria q retornar 'melodico'

mas nao sei fazer isso

:wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes colocar aqui um exemplo da informação que queres guardar? Por exemplo, usando uma tabela, ou algo semelhante...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tipo no caso acima apenas apareceria 'melodico' como resposta... (eu uso o SWI-Prolog)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim à primeira vista, vais ter que criar uma base de conhecimento com os valores

carac(melodico,[agudo,medio,varios]).

...

Isto para cada uma das classificações.

Depois, para obter a resposta, fazes carac(X,[agudo,medio,varios]), e ele irá dizer-te que o X que tem aquelas características é 'melodico'.

PS: As listas parece-me que vão ser aí metidas à pressão... Não me parece que faça sentido usá-las.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O predicado :-dynamic(resp/2) permite que possas escrever/remover o predicado resp, que tem 2 parâmetros, na base de conhecimento, recorrendo para isso aos predicados assert (escrever) e retract (remover).

A primeira coisa que esse programa faz é invocar o predicado encontra cujas 2 primeiras cláusulas são:

encontra(Classe):-caracteristica(Classe,Subclasse,Lista),verifica_lista(Lista),
encontra(Subclasse).

Aí, no predicado caracteristica, Classe vai ser a primeira a ser instanciada com um determinado valor que é dado pelos valores presentes nas cláusulas do predicado caracteristica. Se reparares esse predicado está escrito dos valores mais gerais para os particulares da variável Classe, isto é, nas 4 primeiras cláusulas aparece animal, depois nas cláusulas 5,6,7 e 8 aparece mamífero que é um valor que é igual ao 2º parâmetro das 2 primeiras cláusulas e, portanto, consiste numa especificação da subclasse. Assim, havendo várias hipóteses para as instanciações de Classe e Subclasse, resta entrar pela última variável: Lista. Para isso usou-se o predicado verifica_lista, o qual invoca o predicado pergunte sobre todos os elementos da lista (esta poderá ser instanciada com um qualquer valor presente no predicado caracteristica de um modo análogo ao indicado).

Já neste predicado, tens 3 cláusulas. As 2 primeiras só são usadas se já tiveres escrito pelo menos 1 vez o predicado resp na base de conhecimento, ou seja, conclui-se que a cláusula de entrada é a última (devido ao not(resp...)). Esta trata de apresentar o texto ao utilizador e ler o input, escrevendo o resultado da resposta sobre a forma de predicado (resp) onde guarda o valor da lista (o "tem pelo", "bom voador", etc) e a resposta (sim/nao). Em caso afirmativo, verifica-se então o predicado verifica_lista para o elemento da lista em questão. Assim, consegues uma primeira instanciação da variável Classe que passa a corresponder ao valor presente na cláusula do predicado caracteristica onde está a lista em questão. Em caso negativo, ele passa para a próxima lista existente, executando os mesmo passos. Portanto, tendo já feito isto uma primeira vez, já tens a informação mais refinada de modo a encontrar a resposta. Assim, a variável Classe do predicado caracteristica vai ser novamente alvo de uma possível instanciação.

Por exemplo: se primeiro aquilo testou se o animal "tem_pelo" e respondeste "sim", então a variável Classe fica com o valor "animal" e Subclasse com o valor "mamifero". Posteriormente, e como a variável Subclasse já está instanciada, ele vai testar as outras cláusulas do predicado caracteristica, fazendo matching com a 2ª. Assim, este predicado vai ser outra vez invocado através da sua 1ª cláusula, existindo uma espécie de recursividade. Nesta parte, a variável Classe vai ter o valor "mamifero", ocorrendo o mesmo raciocínio que referi, mas desta vez só vão ser testadas as listas das cláusulas do predicado caracteristica que possuem como 1º valor "mamifero" (está mais refinada a informação).

Isto ocorre sucessivamente até que chegas a um ponto em que o predicado encontra é invocado com um dos valores que corresponde ao nome de um animal, que vai fazer matching com a cláusula cujo valor é igual ao nome do animal, mostrando a resposta. Por fim é invocado o predicado limpa_base que limpa da base de conhecimento todos os predicados resp/2, ou seja, apaga todas as tuas respostas anteriores, para que possas "jogar" outra vez.

PS: É capaz de haver aqui uma ou outra incorrecção, mas no geral é isto que acontece.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado Baderous.... Agora entendi... Foi de grande ajuda sua resposta...

Abraços de um irmão brasileiro

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

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


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora