• Nenhum resultado encontrado

Introdução à linguagem Prolog

N/A
N/A
Protected

Academic year: 2021

Share "Introdução à linguagem Prolog"

Copied!
8
0
0

Texto

(1)

Introdu¸c˜

ao `

a linguagem Prolog

ogica Computacional – 2

o

ano LCC

2011/2012

1

Preˆ

ambulo

Ao longo do semestre iremos na disciplina de L´ogica Computacional fazer uso da linguagem Prolog. O interpretador adoptado ser´a o SWI-Prolog que est´a dispon´ıvel para para a generalidade das plataformas (MS-Windows, Linux, macOSX). Alguns apontadores ´uteis:

• P´agina web do SWI-Prolog: http://www.swi-prolog.org/

• Manual do SWI-Prolog: http://www.swi-prolog.org/pldoc/refman/

Ao longo desta ficha s˜ao apresentados os conceitos elementares da linguagem Prolog. S˜ao tamb´em apresentados alguns exerc´ıcios que se recomenda que realizem e testem com o aux´ılio do interpretador (na aula pr´atica teremos oportunidade de voltar a alguns deles).

2

Apresenta¸

ao da linguagem Prolog

2.1

Conceitos Preliminares

Termos. O Prolog ´e uma linguagem simb´olica que manipula termos que podem ser: • Vari´aveis – denotadas por identificadores come¸cados por letras mai´usculas (e.g. X,

Y, Xs, ...);

• Constantes – ´atomos (identificadores come¸cados por letras min´usculas) ou valores de tipos pr´e-definidos como inteiros, reais, strings, etc. (e.g. abc, xyz, 32, 3.1415); • Termos Compostos – termos da forma f(t1,...,tn) onde f ´e designado por functor

(nome da fun¸c˜ao) e t1...tn s˜ao termos (e.g. xyz(X,abc), abc(abc(abc,abc)), +(4,2))

Obs.: como iremos ver adiante, o Prolog permite a declara¸c˜ao de operadores infixos. Assim ir´a permitir escrever 4 + 2 como alternativa ao termo +(4,2) (o mesmo se aplica a outros operadores infixos que ser˜ao apresentados adiante).

(2)

Substitui¸c˜oes e Unifica¸c˜ao. O que caracteriza as vari´aveis ´e o facto de elas poderem vir a ser substituidas por outros termos. Considere-se o termo t(X,Y): se substituirmos X por abc(A,3) e Y por Z obtemos o termos t(abc(A,3),Z).

Uma opera¸c˜ao fundamental no modelo de execu¸c˜ao do Prolog ´e o que se designa por Unifica¸c˜ao de dois termos. A ideia consiste em encontrar uma substitui¸c˜ao que iguale (se poss´ıvel) os termos dados. Vejamos alguns exemplos:

1. X=4, Y=3 ´e um unificador dos termos abc(3,X) e abc(Y,4); 2. X=4, Y=4 ´e um unificador dos termos abc(X,X) e abc(Y,4); 3. os termos abc(3,4) e abc(X,X) n˜ao disp˜oe de unificador. 4. X=g(Z), Y=y ´e um unificador dos termos f(X,y) e f(g(Z), Y). 5. X=g(a), Y=y, Z=a ´e um unificador dos termos f(X,y) e f(g(Z), Y).

Uma caracter´ıstica partilhada pelos unificadores apresentados nos n´umeros (1), (2) e (4) ´e que se tratam dos unificadores mais gerais (qualquer outra substitui¸c˜ao que unifique os termos pode ser expressa como um refinamento da substitui¸c˜ao dada). J´a no caso do unificador apresentado em (5) essa propriedade n˜ao se verifica: facilmente se verifica que a substitui¸c˜ao pode ser obtida quando aplicamos a substitui¸c˜ao [Z=a] ao unificador apresentado em (4). Adiante iremos ter oportunidade de aprofundar estes aspectos mais te´oricos... Para j´a interessa reter que oProlog, quando unificar dois termos, determina sempre o unificador mais geral (i.e. a substitui¸c˜ao mais simples que iguala os termos). Exerc´ıcio 1 Determine o unificador mais geral para os seguintes pares de termos (se existir... naturalmente): 1. f (X, g(Y )) e g(X, f (Y )) 2. f (X, g(Y )) e Z 3. f (X, g(y)) e f (g(y), X) 4. f (X) e X 5. f (X) e f (3 + 2) 6. f (3) e f (2 + 1) 7. f (3) e A(X)

2.2

Programas em Prolog

Executar um programa em Prolog consiste em interrogar o interpretador sobre a validade de um dado predicado l´ogico. A resposta mais simples ser´a ent˜ao true ou fail (se o predicado for v´alido ou n˜ao, respectivamente).

(3)

Objectivo (Goal). Quando se invoca o SWI-Prolog, surge o prompt ?- que assinala que o interpretador aguarda a introdu¸c˜ao de um objectivo (tamb´em designado por query, ou goal ).

Calvin:~ jba$ /opt/local/bin/swipl

Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 5.6.51) Copyright (c) 1990-2008 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).

?-Como referimos, o objectivo ser´a um predicado l´ogico. Iremos ter oportunidade de definir novos predicados mas, para j´a, concentremo-nos na utiliza¸c˜ao do predicado pr´ e-definido =/2 (o /2 significa que o predicado espera dois argumentos). Este predicado ser´a v´alido precisamente quando os termos que forem passados como argumentos unificarem. Assim podemos introduzir:

?- =(3,3). true. ?- 3=3. true. ?- 3=2. fail. ?- 3=X. X = 3. ?- 3+2=X. X = 3+2. ?- 3 + X = Y * 2. fail.

?-Os exemplos apresentados revelam-nos duas coisas: (1) podemos utilizar a nota¸c˜ao infixa e, (2) quando no objectivo est˜ao envolvidas vari´aveis o Prolog retorna uma subs-titui¸c˜ao dessas vari´aveis que verifiquem o predicado (ou falha, se n˜ao existir nenhuma substitui¸c˜ao nessas condi¸c˜oes) — podemos ent˜ao dizer que, intuitivamente, as vari´aveis dos objectivos est˜ao quantificadas existencialmente.

Exerc´ıcio 2 Interrogue o interpretador de Prolog por forma a ele retornar os unifica-dores mais gerais atr´as solicitados.

(4)

2.3

Base de Conhecimento

Referimos que executar um programa em Prolog consiste em interrogar o interpreta-dor relativamente a um objectivo. Mas, em que ´e que consiste um programa Prolog?. Um programa em Prolog ser´a a base de conhecimento que o interpretador utiliza para determinar a validade do objectivo pedido. Essa base de conhecimento ser´a consitu´ıda por:

• Factos: que estabelecem a validade imediata (de instˆancias) de predicados; • Regras: que condicionam a validade de predicados `a validade de sub-objectivos.

Factos. Comecemos pelos primeiros. Como exemplos de factos podemos ter:

pai(joao,manuel). pai(cristina, jose). pai(joaquim,manuel). pai(francisco,joao). pai(helena,joao)

Com base nestes factos, diriamos que pai(joaquim,manuel) ´e v´alido mas pai(joaquim,jose) j´a n˜ao o ´e (porque nada estabelece a sua validade). Para verificar isso com o Prolog, necessitamos de carregar a base de conhecimento no interpretador. Para tal devemos:

1. gravar um ficheiro com os factos apresentados (normalmente d´a-se a extens˜ao ”.pl”aos ficheiros Prolog, e.g. ”pai.pl”);

2. carregar o ficheiro no interpretador por interm´edio do predicado pr´e-definido consult (e.g. ”consult(pai.pl)”).

Exerc´ıcio 3 Verifique a validade de alguns objectivos com a base de conhecimento apre-sentada. O que acontece quando se inclui vari´aveis?

Por vezes, o interpretador retorna uma substitui¸c˜ao de resultado sem voltar ao prompt inicial. Isso assinala que a solu¸c˜ao apresentada ´e uma de v´arias poss´ıveis, podendo o utilizador:

• digitar . (ponto) e retornar ao prompt inicial;

• digitar ; (ponto e v´ırgula) para solicitar outra solu¸c˜ao.

Exerc´ıcio 4 Introduza um predicado na base de conhecimento que permita determinar todos os filhos de ”manuel”. O que aconteceria se incluisse na base de conhecimento o facto pai(X,carlos)? Experimente... (verifique o impacto de o incluir no in´ıcio e no fim da base de conhecimento).

(5)

O exerc´ıcio anterior permite concluir que, nos factos, devemos entender as vari´aveis que ocorrem nos factos como quantificadas universalmente.

Se as quest˜oes colocadas ao interpretador de Prolog s˜ao predicados l´ogicos, ´e natural perguntarmo-nos como construir predicados `a custa de conectivas l´ogicas (como “e”, “ou”, etc.). O Prolog tem definido os operadores:

conjun¸c˜ao: denotado por uma v´ırgula (,) disjun¸c˜ao: denotado por um ponto e v´ırgula (;)

(As restantes conectivas l´ogicas proposicionais ser˜ao introduzidas mais tarde.)

A t´ıtulo de exemplo, poder´ıamos interrogar o Prolog com o seguinte goal composto: ?- pai(X,manuel), pai(X,manuel).

X = joao ; X = joana.

?-Regras. A expressividade do Prolog resulta do facto de permitir incluir, na base de conhecimento, regras que condicionam a validade de um predicado (colocado no lado es-querdo do operador :-, e designado por cabe¸ca da regra) `a validade de um conjunto de outros predicados (designados por corpo da regra). A t´ıtulo de exemplo, temos que a regra: avo(X,Y) :- pai(X,Z), pai(Z,Y).

Esta regra diz-nos que o predicado avo(X,Y) ser´a v´alido quando for v´alido pai(X,Z) e simultaneamente for tamb´em v´alido pai(Z,Y) (para quaisquer instˆancias de X, Y, Z). Quando acrescentada `a base de conhecimento apresentada acima, permite que o Pro-log responda afirmativamente ao predicado avo(francisco,manuel) — o interpretador de Prolog ser´a capaz de encontrar instˆancias que verificam o corpo da regra (no caso, pai(francisco,joao) e pai(joao,manuel)).

Note que nas regras, as vari´aveis que ocorrem na cabe¸ca da regra devem ser entendidas como quantificadas universalmente (como nos factos). J´a as que s´o ocorrem no corpo da regra devem ser entendidas como quantificadas existencialmente (como nos objectivos). Exerc´ıcio 5 Estenda a base de conhecimento para exprimir outros graus de parentesco, como ”irm˜ao”, ”tio”, etc.

3

Manipula¸

ao de listas

Um exemplo de um tipo estruturado muito utilizado em Prolog s˜ao as listas. A sintaxe pr´e-definida das listas ´e [] para denotar a lista vazia e [H|T] que denotar a lista com cabe¸ca H e cauda T.

Como um exemplo de um predicado envolvendo listas, considere-se o predicado que verifique se um dado elemento ´e a cabe¸ca de uma lista:

(6)

head(X,[X|_]).

Claro est´a que, tratando-se as listas de um tipo recursivo, a defini¸c˜ao de predicados “in-teressantes” sobre listas passa por se definirem predicados recursivos. A t´ıtulo de exemplo, vamos considerar a defini¸c˜ao do predicado member/2 que verifique se um dado elemento pertence a uma lista.

member(X,[X|_]).

member(X,[_|T]) :- member(X,T).

Este predicado foi definido de forma an´aloga `a fun¸c˜ao recursiva elem do Haskell: um elemento pertence a uma lista se for a cabe¸ca dessa lista, ou se pertencer `a cauda. Um exemplo da utiliza¸c˜ao deste predicado seria:

?- member(2,[1,2,3]). true .

?- member(4,[1,2,3]). fail.

Mas em Prolog podemos tamb´em utiliza-lo com vari´aveis n˜ao instanciadas com o objectivo de determinar quais os elementos de uma lista:

?- member(X,[1,2,3]). X = 1 ;

X = 2 ; X = 3 ; fail.

Ou at´e para determinar solu¸c˜oes a quest˜oes mais complicadas, como quais os elementos pares de uma lista:

?- member(X,[3,5,4,6,5,7]), X mod 2 =:= 0. X = 4 ;

X = 6 ; fail.

Exerc´ıcio 6

1. Defina o predicado concat/3 que verifique quando uma lista ´e a concatena¸c˜ao de outras duas. Verifique o resultado quando o invoca com diferentes listas instanciadas.

4

Opera¸

oes aritm´

eticas

a vimos que o Prolog aceita termos que representem express˜oes matem´aticas, como 3+4*2. Mas quando manipulamos esses termos estamos normalmente interessados em avaliar essas express˜oes (i.e. calcular o seu resultado). O Prolog disponibiliza para o efeito o predicado is que avalia o segundo argumento e unifica o resultado com o primeiro. Alguns exemplos (onde se utiliza a nota¸c˜ao infixa para o predicado):

(7)

?- X is 3+2. X = 5. ?- 3+2 is 2+3. fail. ?- 5 is 3+2. true. ?- 5 is X+2.

ERROR: is/2: Arguments are not sufficiently instantiated

Um aspecto importante na utiliza¸c˜ao do predicado is ´e a assimetria induzida: o se-gundo argumento deve ser sempre uma express˜ao completamente instanciada. Assim, se definirmos o predicado:

soma(X,Y,Z) :- X is Y + Z.

devemos considerar o segundo e o terceiro argumentos como ”argumentos de entrada”, que necessitam estar devidamente instanciados. Uma forma compacta de se exprimir esse facto (normalmente utilizada na documenta¸c˜ao) ´e atrav´es da assinatura soma(-X,+Y,+Z) — assim identifica-se o argumento Y e Z como de entrada e X como de sa´ıda. Esta mesma conven¸c˜ao ´e utilizada no manual do SWI-Prolog, como se pode confirmar invocando o predicato apropos(is) (ou, alternativamente, help(is)).

Exerc´ıcio 7

1. Defina o predicado fact(-R,+X) que suceda quando R for o factorial de X.

2. Uma forma alternativa de lidar com n´umeros naturais consiste em considerar termos zero, suc(zero), suc(suc(zero)), etc. (i.e. utilizar nota¸c˜ao un´aria para os naturais). Defina o predicado nat2int/2 que sucede quando o primeiro argumento ´e a representa¸c˜ao un´aria do segundo.

3. No predicado definido na al´ınea anterior, verifique: que argumentos tem de ser utili-zados como entrada e como sa´ıda?; o que acontece quando solicita ao interpretador v´arias respostas?

4. Verifique, com o aux´ılio do mecanismo de help do SWI-Prolog (ou da documenta¸c˜ao on-line, se preferir) qual a funcionalidade oferecida pelos operadores: =:=, =\=, <, =<, ==, @<

5

Inferˆ

encia do Prolog

Um objectivo em Prolog consiste numa lista de predicados. O resultado da ”execu¸c˜ao”desse objectivo no interpretador consiste numa substitui¸c˜ao que verifique esses predicados. O processo constru¸c˜ao da substitui¸c˜ao ´e normalmente designado por inferˆencia, e pode ser justificado construindo uma ´arvore como se descreve:

(8)

Na raiz da ´arvore, coloca-se a lista de predicados. O Prolog ir´a processar cada predicado dessa lista por ordem. Para cada predicado, o Prolog ir´a procurar encontrar na base de conhecimento uma instˆancia dum facto ou duma regra cuja cabe¸ca unifique com esse predicado. Esta procura processa-se tamb´em pela ordem pela qual as defini¸c˜oes ocorrem na base de conhecimento. Quando ´e encontrada uma regra nas condi¸c˜oes referidas, cria-se um descendente na ´arvore contendo a lista j´a afectada pela substitui¸c˜ao resultante da unifica¸c˜ao (relembre que o resultada na unifica¸c˜ao ´e uma substitui¸c˜ao das vari´aveis) e onde o predicado em an´alise ´e substitu´ıdo pelo lado direito da regra (ou simplesmente desaparece, no caso dos factos). E habitual anotarmos os arcos da ´´ arvore com as substitui¸c˜oes resultantes das unifica¸c˜oes. Quando existe mais do que uma possibilidade para a referida unifica¸c˜ao (e.g. v´arias regras s˜ao aplic´aveis), traduz-se por uma ramifica¸c˜ao da ´arvore de inferˆencia. Operacionalmente, o Prolog trata esta ramifica¸c˜ao pelo mecanismo de backtracking (travessia depth-first da ´arvore). Quando a lista de predicados fica vazia, cria-se uma folha na ´arvore denotada como true — representa um resultado apresentado ao utilizador (a substitui¸c˜ao calculada ao longo do caminho). Quando n˜ao existe qualquer regra na base de conhecimento que unifique com o primeiro predicado da lista, cria-se uma folha denotada por fail. A ´arvore de deriva¸c˜ao para o objectivo ”member(X,[1,2]), X mod 2 =:= 0 ”ser´a: member(X,[1,2]), X mod 2 =:= 0 1 mod 2 =:= 0 fail X = 1 member(X,[2]), X mod 2 =:= 0 2 mod 2==0 yes (X = 2) X = 2 member(X,[]), X mod 2 =:= 0 fail

Exerc´ıcio 8 Considere o predicato fact/2 definido no exerc´ıcio 7. 1. Apresente a ´arvore de inferˆencia para o objectivo fact(R,2).

Exerc´ıcio 9 Considere a seguinte defini¸c˜ao para o predicado nat2int/2 (c.f. exerc´ıcio 7).

nat2int(zero,0).

nat2int(suc(X),N) :- nat2int(X,N2), N is N2+1.

1. Apresente a ´arvore de inferˆencia para o objectivo nat2int(suc(suc(zero)),X). 2. Apresente a ´arvore de inferˆencia para o objectivo nat2int(X,2).

3. Comente os resultados obtidos. Consegue propor alguma forma de ultrapassar os problemas detectados?

Referências

Documentos relacionados

rela c~ ao causal entre duas vari aveis quando concebeu. que uma vari avel mudou devido  a a c~ ao

Outro aspecto importante é o de como as variáveis de tipo ponteiro são aplicáveis para a passagem de vetores como parâmetros para funções. Ao se passar um ponteiro

Em relação ao while, este é constituído somente por um argumento, que corresponde à condição imposta, ou seja, enquanto a condição for verdadeira, o que está dentro do while

Tipo de aquisição referente a compra de passagem para embarque em meios de transportes diversos (passagens áereas, rodoviárias ou hidroviárias, em âmbito municipal, estadual,

(34, 37, 38) O AgHBe é considerado marcador de replicação e de infecciosidade de VHB. A presença do AgHBe associa-se, em regra, a níveis elevados de ADN de VHB no soro e à

Educação Inclusiva, a educação bilíngue para pessoas com surdez, compreende: (A) O ensino escolar na Língua Portuguesa e na língua de sinais, o ensino da Língua Portuguesa como

Como nas fun¸ c˜ oes de uma vari´ avel, temos de atender aos valores das vari´ aveis independentes para os quais f n˜ ao est´

O identificador é uma sequência de letras, dígitos e caractere para sublinhamento escolhida pelo programador e (como foi dito acima) será utilizado no programa para se