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

Rui Carlos

sobre PROLOG...

22 mensagens neste tópico

Deixo aqui algumas notas que podem ajudar a aprender esta linguagem:

Texto/tutorial sobre ProLog (da autoria do Professor F. Mário Martins)

http://www.portugal-a-programar.pt/files/file/89-apontamentos-teoricos-de-prolog-u-minho/

Como interpretador podemos usar o SWI-Prolog ou SICStus Prolog, disponíveis para Windows, Linux e Mac OS X.

Editores como o Vim ou o Crimson (e certamente muitos outros) possuem syntax highlighting para o Prolog, se bem que normalmente é preciso indicar que estamos a usar o ProLog (pois os ficheiros .pl são associados ao Perl). No Vim podemos fazê-lo através do comando ':set syntax=prolog'.

Editado por Rui Carlos
Links actualizados.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não tens por aí recursos com código de exemplo para fazer uma interface gráfica (e input) noutra linguagem (C/Java/Delphi) e a lógica no prolog? Thankls.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No meu tempo - já pareço um dinossauro da informática a falar ;) - o SICStus Prolog era o melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A mim em IE os do sapo abre logo o .pdf directamente sem mais nada !

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Rui Carlos sei que já lá vão uns anitos mas nem imaginas o jeito que isto me vai dar.

Foi-me dado agora um projecto de Prolog e tenho 3 semanas para o fazer, sem qualquer introdução à linguagem em si ou como funciona minimamente (infelizmente é assim que as coisas funcionam aqui...é ao desenrasca-te).

O facto de teres disponibilizado esta aplicação em Prolog mais um PDF...é a minha salvação! :P Ainda por cima com relatório e o código todo comentadinho e tudo. Yes! xD

Vais-me poupar anos (bem anos não porque só tenho 3 semanas...mas prai 2 semanas) de desespero e bater com a cabeça nas paredes. É que ainda por cima é difícil encontrar-se bom material na net.

Muito obrigado :)

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se fiz bem, mas estou com umas dúvidas em prolog e resolvi utilizar esta thread para as tirar, em vez de criar uma nova!

Estou a estudar esta linguagem, e empanquei na resolução de um exercício, o divisório, que recebe uma lista de vários números e executa sucessivas divisões, p.e.:

[10,5,4] -> 10/5 = 2

2/4 = 0.5

O resultado seria 0.5

Eu fiz a seguinte função:

operatorio(/, [], 1).
operatorio(/,[H|T],R) :- Res is R/H, operatorio(/, T, Res).

Sei que isto está mal, pois na primeira iteração a variável R não irá conter nenhum valor, mas não arranjo melhor maneira de resolver isto... Alguém me pode ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja há alguns anos que não mexo em ProLog, mas deve ser algo como:

operatorio(/,[X],X).
operatorio(/,[H1,H2|T],R) :- H is H1/H2, operatorio(/,[H|T],R).

Retiras dois elementos, operas, e colocas o resultado de novo na lista (operatorio([10,5,4])=operatorio([2,4])).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja há alguns anos que não mexo em ProLog, mas deve ser algo como:

operatorio(/,[X],X).
operatorio(/,[H1|H2|T],R) :- H is H1/H2, operatorio(/,[Res|T],R).

Retiras dois elementos, operas, e colocas o resultado de novo na lista (operatorio([10,5,4])=operatorio([2,4])).

Acho que na 2ª cláusula querias dizer Res em vez de H.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais, obrigado pela ajuda!

operatorio(/,[X],X).
operatorio(/,[H1|H2|T],R) :- H is H1/H2, operatorio(/,[Res|T],R).

Essa função precisaria de um outro caso de paragem, para quando a lista tivesse apenas 2 elementos. Ou estou enganado? Ainda assim, não me está a funcionar isso! E o Sicstus diz que tens um erro de sintaxe, aqui:

[H1|H2|T]

Se puser assim não se queixa:

[H1,H2|T]

A função a que cheguei foi esta:

operatorio(/,[X],X).
operatorio(/,[X,Y],R) :- R is X/Y.
operatorio(/, [H1,H2|T], R) :- R is H1/H2, operatorio(/,[R|T], R).

Se testar com uma lista que tenha mais do que 3 elementos, a resposta do Sicstus é sempre NO... Alguém sabe porquê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê a alteração que eu fiz ao meu post anterior. Não podes usar o R em vez do H, pois o R já estava a ser usado. E não, não deves precisar de prever o caso em que a lista tem dois elementos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê a alteração que eu fiz ao meu post anterior. Não podes usar o R em vez do H, pois o R já estava a ser usado. E não, não deves precisar de prever o caso em que a lista tem dois elementos.

Já percebi o que estavas a fazer. A primeira vez que olhei para o teu código, pensei que o R não estava a ser utilizado, mas agora percebi que ao chegar ao caso de paragem, o valor calculado (que vai ser o único da lista) vai passar para o R. Muito obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas!

Estou a tentar fazer um predicado que apague a primeira ocorrência de um dado elemento de uma lista, mas não estou a conseguir implementa-lo!

apagar(_, [], []).
apagar(H, [H|T], T).
apagar(Y, [_|T], L) :- apagar(Y, T, [H|L]).

Penso que isto falhe por causa do L inicialmente ser uma variável. Consigo ver que tenho isto mal, mas não sei como corrigir... Alguém me pode ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que na última cláusula estás a usar um H vindo do nada. Experimenta assim:

apagar(Y, [H|T], L) :- Y\==H, apagar(Y, T, [H|L]).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Confirmo! Deveria ter H em vez do _. Mas ambas as resoluções (a minha com o erro corrigido e a tua) não unificam, ou seja, a resposta do sicstus é NO!  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No terceiro caso seria mais apagar(Y, [H|T], [H|L]) :- apagar(Y, T,L)., ou seja, calculas o resultado de aplicar a função à cauda, e depois adicionas-lhe a cabeça.

Eventualmente precisarás de garantir que o Y é diferente do H (como o Baderous fez).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No terceiro caso seria mais apagar(Y, [H|T], [H|L]) :- apagar(Y, T,L)., ou seja, calculas o resultado de aplicar a função à cauda, e depois adicionas-lhe a cabeça.

Eventualmente precisarás de garantir que o Y é diferente do H (como o Baderous fez).

Funcionou, mas estou a olhar para a função e não faço a mínima de como isto funciona... Eu estava a tentar reconstruir a lista no 3º parâmetro, o que não faz sentido nenhum (apercebi-me agora) devido ao 2º caso de paragem.

Não percebo como o 3º parâmetro da query:

apagar(20, [1,2,2,20,3,2,1], X).

Unifica com o 3º parâmetro do predicado apagar:

apagar(Y, [H|T], [H|L]) :- apagar(Y, T, L).

Admitindo que o Prolog infere que a variável X seja o que for preciso para satisfazer o predicado, não percebo o que sucede no 3º parâmetro aquando das chamadas recursivas. Por exemplo:

apagar(20, [1,20,3], X).

Esta query vai unificar com a 3ª cláusula do predicado, e a chamada recursiva será:

apagar(20, [20,3], (......)).

Não consigo mesmo perceber o que vai ali nas (......)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a colocar o resultado no terceiro parâmetro, portanto lê a função assim:

[H|L] = apagar(Y, [H|T]) se H=/=Y e L=apagar(Y,T)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deixo aqui algumas notas que podem ajudar a aprender esta linguagem:

Texto/tutorial sobre ProLog (da autoria do Professor F. Mário Martins)

Como interpretador podemos usar o SWI-Prolog ou SICStus Prolog, disponíveis para Windows, Linux e Mac OS X.

Editores como o Vim ou o Crimson (e certamente muitos outros) possuem syntax highlighting para o Prolog, se bem que normalmente é preciso indicar que estamos a usar o ProLog (pois os ficheiros .pl são associados ao Perl). No Vim podemos fazê-lo através do comando ':set syntax=prolog'.

Não consigo correr o programa, e quando tento utilizar algumas funções (supostamente) built-in no código de um programa que estou a fazer, o Sicstus diz que elas não existem! Alguém me sabe dizer se tenho de adicionar bibliotecas ou assim? É que no trabalho que está aqui disponibilizado não vejo nenhum import...

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