Você está na página 1de 18

4 Linguagens

A primeira pergunta que deve ser respondida antes de se discutirem linguagens especficas Existem caractersticas especficas que sejam importantes numa linguagem para escrever programas de IA em distino a uma linguagem para escrever outros tipos de programas? A resposta para essa pergunta sim. Embora, claro, seja formalmente possvel escrever qualquer programa em qualquer linguagem, existem muitas provas no sentido de que o processo de construir sistemas de IA pode ser facilitado consideravelmente pela utilizao de uma linguagem de programao que fornea apoio a uma variedade de estruturas comuns, tanto para dados como para controle. Tendo respondido essa pergunta, precisamos perguntar a seguir: Quais so as caractersticas de linguagem que facilitam a produo de sistemas de IA? Alm das caractersticas desejveis em qualquer linguagem, como eficincia, clareza, modularidade, etc..., existem as caractersticas especficas para a construo de sistemas de IA:

!Recursos para manipulao de listas, pois elas so uma estrutura


utilizada em quase todos os programas de IA.

amplamente

!Tempos de amarrao tardia. Em muitos programas de IA, no possvel


determinar certos atributos de um objeto, exceto no caminho, medida que o programa estiver sendo executado.

!Recursos de casamento de padres, tanto para identificar dados !Recursos para realizar inferncias. !Recursos para construir estruturas de conhecimento complexas.
34

como para determinar controle. O casamento de padres para dados uma parte importante da utilizao de uma grande base de conhecimento. O casamento de padres para controle forma a base para a execuo de sistemas de produo.

!Mecanismos pelos quais o programador possa fornecer conhecimento adicional


para focalizar o sistema onde provavelmente seja mais lucrativo. Nenhuma linguagem existente fornece todos esses recursos. Alguns so fornecidos em detrimento de outros. No resto desse captulo exploraremos a linguagem PROLOG que, juntamente com LISP, formam o grupo de linguagens mais utilizadas na IA.

4.1 PROLOG PROLOG uma linguagem de programao baseada em um pequeno conjunto de conceitos, incluindo casamento de padres, estruturao em forma de rvore e backtracking automtico. Este pequeno conjunto forma um ambiente de programao poderoso. PROLOG especialmente adequada para problemas envolvendo objetos e suas relaes. PROLOG representa PROgramming in LOGic (Programao em Lgica), uma idia nascida no incio dos anos 1970 para usar lgica como linguagem de programao. O texto abaixo foi adaptado da referncia [3].

TOMOS Nossa meta ensinar os computadores a agir com inteligncia. Para isto precisamos de uma linguagem para nos comunicar com eles. A linguagem que usaremos chamada PROLOG. Da mesma forma que o Portugus, o PROLOG possui palavras e frases. O tipo de palavra mais comum em PROLOG denominado tomo. Alguns exemplos de tomo so: lpis, ana, brasil, tesoura, guarda-roupa. Note que os tomos comeam com letra minscula at mesmo quando so prprios.

PREDICADOS Predicado uma construo usada para declarar algo a respeito de objetos. Em PROLOG, a declarao representada por um tomo e seguida pelos objetos que devem ser colocados entre parnteses e estar separados uns dos outros por vrgulas. Exemplos.
homem(pedro) mulher(ana) brigou(carlos,maria) pai(pedro,ana) 35

Quando existe apenas um objeto no predicado, a declarao quase sempre uma caracterstica deste objeto. Sendo assim, o predicado, homem(pedro) informa que Pedro homem e mulher(ana) transmite a idia que Ana mulher. Nos predicados com dois ou mais objetos, a declarao tanto pode ser uma relao entre os referidos objetos quanto nomear uma ao da qual eles participaram. No caso de pai(pedro,ana), declara-se que uma relao de paternidade liga Pedro a Ana e, portanto, que Pedro pai de Ana. J o predicado brigou(carlos,maria), significa que Carlos brigou com a Maria, ou mais precisamente, que Carlos e Maria participaram da ao de brigar.

FRASES As frases mais simples da linguagem PROLOG so constitudas por um nico predicado. Quando estas frases so usadas para dizer alguma coisa ao computador, elas so afirmativas e terminam com um ponto final. A seguir, mostramos vrios exemplos de frases simples afirmativas.
homem(pedro). homem(carlos). mulher(ana). pai(pedro,ana). casado(pedro,maria). casado(carlos,ana).

H tambm frases que servem para perguntar algo ao computador. Estas frases so chamadas interrogativas, comeam por um ponto de interrogao seguido do sinal de menos e terminam com ponto final. A seguir temos alguns exemplos de frases interrogativas com as respectivas respostas. As respostas, que esto sublinhadas, foram dadas pelo computador e so baseadas nos exemplos de frases afirmativas.
?- casado(carlos,maria). no ?-casado(carlos,ana). yes ?- homem(ana). no

VARIVEIS EXISTNCIAIS Muitas vezes necessrio perguntar sobre objetos cuja identidade desconhecemos e precisamos descobrir. Em Portugus, isto pode ser feito representando o objeto desconhecido por pronomes tais como "quem" e "qual". Exemplos:
36

Quem me procurou ontem? Qual nibus devo tomar para ir a Volta Redonda? Na linguagem PROLOG, usam-se variveis para se referir a objetos desconhecidos. As variveis so palavras que comeam sempre com letra maiscula e, quando aparecem em perguntas, podem ser consideradas como equivalentes a "quem", "o que", "qual", etc. Para exemplificar o uso de variveis, aqui vai uma pergunta e a resposta que o computador d a ela:
?- homem(Pessoa). pessoa=pedro->

Presentemente o computador identificou uma pessoa, apresentou o nome dela e ficou aguardando nossa reao. Se teclarmos ponto-e-vrgula, a mquina conclui que no ficamos satisfeitos com a resposta e procura outra. Teremos ento:
?-homem(Pessoa). Pessoa=pedro->; Pessoa =homem->

Se esta segunda resposta for a desejada, devemos teclar um ponto final e obter a seguinte situao:
?-homem(Pessoa). Pessoa=pedro->; Pessoa =homem->. yes

Qualquer varivel que aparece em uma pergunta usada para representar um objeto em cuja existncia acreditamos mas cuja identidade desconhecemos. Por isto, as variveis de perguntas so denominadas existenciais. Seja, por exemplo, a seguinte pergunta: Quem casado com Ana? Nesta pergunta, sabemos que algum construiu Piter mas no sabemos quem foi. Para ser mais preciso, sabemos da existncia da pessoa que construiu Piter mas no podemos identificar esta pessoa e, por esta razo, devemos represent-la pela varivel existencial Quem. Assim sendo, a pergunta deve ser expressa da seguinte maneira na linguagem PROLOG:
?- casado(Quem,ana).

A resposta que o computador dar a tal pergunta :


Quem=carlos->. yes

37

Atente o leitor para o fato de que o nome da varivel existencial totalmente arbitrrio e bem que poderamos ter usado X no lugar de Quem. , entretanto, boa prtica utilizar-se de nomes que tornem mais claro o significado da pergunta. Pode acontecer que o objeto representado pela varivel existencial no exista. Um estrangeiro, por exemplo, poderia fazer a seguinte pergunta: Quem o rei do brasil? Este estrangeiro pensa que existe um rei do brasil. No existe, Devemos, portanto, responder: Ningum. Quando formulamos pergunta deste tipo ao computador, ele responde no. Por exemplo:
?- casado(Quem,Joana). no

Nesta pergunta, supusemos a existncia de um homem que construiu Ndia e pedimos mquina que o identificasse. Acontece que tal homem no existe e, por isso, recebemos a resposta no.

VARIVEIS UNIVERSAIS Variveis podem aparecer tambm em frases afirmativas. Neste caso, elas representam um objeto qualquer e so denominadas universais. Poderamos dizer que variveis universais possuem em PROLOG um papel anlogo ao de palavras como "qualquer", "tudo", etc. Assim, a frase.
igual(H,H).

significa que tudo igual a si mesmo. O conceito de varivel no exclusivo do PROLOG. Na Lngua Portuguesa, por exemplo, no incomum utilizar-se de letras para se referir a objetos desconhecidos. Assim, pessoas versadas em Filosofia dizem com freqncia: Se B igual a C igual a D, ento B igual a D As letras B, Ce D que aparecem nesta sentena so em tudo similares s variveis do PROLOG. Tambm na Matemtica e nas Cincias Exatas o uso de variveis generalizado. Isto exemplificado pelo texto abaixo, que contm as variveis P e N. Se uma pessoa pediu emprestada a quantia N a 5% ao ms, depois de um ms estar devendo N + 5 * N/100.

38

As variveis no so usadas apenas em contextos tcnicos, cientficos e eruditos. At no linguajar popular elas j entraram, conforme atesta o uso generalizado de expresses como a seguinte: Qual o X da questo? Esperamos que os exemplos dados sejam suficientes para mostrar que o conceito de varivel no difcil de adquirir.

FRASES COMPOSTAS Em Portugus, palavras chamadas conjunes so usadas para combinar frases simples e formar sentenas compostas. Entre as conjunes, esto o "se" e o "e". Dois exemplos disto so: Ana vai ao cinema e Maria vai ao teatro. Gato pega rato se est com fome. Na linguagem PROLOG, usa-se o smbolo :- no lugar do "se", uma vrgula no lugar da conjuno "e" e ; no lugar de ou. Para exemplificar isto, vamos expressar uma relao de parentesco em PROLOG:
irmao(X,Y):-pai(H,Y),pai(H,X); mae(Z,Y),mae(Z,X).

A frase acima diz que X irmo de Y se existir um H que pai de X e Y ou existir um Z que me de X e Y. A frase acima no faz referncia ao sexo de X, portanto a relao acima est representando a relao de irmo e irm. Outra forma de definir uma frase com alternativas (ou) e escrever as frases separadamente, por exemplo:

irmao(X,Y):-pai(H,Y),pai(H,X). irmao(X,Y):-mae(Z,Y),mae(Z,X).

ESTRUTURAS At agora temos representado os objetos de um predicado por constantes. Isto tem sido possvel porque nos limitamos a objetos cujas partes no precisam ser destacadas. Existem em PROLOG palavras que so usadas para se referir a objetos com partes que devem ser nomeadas individualmente. Estas palavras so denominadas estruturas e possuem dois tipos de componentes, a saber: O funtor, que invariavelmente um tomo e serve para identificar e estrutura.

39

Os argumentos que so usados para nomear as partes do objeto composto. Eles podem ser constantes, varveis, nmeros e at mesmo outras estruturas.

Em geral, os argumentos so colocados entre parnteses e esto separados uns dos outros por vrgula. Isto faz com que as estruturas tenham a mesma forma que os predicados. Para exemplificar a utilizao de estruturas, fornecemos abaixo uma frase declarando que o todo mundo ama seu prprio pai:
ama(X,pai-de(X)).

O segundo objeto do predicado "ama" a estrutura "pai-de(X)". O functor desta estrutura pai-de e o nico argumento X.

DIFERENAS ENTRE PREDICADOS E ESTRUTURAS Conforme vimos, as estruturas so formalmente idnticas aos predicados. De fato, os predicados no passam de estruturas declarando coisas que podem ser verdadeiras ou falsas. Assim sendo, comum usar a palavra funtor para indicar a declarao de um predicado. Tambm no raro se referir a objetos como sendo argumentos. Embora todo predicado seja uma estrutura nem toda estrutura predicado. Isto porque h estruturas que esto apenas nomeando objetos e, portanto, no fazem nenhuma declarao que possa ser considerada verdadeira ou falsa. De um modo geral, os predicados aparecem sempre como os componentes principais das frases do PROLOG e so ligados uns aos outros pelo smbolo :- ou por vrgulas.

MAIS ESTRUTURAS Analisemos mais alguns exemplos de estruturas. A frase abaixo indica a data do aniversrio de Ndia.
aniversrio(ndia,data(3,maro,1986)).

A data fornecida dentro de uma estrutura contendo 3 argumentos, que representam o dia, o ms e o ano em que a moa nasceu. Embora Ndia seja uma jovem cientista e acredite mais em astronomia do que em astrologia, vamos escrever frases que permitam ao computador encontrar o signo dela e de seus companheiros. Uma pessoa de aqurio se nasceu entre o dia 20 de janeiro a 18 de fevereiro. As frases que dizem isto so as seguintes:
signo(Pessoa,aqurio):aniversrio(Pessoa,data(Dia,janeiro,_)), Dia>=20. 40

signo(Pessoa,aqurio):aniversrio(Pessoa,data(Dia,fevereiro,_)), Dia =<18.

Duas coisas merecem ateno nestas frases. A primeira o hfen que aparece no terceiro argumento da estrutura "data(...,...,_)". Este hfen significa "no se importe" e faz com o computador no leve em conta o ano. De modo geral, sempre que um objeto (ou argumento) for irrelevante, ele substitudo por um hfen. A segunda coisa notvel o predicado "Dia>=20". A declarao deste predicado ">=" e a expresso toda pode ser traduzida por "Dia maior ou igual a 20". Em PROLOG existem vrias declaraes que so colocadas entre seus objetos e no antes deles. Estas declaraes so chamadas infixas. Alguns predicados com declaraes infixas so dados abaixo:

X>5 X<5 X=<5 X>=5 X= jojoba X\=Y X@<Y X@>Y X@=<Y X@>=Y

significa: X maior que 5. significa: X menor que 5. significa: X menor ou igual a 5. significa: X maior ou igual a 5. significa: X igual a jojoba. significa: X no pode representar o mesmo objeto que Y. significa: X vem antes de Y (na ordem alfabtica). significa: X vem depois de Y (na ordem alfabtica). significa: ou X ocupa a mesma posio de Y ou vem antes de Y (na ordem alfabtica). significa: ou X vem depois de Y ou ocupa a mesma posio que Y (na ordem alfabtica).

Voltemos s frases que determinam o dia do zodaco. Se uma pessoa nasce entre 19 de fevereiro e 20 de maro, ela de peixes. Eis as frases que dizem justamente isto:
signo(Pessoa,peixes):aniversrio(Pessoa,data(Dia,fevereiro,_)), Dia >=21. signo(Pessoa,peixes):aniversrio(Pessoa,data(Dia,maro,_)), Dia=<20.

Utilizamos duas frases para definir cada smbolo. Isto ocorreu porque no fizemos uso do ponto-e-vrgula. Este ponto-e-vrgula equivalente conjuno "ou" do Portugus. Usando-o, podemos descobrir que "Pessoa" pertence ao signo de carneiro atravs de uma nica frase:
signo(Pessoa,carneiro):41

aniversrio(Pessoa,data(D,M,_)), (M=maro,D>21);(M=abril,D=<19)

Grosseiramente, esta frase pode receber a seguinte traduo: Uma pessoa do signo de carneiro se o aniversrio dela no dia D do ms M e (M maro e D>=21) ou (M abril e D=<19). Perguntemos agora ao computador qual o signo de Ndia.
?-signo(ndia,Qual). Qual=peixes. yes

Deixamos para o leitor a tarefa de escrever frases para os signos restantes.

PROGRAMAS Em uma frase, o predicado que vem antes do smbolo ":-" denominado cabea e o que vem depois denominado corpo. Seja, por exemplo, a frase abaixo:
humano(H) :-homem(H).

A cabea desta frase "humano(H)" e o corpo "homem(H)". comum dizer que uma frase descreve a declarao de sua cabea. Assim sendo, a frase do exemplo que acabamos de ver descreve a declarao "humano". Aridade pode tanto ser o nmero de objetos em um predicado quanto o nmero de argumentos em uma estrutura. A aridade do predicado "humano(H)" , pois,1. J a aridade de "data(15,maro,1986)" 3. Um conjunto de frases uma definio se todos os predicados que aparecem nas cabeas, descrevem a mesma declarao e possuem a mesma aridade. Por exemplo:
humano(H):-homem(H). humano(M):-mulher(M).

Estas duas frases podem ser consideradas uma definio de humano pois descrevem a mesma declarao ("humano") e possuem a mesma aridade (1) na cabea. Vrias definies que, juntas, permitem ao computador realizar uma dada tarefa formam um programa. As definies de "aniversrio" e de "signo", por exemplo, so partes de um programa visto que elas permitem ao computador descobrir o signo de uma pessoa.

42

LISTAS Listas so seqncias de elementos. Os elementos devem ser colocados entre colchetes e estar separados uns dos outros por vrgula. Alguns exemplos de listas so:
[rosa,cravo,violeta] [laranja,X,abacate] [data(3,maro,1986),data(1,abril,1952)] [[1,2],[4,5]]

Os elementos da primeira destas quatro listas so constantes que representam flores. O segundo elemento da segunda lista uma varivel. Os elementos da terceira lista so estruturas. Finalmente, a quarta lista constituda por outras listas. Em geral, as listas so usadas como objetos de predicados, Exemplo:
partes(manipulador,[brao,punho,efetuador]).

O manipulador a parte do rob utilizada para realizar trabalhos manuais. O segundo objeto do predicado acima constitudo por uma lista contendo as partes de um manipulador tpico. Apenas como curiosidade, o brao e o punho do manipulador tm funes similares s do brao e punho humanos. O efetuador equivalente mo humana. Variveis so muitas vezes usadas para representar elementos desconhecidos e elementos genricos de uma lista. Exemplo:
[P,A,piter]

O primeiro e segundo elementos desta lista so genricos ou desconhecidos e, por isso, esto representados pelas variveis P e A. O terceiro elemento o bem conhecido rob Piter e, por isso, est representado por uma barra vertical seguida de uma varivel. Exemplo:
[rosa,cravo|X]

A barra vertical seguida da varivel X indica que aps o segundo elemento desta lista h uma quantidade ignorada de elementos desconhecidos ou genricos. A barra vertical pode ser traduzida por "resto dos elementos". Isto faz com que [5,9,7|X] seja considerada como a lista cujo primeiro elemento 5, o segundo elemento 9, o terceiro elemento 7 e o resto dos elementos X. Um padro de lista muito importante aquele cujo primeiro elemento uma varivel cujo resto dos elementos tambm uma varivel. Exemplos deste padro so:
[X|Y] [Primeiro|Resto] 43

[Topo|Cauda]

Tais listas representam qualquer lista com pelo menos um elemento. Considere, para fixar idias, o caso de [X|Y]. Esta construo pode estar no lugar da lista [ana] de um nico elemento desde que X represente "ana" e Y represente a lista fazia []. Tambm possvel usar [X| Y] em vez de uma lista com mais de um elemento como o caso de [ 3,4,5 ]. Nestas circunstncias, X representa o resto da lista, a saber, [4,5]. Vamos agora escrever um programa para verificar se um elemento pertence a uma lista genrica qualquer. A primeira frase do dito programa :
pertence(X,[X|Y]).

Esta frase diz que X pertence a uma lista genrica [X|Y]. Isto no deve ser uma surpresa para ningum pois X o primeiro elemento de [X|Y]. E o que fazer se X no for o primeiro elemento da lista? A frase abaixo cuidar deste caso.
pertence(X,[P|R]):pertence (X,R).

Esta frase est fazendo a declarao bvia de que X pertence lista [P|R] se pertencer ao resto dela, isto , se pertencer a R. Testemos o programa com algumas perguntas.
?-pertence(a,[b,c,d,a,f,g]). yes ?-pertence(ana,[rosa,cravo,violeta]). no

Parece que o programinha se saiu bem no primeiro teste. Passemos ao segundo. Peamos ao computador que descubra um elemento que pertena a uma lista,
?-pertence(E,[a,b,c,d]). E=a->; E=b->; E=c->. yes

Observe que a presente questo tem vrias respostas. Teclando ponto-e-vrgula no final de cada uma, fizemos o computador encontrar as trs primeiras. A mquina no encontrou a ltima resposta porque digitamos um ponto final depois da terceira e, desta forma, demos o sinal de que j estvamos satisfeitos.

ARITMTICA Para realizar clculo em PROLOG, lanamos mo de predicados com a declarao "is". Esta declarao infixa e, portanto, deve ser colocada entre dois
44

objetos. O primeiro objeto uma varivel e o segundo uma expresso aritmtica. O efeito de "is" realizar o clculo indicado pela expresso e colocar o valor encontrado na varivel. Para compreender melhor o que foi dito, examinemos a pergunta abaixo e a resposta que ela recebeu.
?-X is 2+5* 9.0/4. 13.25. yes

A expresso "2+5*9.0/4" foi calculada e o valor obtido ficou associado varivel X. O asterisco o smbolo de multiplicao e a barra inclinada indica diviso. A parte decimal de um nmero separada da parte inteira por um ponto e no por uma vrgula. Isto pode ser visto no nmero "13.25". Usemos "is" para escrever a definio de nmero de elementos, que permite encontrar o nmero de elementos de uma lista. No caso de listas vazias, o nmero de elementos 0. Tal coisa pode ser dita com a frase abaixo.
nmero_de_elementos([],0).

Listas genricas com pelo menos um elemento so conforme vimos, representadas por [X|Y]. E o nmero de elementos delas 1 mais o nmero de elementos do resto Y. em PROLOG, isto dito com a frase seguinte:
nmero_de_elementos([X|Y],N):nmero_de_elementos(Y,NY), N is 1+NY.

Experimentemos a definio
?-nmero_de_elementos([a,b,c,d],Num_elms). Num_elms=4. yes

Continuando com exemplos, vejamos a definio de "somatria". Esta definio efetua a soma dos elementos de uma lista de nmeros.
somatria ([],0). somatria([X|Y],S):somatria(Y,SY), S is X+SY.

Novamente a primeira frase trata do caso trivial de listas vazias, para o qual a somatria 0. A segunda frase afirma que a soma dos elementos de [X|Y] S se a soma do resto Y for SY e S valer X+SY. Nada mais bvio. O clculo da mdia dos elementos de uma lista feito pela declarao que se segue.
mdia(Lista,Med):45

nmero_de_elementos(Lista,Num_de_elems), somatria (Lista,S), Med is S/Num_de_elems.

Testemos este programa.


?-mdia([5,4,0,9,4],Mdia). Mdia=5.5. yes

TPICOS COMPLEMENTARES O funtor de uma estrutura deve vir imediatamente antes de abre parnteses. Se este preceito no for observado, o computador recusa a estrutura e emite uma mensagem de erro. Exemplo:
ama (ndia,hadar)

A frase acima inaceitvel porque h espaos entre o funtor e o abre parnteses. Em uma expresso aritmtica, os smbolos +,_,*,/,// representam as operaes de soma, subtrao, multiplicao, diviso fracionria e diviso inteira respectivamente. Deve-se sempre colocar um espao em branco entre estes smbolos e um abre parnteses pois do contrrio o computador no perceberia que eles so infixos. Um exemplo de frmula correta :
?- X is 2+3 * (4-5)/3.0.

Note o espao em branco entre o ' * ' e o '( ' . Agora vejamos uma expresso errada.
?-X is 2+3 *(4-5)/3.0.

Aqui o sinal ' * ' est grudado no parnteses e isto no permitido. A diferena entre // e / que // fornece apenas a parte inteira do resultado da diviso enquanto que / fornece a parte inteira e a parte fracionria. Analisemos o clculo abaixo:
?- X is 6+7/2. X=9->.

X recebeu o valor 9 porque s foi considerado a parte inteira da resposta. Se for preciso que tambm a parte fracionria aparea no resultado, deve-se usar / no lugar de // Exemplo:
?- X is 6+7.0/2. X=9.5->. 46

COMENTRIOS O computador considera tudo que est entre o smbolo /* e */ como sendo comentrio. Tambm considerado comentrio qualquer texto que estiver entre o sinal de percentagem (%) e o fim da linha.

CORTE Algumas vezes preciso impedir que o computador volte atrs em uma deciso tomada. Isto pode ser feito por um predicado que se chama corte e que representado por um ponto de exclamao. Abaixo mostramos esquematicamente como ele usado. <a>:-<b>,...,<c>,!,<d>,<f>,... <a>:-<g>,<h>,<i>,... As letras entre os sinais "<>" esto simbolizando predicados. Se o primeiro comando for aceito at o predicado <c>, o corte no s impedir que seja executada a segunda verso do comando como tambm eliminar a possibilidade de se obter outros valores de <b>...<c>, caso ocorra alguma falha aps o corte. Dessa forma, a escolha de valores para <b>...<c> irreversvel. O bom programador usa parcimoniosamente o corte pois ele limita as opes da mquina, tornando-a mais restrita, menos flexvel e mais dependente da orientao humana. Apesar disto, o ponto de exclamao , de quando em quando, indispensvel para impedir que o programa se enverede por caminhos totalmente divorciados da realidade. Para entender o uso do corte, considere o seguinte programa:
g(X,Y):-pessoa(X), gosta(X,Y). pessoa(maria). pessoa(carlos). gosta(maria,flores). gosta(maria,sorvete). gosta(carlos,carro).

Abaixo mostra uma consulta a essa base:


g(X,Y). X=maria. Y=flores->; X=maria. Y=sorvete->; X=carlos. Y=carro->; 47

no

No entanto, se alterarmos a primeira linha da base para


g(X,Y):-pessoa(X),!, gosta(X,Y).

a consulta seria processada da seguinte forma:


g(X,Y). X=maria. Y=flores->; X=maria. Y=sorvete->; no

O carlos no processado porque o corte impede que o programa retroceda at pessoa(X) para realizar outra valorao. Vamos mostrar agora um exemplo com duas verses do mesmo comando:
fatorial(0,1):-!. fatorial(N,F):- N1 is N-1, fatorial(N1,F1), F is N*F1.

O corte na primeira frase impede o computador de voltar atrs aps t-la escolhido para calcular o fatorial de 0.

UNIFICAO Tomemos o programa seguinte:


humano(X):-homem(X). humano(X):-mulher(X). homem(hadar). mulher(ndia). ama(hadar,ndia).

Sabemos muito bem o que acontece se perguntarmos "?-ama(Quem,ndia)". O programa vai procurar uma resposta atravs de uma frase cuja cabea seja igual pergunta. No caso, tal frase "ama(hadar,ndia)". E o critrio de igualdade utilizado o seguinte: a) Duas constantes so iguais se so escritas da mesma forma.
48

b) Dois nmeros so iguais se representam o mesmo valor. Exemplo: 34 igual a 034. c) Quando uma varvel comparada com um objeto qualquer, ela se torna igual a este objeto. Dizemos ento que a dita varivel est representando o objeto. Variveis livres so aquelas que no esto representando nenhum objeto. d) Duas estruturas so iguais se possuem o mesmo funtor e a mesma aridade. Alm disso, os argumentos devem ser iguais dois a dois. Este critrio denominado unificao. A unificao basicamente uma comparao na qual as variveis podem tornar-se iguais a qualquer objeto. Uma vez que a varivel tornou-se igual a um objeto, ela no pode mais ser igual a outro objeto diferente do primeiro.

READ E WRITE O predicado "write" permite que se escreva o seu argumento na tela do computador. Exemplo:
saudacao(Pessoa):-write(Pessoa),nl.

O predicado "nl" (new line) faz com que o computador passe para linha seguinte. O "write" s trabalha com um argumento por vez. O argumento pode ser um tomo, um nmero, uma varivel ou uma estrutura. Para escrever uma frase, delimitea com o smbolo (') como mostra o exemplo abaixo:
saudacao:-write('ola mundo').

Da mesma forma que o "write" usado para escrever, o "read" usado para ler. Basicamente, a execuo de "read(X)" faz o computador parar e esperar que uma pessoa digite um tomo, um nmero ou uma estrutura. Quando isto ocorrer, o valor digitado posto na varivel que serve de argumento. Exemplo:
dialogo:-nl,nl, write('Qual o seu nome?'),nl, read(N),nl, write('Bom dia, '), write(N),nl.

MTODOS DE BUSCA A pesquisa por solues no ambiente PROLOG feita usando o mtodo de busca em profundidade. Portanto, implementar em PROLOG um algoritmo de busca em profundidade uma tarefa fcil de ser realizada. Abaixo apresentamos um algoritmo de pesquisa em profundidade para o problema de busca de rota utilizado no captulo 2.
49

1 2 3 4 5 6 7 8 9 10 11

voo('Nova Iorque','Chicago',1000). voo('Chicago','Denver',1000). voo('Nova Iorque','Toronto',800). voo('Nova Iorque','Denver',1900). voo('Toronto','Calgary',1500). voo('Toronto','Los Angeles',1800). voo('Toronto','Chicago',500). voo('Denver','Urbana',1000). voo('Denver','Houston',1500). voo('Houston','Los Angeles',1500). voo('Denver','Los Angeles',1000).

12 obtemRota :- write('Entre com o nome do destino: '), read(Dest), buscaRota(Dest,Rota,Dist), imprimeRota(Rota,Dest,Dist). 13 imprimeRota([],_,_):-write('Nao existe rota para 14 imprimeRota(Rota,Dest,Dist):- write('Origem : write('Rota : write(Rota),nl, write('Destino : write(Dest),nl, write('Distancia : essa cidade'),!. Nova Iorque'),nl, '), '), '), write(Dist).

15 buscaRota(Dest,Rota,Dist):calcula('Nova Iorque',Dest,0,Dist,[],Rota). 16 calcula(Origem,Dest,Ant,Dist,Rota,Rotax):voo(Origem,Dest,Y), Dist is Ant +Y, Rotax = Rota. 17 calcula(Origem,Dest,Ant,Dist,Rota,Rotax):voo(Origem,X,Y), ap(Rota,[X],Rotay), Dist1 is Ant + Y, calcula(X,Dest,Dist1,Dist,Rotay,Rotax). 18 ap([],X,X):-!. 19 ap([X|Y],Z,[X|W]):-ap(Y,Z,W).

Apesar do programa ser auto-explicativo, abaixo apresentada uma descrio sucinta dos predicados. Os predicados voo das linhas 1-12 armazenam as conexes existentes. O predicado obtemRota da linha 12 o predicado inicial do programa. Ele obtm do usurio o destino e chama o predicado buscaRota que calcula a rota a partir de Nova Iorque at o destino, devolvendo a rota em forma de lista na varivel Rota e a distncia na varivel Dist. Aps isso, o comando obtemRota executa o predicado imprimeRota para imprimir a rota obtida. O predicado imprimeRota (13-14) possui duas verses: uma para o caso da rota ser uma lista vazia, e nesse caso no existe rota possvel; e outra para o caso da rota no ser uma lista. No primeiro caso, o predicado apenas imprime uma mensagem avisando a inexistncia de rota. No segundo caso, o predicado imprime a rota e a distncia. O predicado buscaRota (15) utilizado apenas para chamar o predicado calculaRota tendo Nova Iorque como origem. O
50

predicado calculaRota (16-17) que efetivamente obtm a rota e possui duas verses: uma para quando acha o destino e outra quando tenta achar uma conexo indireta. No primeiro caso, o predicado apenas soma a distncia anterior com a distncia corrente, resultando a distncia total, e retorna a rota como sendo a rota corrente. No segundo caso, o predicado chama o predicado ap para concatenar a conexo corrente rota, acrescenta a distncia corrente distncia anterior e faz uma chamada recursiva para tentar calcular a rota a partir da conexo corrente. A funo do predicado ap (18-19) apenas concatenar duas listas quaisquer. Ele utilizado na insero de uma nova conexo na lista da rota.

51