Rui Carlos Posted June 17, 2006 at 06:52 PM Report #33486 Posted June 17, 2006 at 06:52 PM Deixo aqui algumas notas que podem ajudar a aprender esta linguagem: Texto/tutorial sobre ProLog (da autoria do Professor F. Mário Martins) https://web.archive.org/web/20070707221440/http://sim.di.uminho.pt/disciplinas/ppiii/0405/PTT_PPIII_v2.doc Como interpretador podemos usar o SWI-Prolog ou SICStus Prolog, disponíveis para Windows, Linux e Mac OS X. Editores como o Vim (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 normalmente associados ao Perl). No Vim podemos fazê-lo através do comando :set syntax=prolog. Rui Carlos Gonçalves
kz Posted June 23, 2006 at 04:41 PM Report #34458 Posted June 23, 2006 at 04:41 PM 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.
M6 Posted June 23, 2006 at 04:49 PM Report #34459 Posted June 23, 2006 at 04:49 PM No meu tempo - já pareço um dinossauro da informática a falar 😉 - o SICStus Prolog era o melhor. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
magician Posted September 29, 2006 at 06:30 PM Report #53795 Posted September 29, 2006 at 06:30 PM os links nao tao a bombar ! 😄 I haven’t lost my mind; it’s backed up on DVD somewhere!
Rui Carlos Posted September 29, 2006 at 06:36 PM Author Report #53797 Posted September 29, 2006 at 06:36 PM os links nao tao a bombar ! 😞 quais? Rui Carlos Gonçalves
Ridelight Posted September 29, 2006 at 06:39 PM Report #53799 Posted September 29, 2006 at 06:39 PM A mim em IE os do sapo abre logo o .pdf directamente sem mais nada ! Regras do FÓRUM
magician Posted September 29, 2006 at 08:09 PM Report #53849 Posted September 29, 2006 at 08:09 PM Não mas a bocado quando tentei tava mesmo dão agora ja tao bons 😄 I haven’t lost my mind; it’s backed up on DVD somewhere!
Carloz Posted April 16, 2010 at 11:38 PM Report #322004 Posted April 16, 2010 at 11:38 PM 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! 😛 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. "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
20_LESI Posted April 17, 2010 at 08:35 PM Report #322071 Posted April 17, 2010 at 08:35 PM 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?
Rui Carlos Posted April 17, 2010 at 09:54 PM Author Report #322080 Posted April 17, 2010 at 09:54 PM 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])). Rui Carlos Gonçalves
Baderous Posted April 17, 2010 at 10:41 PM Report #322084 Posted April 17, 2010 at 10:41 PM Em 17/04/2010 às 23:54, Rui Carlos disse: 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.
20_LESI Posted April 17, 2010 at 10:51 PM Report #322086 Posted April 17, 2010 at 10:51 PM Antes de mais, obrigado pela ajuda! Em 17/04/2010 às 23:54, Rui Carlos disse: 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ê?
Rui Carlos Posted April 17, 2010 at 10:58 PM Author Report #322087 Posted April 17, 2010 at 10:58 PM 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. Rui Carlos Gonçalves
20_LESI Posted April 17, 2010 at 11:05 PM Report #322089 Posted April 17, 2010 at 11:05 PM 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!
20_LESI Posted April 18, 2010 at 04:36 PM Report #322133 Posted April 18, 2010 at 04:36 PM 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?
Baderous Posted April 18, 2010 at 05:01 PM Report #322137 Posted April 18, 2010 at 05:01 PM 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]).
20_LESI Posted April 18, 2010 at 09:06 PM Report #322165 Posted April 18, 2010 at 09:06 PM 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!
Rui Carlos Posted April 19, 2010 at 02:50 AM Author Report #322181 Posted April 19, 2010 at 02:50 AM 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). Rui Carlos Gonçalves
20_LESI Posted April 19, 2010 at 11:34 AM Report #322205 Posted April 19, 2010 at 11:34 AM 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 (......)
Rui Carlos Posted April 19, 2010 at 01:57 PM Author Report #322224 Posted April 19, 2010 at 01:57 PM 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) Rui Carlos Gonçalves
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now