Antes de fazer os exercícios abaixo, consulte os slides sobre programação lógica.
Nos exercícios abaixo, considere a seguinte base de fatos e regras sobre pessoas e localizações geográficas (pratica1.pl):
localizado_em(santa_maria, rs).
localizado_em(salvador, bahia).
localizado_em(rs, brasil).
localizado_em(bahia, brasil).
localizado_em(paris, franca).
localizado_em(franca, europa).
nasceu_em(andre, santa_maria).
nasceu_em(joao, salvador).
nasceu_em(X, Y) :- localizado_em(Z, Y), nasceu_em(X, Z).
mora_em(andre, paris).
mora_em(joao, salvador).
mora_em(X, Y) :- localizado_em(Z, Y), mora_em(X, Z).
idade(andre, 25).
idade(joao, 32).
gaucho(X) :- nasceu_em(X, rs).
brasileiro(X) :- nasceu_em(X, brasil).
europeu(X) :- nasceu_em(X, europa).
Você pode salvar este programa e abri-lo com SWI-Prolog, caso esteja instalado localmente. Também pode copiá-lo para o SWIGH: https://swish.swi-prolog.org/
Depois de tentar um primeiro contato com um desses ambientes, veja este vídeo que explica o programa e sua execução no SWISH.
-
Depois de carregar o programa, execute cada uma das consultas abaixo no interpretador interativo. Observe as respostas e compare-as com os fatos e regras do programa.
?- europeu(andre). ?- gaucho(andre). ?- brasileiro(X).
Obs.: Quando a resposta não tiver um ponto no final, tecle "Enter" ou "." após a primeira resposta, para evitar que se procurem outras, OU tecle ";" após cada resposta para descobrir se existem outras.
-
Modifique o programa expressando as seguintes afirmações em um ou mais fatos Prolog:
"Joana nasceu em Salvador." "Joana tem 22 anos." "Michel nasceu em Paris e tem 40 anos."
-
Expresse as seguintes perguntas em consultas Prolog (digite-as no interpretador):
"José nasceu no Brasil?" "Quais são as pessoas nascidas na Europa?" "Quais são as pessoas com mais de 30 anos?" "Quem são os brasileiros com menos de 30 anos?"
-
Crie um predicado
maisVelho(A,B)
que permita deduzir se a pessoa A é mais velha que a pessoa B. Use o predicado idade. Exemplo de uso:?- maisVelho(joao, andre). true.
-
Em Prolog, o operador
is
serve para calcular uma expressão aritmética e atribuir seu valor a uma variável, como nos exemplos abaixo:soma(A,B,C) :- C is A + B. pred(A,B,C) :- X is (A+B)^2, C is X*2+1.
Sabendo disso, incorpore o código acima ao programa e verifique qual será o resultado das consultas abaixo:
?- soma(8,5,S). ?- pred(3,2,X).
-
Usando o operador
is
, crie um predicadoanoNasc(P,A)
que permita deduzir o ano aproximado de nascimento (A) de uma pessoa (P). Use o predicado idade e o ano corrente como referência. Exemplo de uso:?- anoNasc(joao, A). A = 1988.
-
Em Prolog, listas são tipos de dados nativos. Como em Haskell e muitas outras linguagens, uma lista se representa com colchetes. Existem também vários predicados pré-definidos que manipulam listas. Teste (copie e cole) as consultas abaixo com os predicados
member
,length
enextto
(em caso de erro, identifique o motivo):?- member(a, [a,b,c]). ?- member(x, [a,b,c]). ?- member(A, [a,b,c]). ?- member(a, [a,b,c,a]). ?- length([a,b,c], L). ?- length([], X). ?- length(a, X). ?- length([a,b,c], 2). ?- nextto(1, 2, [1,2,3]). ?- nextto(2, Y, [1,2,3]). ?- nextto(4, X, [1,2,3]). ?- nextto(1, 2, [1,2,3,1,2]).
-
Usando lista em Prolog, crie um predicado
isVowel(X)
que verifique se um dado símbolo X é uma vogal. Dica: você vai precisar de uma lista de vogais possíveis:[a,e,i,o,u]
. Exemplo de uso:?- isVowel(a). true. ?- isVowel(b). false.