• Nenhum resultado encontrado

AP ˆ ENDICE A Programac¸˜ao em l´ogica

A.1.3 Considerac¸˜oes

O Prolog ISO implementado via resoluc¸˜ao SLDNF ´e bastante distante da programac¸˜ao l´ogica ideal, puramente declarativa, definida na sec¸˜ao anterior. Nas pr´oximas sec¸˜oes ser˜ao apresentadas extens˜oes do ISO, bem como m´aquinas de inferˆencias que juntas superam grande

Figura A.44: Representac¸˜ao de taxonomia em Prolog

parte dessas limitac¸˜oes.

A.2

Meta-Programac¸˜ao em L´ogica e HiLog

HiLog (Chen et al. 1993) fornece sintaxe concisa e expressiva para programac¸˜ao l´ogica em ordem superior. Em resumo, um termo HiLog pode ser constru´ıdo juntando qualquer s´ımbolo l´ogico com qualquer seq¨uˆencia finita de argumentos. Isso permite, por exemplo, usar vari´aveis como func¸˜oes, predicados e f´ormulas atˆomicas, assim como usar termos complexos no papel de func¸˜oes e predicados, e tamb´em f´ormulas atˆomicas como argumento destes.

A programac¸˜ao em alta ordem facilita a meta-programac¸˜ao e gerac¸˜ao de conceitos abstratos que podem ser aplicados a outros conceitos l´ogicos. Por exemplo, o predicadotransitivi- dadeabaixo ´e um exemplo do uso de termos complexos que fornece uma associac¸˜ao transitiva gen´erica, isto ´e, pode ser aplicada a qualquer relac¸˜ao.

transitividade(R)(X, Y) :- R(X, Y) transitividade(R)(X, Y) :- R(X, Z), transitividade(R)(Z,Y). ancestral(john, bill). ancestral(bill, bob). gerente(john, mary). gerente(mary, kathy). relac¸˜ao(ancestral). relac¸˜ao(gerente).

subordinado(Pessoa)(Superior) :-

relac¸˜ao(NomeRelac¸˜ao),

transitividade(NomeRelac¸˜ao)(Pessoa,Superior)

?- subordinado(john)(X).

X=bill; X=bob; X= mary; X=kathy; no

A consulta?- subordinado(john)(X)recupera os subordinados dejohn, tanto na relac¸˜ao de parentesco quanto de trabalho.

HiLog fornece um mapeamento sistem´atico da sintaxe de alta ordem para l´ogica de Horn usada por Prolog puro. Esse mapeamento ´e feito atrav´es de traduc¸˜ao para predicados de primeira ordemapply/N. O exemplo abaixo mostra como ´e feita a traduc¸˜ao do predicadotransiti- vidade.

apply(apply(transitividade,R),X,Y) :- apply(R,X,Y). apply(apply(transitividade,R),X,Y) :-

apply(apply(transitividade,R),X,Y), apply(R,Z,Y).

Esse mapeamento mostra que apesar de fornecer uma sintaxe de ordem superior, HiLog possui uma semˆantica de primeira ordem. Como esse mapeamento n˜ao ´e exponencial, ent˜ao a complexidade da inferˆencia em HiLog ´e da mesma ordem de magnitude que a inferˆencia em Prolog.

A.3

Programac¸˜ao em l´ogica tabelada e XSB

XSB (XSB 2002) ´e uma plataforma para programac¸˜ao l´ogica que cont´em diversas ex- tens˜oes, tais como:

• Uma implementac¸˜ao de HiLog;

• Interfaces para comunicac¸˜ao com outros sistemas, como por exemplo C, Java, Perl, ODBC

e Oracle;

• Implementac¸˜ao da resoluc¸˜ao SLG (Chen & Warren 1996).

A resoluc¸˜ao SLG ´e baseada em trˆes id´eias chaves, que s˜ao detalhadas a seguir.

Cache de objetivos: na resoluc¸˜ao SLDNF, quando um objetivo ´e provado ele ´e retirado do

a ser provado. Na resoluc¸˜ao SLG, todos os objetivo provados s˜ao inseridos em uma tabela. Dessa forma, antes de tentar provar um novo objetivo, o motor de inferˆencia checa na tabela se ele, ou uma generalizac¸˜ao dele, n˜ao j´a foi provado anteriormente. Se sim, ent˜ao n˜ao ´e necess´ario tentar provar de novo. Isso resolve o problema da eficiˆencia do Prolog ISO. A resoluc¸˜ao SLG ganha em eficiˆencia e perde em espac¸o de armazenamento. Todavia, hoje em dia o custo de mem´oria de armazenamento ´e baixo, e vale a pena manter a tabela para ganhar em eficiˆencia;

Orientado a objetivo e dados: assim como a resoluc¸˜ao SLDNF, a resoluc¸˜ao SLG ´e orientada

a objetivo, ou seja, tenta provar o objetivo e conseq¨uentes sub-objetivos para responder a consulta do usu´ario. Contudo, a resoluc¸˜ao SLG tamb´em ´e orientada a dados. Isto ´e, durante a prova de um objetivo, ela encontra todas as soluc¸˜oes poss´ıveis. A conseq¨uˆencia disso ´e a dificuldade em depurar um programa, pois torna-se mais dif´ıcil acompanhar o processo de encadeamento de regras realizado pelo motor de inferˆencia;

Suspens˜ao de objetivos: durante o processo de encadeamento de regras, todas as premissas

das regras que se est´a tentando disparar s˜ao armazenadas na tabela como objetivos a serem provados. Dessa forma, antes de tentar provar um novo objetivo o motor de inferˆencia checa se o mesmo n˜ao j´a consta na tabela como objetivo a ser provado. Se isso ocorrer, ent˜ao fica caracterizada a dependˆencia m´utua (recurs˜ao) entre as regras. Nessa situac¸˜ao, o objetivo em quest˜ao ´e suspenso, e o motor de inferˆencia tenta provar o objetivo seguinte. Dessa forma, espera-se que na tentativa de provar o pr´oximo objetivo a recurs˜ao seja resolvida e o objetivo seja provado. Se isso n˜ao acontecer, ent˜ao o objetivo falha. Caso se trate da negac¸˜ao de uma f´ormula atˆomica, uma vez que a prova n˜ao foi poss´ıvel por causa de uma dependˆencia m´utua, a resoluc¸˜ao SLG retorna um valor indefinido (nem verdadeiro, nem falso).

Isso resolve o fato da negac¸˜ao por falha n˜ao reconhecer situac¸˜oes onde os valores s˜ao indefinidos. Todavia, vale destacar que o problema de floundering n˜ao ´e resolvido por SLG.

Para esclarecer o funcionamento da resoluc¸˜ao SLG considere a Figura A.45, que mostra o trace de execuc¸˜ao do mesmo programa da Figura A.42, contudo dessa vez utilizando a resoluc¸˜ao SLG.

No intuito de provar a consulta da linha T1, tenta-se disparar a regra na linha C14. Esse ´e o passo do processo em que motor de inferˆencia ´e orientado a objetivo. Para provar a regra ´e necess´ario provarhomem(X)epai(Y,X). As linhas T3-T12 mostram a tentativa instanciar Xpara o predicado homem. Nesse momento a inferˆencia passa a ser orientada a dados por- que, antes de prosseguir para o pr´oximo objetivo, tenta encontrar todas as soluc¸˜oes poss´ıveis para a vari´avelX. Em contraste, nesse momento a SLDNF busca apenas uma ´unica soluc¸˜ao e

Figura A.45: Trace de execuc¸˜ao SLG

prossegue rumo ao pr´oximo objetivo. No final desse passo a vari´avelXsai com o ´ultimo valor encontrado, que foi juca. $homem ´e uma representac¸˜ao interna do XSB para o predicado tabeladohomem/1. De posse de um valor paraX, tenta-se aplic´a-lo ao predicadopai/2, que falha (linhas T13-T14). Assim, o motor de inferˆencia realiza backtracking na tentativa de en- contrar outro valor paraX; o valor encontrado ´epedro(linhas T15-T16). Aplica-se esse valor

apai/2, que sucede parapai(joao,pedro) (linhas T17-T18). Em seguida, tenta-se en-

contrar outra soluc¸˜ao parapai(joao,pedro)(linhas T19-T20), que falha. Assim, realiza-se novo backtracking repetindo o processo anterior para o valorjoao(linhas T21-T26), que falha. A soluc¸˜ao retornada para o usu´ario ´epedro(linhas T27-T29).

Ap´os o usu´ario solicitar uma outra soluc¸˜ao (ponto-e-v´ırgual em T29), o motor de inferˆencia tenta encontrar outro valor para X, contudo, como n˜ao existe mais nenhuma soluc¸˜ao para filho/2(se existisse j´a estaria tabelada), ent˜ao a consulta falha (linhas T30-T31).

Logicamente, o exemplo acima ´e simples demais para mostrar todo o potencial da resoluc¸˜ao SLG. Assim, vale destacar que em programas com um n´umero maior de regras, onde a execuc¸˜ao de consultas implica no encadeamento de v´arias regras, a resoluc¸˜ao SLG mostra-se bastante

eficiente porque insere na tabela as soluc¸˜oes encontradas, simplificando as operac¸˜oes de back- tracking em objetivos j´a provados.

Para utilizar a resoluc¸˜ao SLG no XSB basta declarar que se deseja tabelar o predicado. Isso ´e feito atrav´es da diretiva de compilac¸˜ao:- table <predicado>/<aridade>. Dessa forma, qualquer f´ormula l´ogica desse predicado ser´a tabelada, e a estrat´egia de resoluc¸˜ao utili- zada ser´a SLG.

A.3.1

Depurando programas com XSB

No intuito de facilitar a depurac¸˜ao de programas l´ogicos o XSB fornece alguns predicados internos que permitem ao desenvolvedor coletar trace da execuc¸˜ao do programa. Alguns desses predicados s˜ao mostrados na Tabela A.2.

Tabela A.2: Predicados para controle de depurac¸˜ao em XSB

Predicado Descric¸˜ao

trace/0 Ativa o modo de trace de execuc¸˜ao. Ap´os a execuc¸˜ao desse co-

mando, qualquer consulta feita pelo usu´ario far´a com que XSB mos- tre na tela um passo-a-passo sobre as f´ormulas atˆomicas que est˜ao sendo provadas. A cada passo o usu´ario pode interagir com o XSB, sendo poss´ıvel, por exemplo, mandar executar o pr´oximo passo, ou ainda cancelar a execuc¸˜ao da consulta.

notrace/0 Desativa o modo de trace.

spy/1 Permite ao desenvolvedor especificar um predicado ou uma lista de

predicados que ser˜ao inspecionados. Isto ´e, sempre que o motor de inferˆencia tentar provar esses predicados, ser´a exibido um trace da execuc¸˜ao da prova.

debug ctl/2 Esse predicado fornece mecanismos para configurar alguns aspec-

tos do trace, como por exemplo, cancelar o modo de interac¸˜ao com o usu´ario, e redirecionar o conte´udo do trace para um arquivo em disco. Esse predicado possui dois argumentos: o primeiro especifica a opc¸˜ao de configurac¸˜ao que se deseja alterar, o segundo o novo valor para a opc¸˜ao informada. Por exemplo, para desabilitar a interac¸˜ao com o usu´ario basta executardebug ctl(prompt,off).

hide this show/2 Esse ´e um predicado interno que permite ao desenvolvedor informar

ao XSB que determinado predicado n˜ao deve aparecer no trace. Ele recebe dois argumentos: o nome do predicado e sua aridade.