Skip to content

Exemplos de Prolog

Prolog é uma linguagem de programação geralmente usada para inteligência artificial e linguística computacional.

Grafo em árvore
Faz um tempo que eu não uso Prolog então esse é meio um tutorial relâmpago para eu relembrar um pouco. São um apanhado de exemplos básicos e um guia de instalação e uso do swi-prolog no Ubuntu.

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 bytes

Yes
?-

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 right

yes

Exemplo 3 – Grafo

Suponha o seguinte grafo que será representado no código-fonte:

Um grafo de 5 vértices
Vamos representa-lo no código-fonte a seguir que também possui definições para caminhos e viagens.

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

Published inUncategorized

25 Comments

  1. Rafael Rafael

    Muito Obrigado mesmo rapaz!

    Abriu minha mente pro Prolog…

    Faz parte do Logia?!!
    Se sim, então nos veremos ainda!

    ABRAÇO

  2. junior junior

    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

  3. lucas lucas

    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…

  4. Chucky Chucky

    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 🙂

  5. Rafael Rafael

    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

  6. Welinghton Welinghton

    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 !!!

  7. 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 ?-

  8. Ana Cristina Ana Cristina

    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!!!

  9. Fernando Ibañez Fernando Ibañez

    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

  10. Marianny de Sousa Marianny de Sousa

    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.

  11. Ruben Ruben

    Como remover nós(becos sem saida) num grafo bidirecional em prolog?

  12. Paulo Patto Paulo Patto


    junior:

    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

    Jr. favor entrar em contato comigo no paulopatto@gmail.com

  13. cosper cosper

    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

  14. pedro pedro

    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

  15. pedro pedro


    cosper:

    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

  16. Luis Sousa Luis Sousa

    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.

    • Bruno Mata Bruno Mata

      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.

      • Bruno Mata Bruno Mata

        Se tiver algum exemplo que me ajude a implementar o problema seria otimo!
        Obrigado
        Bruno Mata

  17. Eduardo Lucas Eduardo Lucas

    Amigão tem algum exemplo ai que me dê suporte para montar uma batalha naval? Se tiver eu agradeço.

  18. Luciano J Grisoste Luciano J Grisoste

    Muito obrigado. Abriu minha mente com relação ao Prolog.

  19. MLC MLC

    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.

  20. MLC MLC

    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

  21. Rodrigo barreto Rodrigo barreto

    Preciso de ajuda em contruir um programa em prolog uzando matriz

Leave a Reply

Your email address will not be published. Required fields are marked *