Prolog é uma linguagem de programação geralmente usada para inteligência artificial e linguÃstica computacional.
Instalação e Uso
No Ubuntu há duas implementações de prolog disponÃveis, a gprolog e a swi-prolog. Eu vou ficar com o swi-prolog que é um interpretador de prolog. Para instala-lo:
sudo apt-get install swi-prolog
Isso vai instalar o binário swipl que é o interpretador de Prolog.
Exemplo 1 – Fatorial
Crie um arquivo chamado fatorial.pl com esse conteúdo:
factorial(0,1).
factorial(N,F) :-
N>0,
N1 is N-1,
factorial(N1,F1),
F is N * F1.
Estando na mesma pasta do arquivo, chame o interpretador swipl:
$ swipl
Welcome to SWI-Prolog (Multi-threaded, Version 5.6.14)
Copyright (c) 1990-2006 University of Amsterdam.
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.For help, use ?- help(Topic). or ?- apropos(Word).
?- [‘fatorial.pl’].
% fatorial.pl compiled 0.00 sec, 760 bytesYes
?-
O comando [‘arquivo.pl’]. (com ponto) vai carregar e interpretar um arquivo chamado arquivo.pl. Algumas “perguntas” que podemos fazer ao programa:
?- fatorial(0,1).
Yes
?- fatorial(10,What).
What = 3628800
Yes
As perguntas feitas foram:
- Fatorial de 0 é 1?
- Quanto é o fatorial de 10?
Exemplo 2 – Torres de Hanoi
O famoso problema das Torres de Hanoi. Num arquivo chamado hanoi.pl escreva:
move(1,X,Y,_) :-
write('Move top disk from '),
write(X),
write(' to '),
write(Y),
nl.
move(N,X,Y,Z) :-
N>1,
M is N-1,
move(M,X,Z,Y),
move(1,X,Y,_),
move(M,Z,Y,X).
Carregando o programa com [‘hanoi.pl’]. dentro do swipl podemos fazer o teste:
?- move(3,left,right,center).
Move top disk from left to right
Move top disk from left to center
Move top disk from right to center
Move top disk from left to right
Move top disk from center to left
Move top disk from center to right
Move top disk from left to rightyes
Exemplo 3 – Grafo
Suponha o seguinte grafo que será representado no código-fonte:
edge(1,2).
edge(1,4).
edge(1,3).
edge(2,3).
edge(2,5).
edge(3,4).
edge(3,5).
edge(4,5).
connected(X,Y) :- edge(X,Y) ; edge(Y,X).
path(A,B,Path) :-
travel(A,B,[A],Q),
reverse(Q,Path).
travel(A,B,P,[B|P]) :-
connected(A,B).
travel(A,B,Visited,Path) :-
connected(A,C),
C \== B,
\+member(C,Visited),
travel(C,B,[C|Visited],Path).
Vamos perguntar qual o caminho entre 1 e 5:
?- path(1,5,W).
W = [1, 2, 5]
Yes
De onde veio e para onde vai o caminho 1, 2, 5, 4.
?- path(DE, PARA, [1,2,5,4]).
DE = 1
PARA = 4
Yes
Referencias
Muito Obrigado mesmo rapaz!
Abriu minha mente pro Prolog…
Faz parte do Logia?!!
Se sim, então nos veremos ainda!
ABRAÇO
Amigo ajuda tenho que entregar esse trabalho segunda po favor.Ja to fudido nessa disciplina
Um general do exército americano desenvolveu uma estratégia de ataque a guerrilhas terroristas
armadas localizadas em campos sitiados por recursos naturais, como ilhas, área planas limitadas por montanhas,
rios etc. A sua estratégia baseia-se em colocar grupos armados em pontos estratégicos o mais próximo possÃvel
do inimigo, formando uma área retangular – área de “sufocoâ€. A figura abaixo, mostra três grupos de guerrilhas
e os grupos armados localizados de forma estratégica, definindo os pontos de sufoco.
Tarefa
Você deve desenvolver um programa que permita calcular os pontos onde serão posicionados os
grupos armados, de forma a cria a menor área disponÃvel aos grupos terroristas. Além disso, o programa deve
calcular o tamanho dessa área em km2.
Entrada
A entrada é composta de uma base de fatos Prolog, contendo vários conjuntos de teste. Os conjuntos
de testes são formatos por: a) fato para descrever a área geográfica, sendo que a área geográfica é minimamente
formada por dois inteiros M e N que correspondem às dimensões em km da área geográfica; b) fato
descrevendo a localização das guerrilhas, sendo cada guerrilha descrita minimamente por dois inteiros X e Y
representando X e Y coordenadas de localização . Restrições: 0<M<100; 0<N<100; 0<x<M; e 0<y<N.
Exemplo de Entrada
Conjunto 1 Conjunto 2
Fato a 30 30 50 50
Fatos b 20 21
23 23
19 21
49 49
48 49
DAe kra to começando estudar prolog e esta complicado entender,pode me ajudar,não consegui um bom compilador,sera que pode me mandar o link de algum e o codigo fonte de alguns….valeuuu……obrigado…
Lucas eu estou a começar também com prolog e uso swi-prolog mesmo e para windows uso e-texteditor mas pode usar um editor de texto qualquer, seja eles em windows, macOS ou linux 🙂
Olá amigo,
preciso entregar um trabalho hoje de programação prolog, gostaria de sua ajuda pra respoder a seguinte questão:
FAZER UM PROGRAMA QUE RECEBA OS ELEMENTOS DE UMA FILA E DEPOIS IMPRIMA EM ORDEM CRESCENTE
Desde já agradeço
ae fera, nunca và pro log e tenho q entregar um trabalho dia 14 tipow, eh bem simples um programa de lógica matematica feito em pro log, se puder faz ae detalhado e manda po meu email abração !!!
copei e colei o programa, salvei direitinhoo… mas porque diabos aparece esse maldito false por ultimo? ta enchendo o saco
[2] 22 ?- factorial(0,1).
true ;
false.
[2] 23 ?-
Olá,
Eu preciso fazer um trabalho que implemente o problema do caixeiro viajante em prolog.
Se vc tiver algum material pode mandar pro meu e-mail? Abraço!!!
Olá preciso construir um predicado aglutinar³ com três operações.
1ª)O 1º argumento é o nome de uma pessoa
2º)O segundo é uma lista de pares ordenados, onde o 1º elemento do par é o nome de uma pessoa e o 2º é o nome de uma disciplina.
3º)O terceiro é a lista de disciplinas que aparecem junto ao nome do 1º argumento nos pares do segundo argumento.
Se tivesse como ajudar, preciso de uma base ñ sei como faço para iniciar isto. Não estou conseguindo achar um meio de iniciar. Obrigado. Att
Olá, tenho um trabalho para implementar e gostaria de saber como posso(fazer interface com a linguagem java) usando jpl e swi-prolog.
Quero usar alguns recursos da linguagem java e do swi-prolog(versao 5.8.2) juntos.
tipo fazer a consultar carregando de um arquivo ‘ .pl ‘.
Eu uso o netbeans e gostaria de saber se posso fazer essa junção, ou se posso fazer de outra forma.
Como remover nós(becos sem saida) num grafo bidirecional em prolog?
Jr. favor entrar em contato comigo no paulopatto@gmail.com
oi amigo ajuda me com o trabalho que tenho que entregar mas nao entendo quase nada em prolog aqui vai
1. Analise o seguinte trecho, extraÃdo do livro “Harry Potter e a Pedra Filosofalâ€, de
J.K.Rowling, editora Rocco, 2000.
“Harry abriu a porta seguinte, os dois mal se atreviam a olhar o que vinha a seguir, mas não havia nada
muito assustador ali, apenas uma mesa e sobre ela sete garrafas de formatos diferentes.
— É o de Snape — disse Harry. — O que temos de fazer?
Ao cruzarem a soleira da porta, imediatamente irromperam chamas atrás deles. E não eram chamas
comuns tampouco, eram roxas. Ao mesmo tempo, surgiam chamas pretas na porta adiante. Estavam
encurralados.
— Olhe! — Hermione apanhou um rolo de papel que havia ao lado das garrafas. Harry espiou por cima
do seu ombro para ler o papel:
O perigo o aguarda à frente, a segurança ficou atrás,
Duas de nós o ajudaremos no que quer encontrar,
Uma das sete te deixará prosseguir,
A outra levará de volta quem a beber,
Duas de nós conterão vinho de urtigas;
Três de nós aguardam em fila para o matar,
Escolha, ou ficará aqui para sempre,
E para ajudá-lo, lhe damos quatro pistas:
Primeira, por mais dissimulado que seja o veneno,
Você sempre encontrará um à esquerda de um vinho
de urtigas;
Segunda, são diferentes as garrafas de cada
extremidade,
Mas se você quiser avançar nenhuma é sua amiga;
Terceira, é visÃvel que temos tamanhos diferentes,
Nem anã nem giganta leva a morte no bojo;
Quarta, a segunda à esquerda e a segunda à direita
São gêmeas ao paladar, embora diferentes à vista.
Hermione deixou escapar um grande suspiro e Harry, perplexo, viu que ela sorria, a última coisa que ele
tinha vontade de fazer.
— Genial — disse — Isto não é mágica, é lógica…â€
Ajude Harry e Hermione a impedir o Lorde das Trevas de voltar ao poder. Escreva um
programa em Prolog que resolva a charada de lógica acima e decida qual garrafa Harry deve
beber para seguir adiante.
Dica 1: Represente as 7 garrafas em uma lista. O seguintes predicados podem ajudar:
% Encontra uma permutação em uma lista
permutacao([],[]).
permutacao(L,[X|P]) :- apaga(X,L,L1), permutacao(L1,P).
apaga(X,[X|L],L).
apaga(X,[Y|L],[Y|L1]) :- apaga(X,L,L1).
% Encontra o Ãndice de um dado elemento em uma lista
indice(X, [X|_], 0) :- !.
indice(X, [_|L], N) :- indice(X, L, N1), N is N1 + 1.
% Encontra o elemento em uma dada posição da lista
elemento(X, [X|_], 0) :- !.
elemento(X, [_|L], N) :- N1 is N – 1, elemento(X, L, N1).
% Retorna uma sublista a partir de uma posição fornecida
% Este predicado pode ser útil para implementar a recursividade na primeira
% pista, já que nela você vai precisar testar as posições de toda ocorrência
% de uma garrafa de vinho de urtigas.
sublista(L, 0, L) :- !.
sublista([_|L1], N, L2) :- N1 is N – 1, sublista(L1, N1, L2).
Dica 2: A autora não descreve no texto a disposição exata das garrafas na mesa, porém essa
informação é essencial para a resolução do problema. Assuma que as garrafas estão dispostas
conforme a sequência abaixo:
grande, gigante, média, anã, pequena, quadrada, arredondada
oi amigo me ajuda com um trabalho que tenho que entregar mas nao entendo nada de prolog
1. Analise o seguinte trecho, extraÃdo do livro “Harry Potter e a Pedra Filosofalâ€, de
J.K.Rowling, editora Rocco, 2000.
“Harry abriu a porta seguinte, os dois mal se atreviam a olhar o que vinha a seguir, mas não havia nada
muito assustador ali, apenas uma mesa e sobre ela sete garrafas de formatos diferentes.
— É o de Snape — disse Harry. — O que temos de fazer?
Ao cruzarem a soleira da porta, imediatamente irromperam chamas atrás deles. E não eram chamas
comuns tampouco, eram roxas. Ao mesmo tempo, surgiam chamas pretas na porta adiante. Estavam
encurralados.
— Olhe! — Hermione apanhou um rolo de papel que havia ao lado das garrafas. Harry espiou por cima
do seu ombro para ler o papel:
O perigo o aguarda à frente, a segurança ficou atrás,
Duas de nós o ajudaremos no que quer encontrar,
Uma das sete te deixará prosseguir,
A outra levará de volta quem a beber,
Duas de nós conterão vinho de urtigas;
Três de nós aguardam em fila para o matar,
Escolha, ou ficará aqui para sempre,
E para ajudá-lo, lhe damos quatro pistas:
Primeira, por mais dissimulado que seja o veneno,
Você sempre encontrará um à esquerda de um vinho
de urtigas;
Segunda, são diferentes as garrafas de cada
extremidade,
Mas se você quiser avançar nenhuma é sua amiga;
Terceira, é visÃvel que temos tamanhos diferentes,
Nem anã nem giganta leva a morte no bojo;
Quarta, a segunda à esquerda e a segunda à direita
São gêmeas ao paladar, embora diferentes à vista.
Hermione deixou escapar um grande suspiro e Harry, perplexo, viu que ela sorria, a última coisa que ele
tinha vontade de fazer.
— Genial — disse — Isto não é mágica, é lógica…â€
Ajude Harry e Hermione a impedir o Lorde das Trevas de voltar ao poder. Escreva um
programa em Prolog que resolva a charada de lógica acima e decida qual garrafa Harry deve
beber para seguir adiante.
Dica 1: Represente as 7 garrafas em uma lista. O seguintes predicados podem ajudar:
% Encontra uma permutação em uma lista
permutacao([],[]).
permutacao(L,[X|P]) :- apaga(X,L,L1), permutacao(L1,P).
apaga(X,[X|L],L).
apaga(X,[Y|L],[Y|L1]) :- apaga(X,L,L1).
% Encontra o Ãndice de um dado elemento em uma lista
indice(X, [X|_], 0) :- !.
indice(X, [_|L], N) :- indice(X, L, N1), N is N1 + 1.
% Encontra o elemento em uma dada posição da lista
elemento(X, [X|_], 0) :- !.
elemento(X, [_|L], N) :- N1 is N – 1, elemento(X, L, N1).
% Retorna uma sublista a partir de uma posição fornecida
% Este predicado pode ser útil para implementar a recursividade na primeira
% pista, já que nela você vai precisar testar as posições de toda ocorrência
% de uma garrafa de vinho de urtigas.
sublista(L, 0, L) :- !.
sublista([_|L1], N, L2) :- N1 is N – 1, sublista(L1, N1, L2).
Dica 2: A autora não descreve no texto a disposição exata das garrafas na mesa, porém essa
informação é essencial para a resolução do problema. Assuma que as garrafas estão dispostas
conforme a sequência abaixo:
grande, gigante, média, anã, pequena, quadrada, arredondada
Boas,
Tenho de fazer um trabalho em Prolog que é um optimizador de percursos.
Trata-se de:
ponto(p1,45,32).
ponto(p2,71,76).
ponto(p3,98,22).
… (entre outros) …
e necessito de executar um comando tipo:
:- best_rout( ??? ). e que devolva o melhor percurso, ou seja, o mais rápido.
Abraço camarada.
Boas LuÃs,
Tenho um problema parecido com esse.
A grande diferença é que seja desenvolvida uma variante de um algoritmo de procura do melhor caminho entre dois locais, que leve em consideração a possibilidade de estabelecer pontos de visita intermédios.
Se tiver algum exemplo que me ajude a implementar o problema seria otimo!
Obrigado
Bruno Mata
Bons exemplos…
Amigão tem algum exemplo ai que me dê suporte para montar uma batalha naval? Se tiver eu agradeço.
Muito obrigado. Abriu minha mente com relação ao Prolog.
sublistasEmedia – pede uma lista de inteiros ao utilizador, e retorna duas sublistas: a primeira
constituÃda por todos os elementos da lista inicial que sejam positivos e a segunda, constituÃda
por todos os elementos da lista inicial que sejam inferiores ou iguais a zero. Além disso,
deverá escrever no ecrã, a média dos elementos da lista inicial.
SomaLinha – Pede ao utilizador um tabuleiro de 6×6 (matriz) e o número correspondente a
uma determinada linha e efetua a soma de todos os números que estiverem nessa linha,
apresentado o resultado no ecrã. Cada posição do tabuleiro inserido pelo utilizador, deverá
estar preenchida por um número compreendido entre 0 e 9, como se pode constatar na tabela
que se segue. EM PROLOG
😎 Faltou a tabela em Prolog MLC
Preciso de ajuda em contruir um programa em prolog uzando matriz