61228673 Apostila Prolog 17

download 61228673 Apostila Prolog 17

of 34

description

ok

Transcript of 61228673 Apostila Prolog 17

  • 7/18/2019 61228673 Apostila Prolog 17

    1/34

    ----------------------- Page 1----------------------Universidade Federal de Campina Grande - UFCG Centro de Cincias e Tecnologia - CCT Departamento de Sistemas eComputao - DSC APOSTILA: INTRODUO PROGRAMAO EM LGICA Alexandre de Andrade Bardsc.ufcg.edu.br Joseluce de Farias Cunha [email protected] 34 pginas 2006Av. Aprgio Veloso, 882 docong Caixa Pos tal 10.106 58.109-970 Campina Grande asilFone: 310-1119 Fax: 3 10-1273 ----------------------- Page 2----------------------APOSTILA: INTRODUO PROGRAMAO EM LGICA Alexandre de Andrade Barbosa DepartamentSistemas e Computao E-mail: [email protected] Joseluce de Farias Cunha Departamento de Sistemas e Computao E-mail: [email protected] Av. Aprgio Veloso, 882Bodocong Caixa Postal 10.106 CEP 58109-970 Campina Grande PB Brasil Fone: 310-1119 Fax: 310-1273 (DSC) Resumo Esta apostila foi criada como material de apoio disciplina de Lgica MatemticadocursodeCinciadaComputaodaUniversidadeFederal de Campinrande - UFCG. O contedo apresentado neste material relacionado Programao em Lgiais especicamente linguagem Prolog. NenhumarevisosobreLgicaMatemticaapresentada, im, necessrio que o leitor j possua conhecimento sobre Lgica Proposia cional e Lgde 1 Ordem. Este texto possu nvel introdutrio, uma vezqueconhecimentosavanadossobralinguagemnoseroexplorados na disciplina em questo. Palavras-chave: Programao em l, Prolog, Lgica. PB Br Bo

  • 7/18/2019 61228673 Apostila Prolog 17

    2/34

    1 ----------------------- Page 3----------------------Sumrio 1 Introduo 4 1.1 O que Programao em Lgica/Prolog? . . . . . . . . . . . . . . . . . . . 4 1.2 Como Prolofunciona? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 Implementaes de Prolog 5 3 Sintaxe SWI-Prolog 7 3.1 Os comandos write e read . . . . . .. . . . . . . . . . . . . . . . . . . . . 7 3.2 Comentrios . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 8 4 Utilizando o SWI-Prolog 9 5Fatos, Regras e Consultas 10 5.1 Regras . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 12 5.2 Regras recursivas . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 13 5.3 Como Prolog responde consultas . . . . . . . . . . . . . . . . . . . . . . . . 15 6 Listas 16 6.1 Checagem de pertinncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.2 Concatenao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.3 Adicionando elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6.4 Excluindo elementos . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . 18 7 Aritmtica 19 8 Corte de uxo 21 9 Exemplos 22 10 Exerccios 27

  • 7/18/2019 61228673 Apostila Prolog 17

    3/34

    2 ----------------------- Page 4----------------------Lista de Figuras 1 Tela inicial do SWI-Prolog Editor . . . . . . . . . . . . . . . . . . . . . . . 9 2 rvore genealgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3 Relao descendente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4rvore para a expresso . . . . . . . . . . . . . . . . . . . . . 19 5 Jogo Torre de Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3 ----------------------- Page 5----------------------1 Introduo

    Esta apostila foi criada para apoiar a disciplina Lgica Matemtica, em sua parte nal relacionada Programao em Lgica. O contedo apresentado aqui possui nvel introduuma vez que a disciplina em questo no far uso de recursos avanados da linguagem. Esudos mais avanados sobre a Programao em Lgica devero realizados em disciplinas posiores. O contedo deste texto busca fornecer aspectos mais prticos relacionados lingua gem Prolog, o funcionamento interno da linguagem no ser detalhado neste material. Caso o leitor deseje se aprofundar no estudo da linguagem, recomenda-se a leitura de [1 ], [2], [3] e [4], nos quais este texto baseado. Espera-se que aps aleitura deste material o leitor seja capaz de: compreender e executar programasProlog; modicar programas Prolog; escrever programas Prolog bsicos e intermedirios. 1.1 O que Programao em Lgica/Prolog?

    Existem diversos paradigmas de programao, hoje, o paradigma mais utilizado o paradigma procedural. As linguagens Java, Pascal, C/C++ so ditas linguagens procedurais, pois, nestes programas necessrio implementar um procedimento para resol ver determinado problema. Outro paradigma de programao o paradigma imperativo, que possu

    i a linguagem LISP como sua representante mais famosa. A Programao em Lgica faz parte do paradigma de programao denominado declarativo ou descritivo, nest e, deve-seimplementar uma descrio do problema e no um conjunto de instrues. A linguagem Pro uma representante do paradigma declarativo, esta a repres en-

  • 7/18/2019 61228673 Apostila Prolog 17

    4/34

    tante mais famosa da Programao em Lgica, a qual se baseia no clculo de predicados. rolog foi criada em 1972 por Colmerauer e Roussel, um programa Prolog no possui cdigo para manipular a memria ou realizar desvios condicionais. Isso no signica queProlog seja superior s outras linguagens, pode-se armar apenas que a linguagem mai s adequada para solucionar uma determinada categoria de problemas. Esta categoria diz respeito aos problemas onde necessrio representar algum tipo de conhecimento, por exemplo, em aplicaes que realizem computao simblica, na compreenso de liem natural ou em sistemas especialistas. 1.2 Como Prolog funciona?

    Um programa Prolog constitui-se de uma coleo de fatos (base de dados) e regras (relaes lgicas), esses tens descrevem o domnio de um determinado problema. Esta desco problema avaliada por um interpretador, o qual utilizando um motor de infernciarealiza dedues em busca de concluses vlidas para consultas realizadas pelos usuriAssim, pode-se armar que a computao destes programas equivalente a prova de um teorema em lgica. 4 ----------------------- Page 6----------------------Os fatos deProlog permitem a denio de predicados por meio da declarao de quais tens pertences ao universo (ou domnio) satisfazem os predicados. Por exem plo, pode-se denir opredicado homem(x) e utilizar este para denir quais elementos do u niverso possuem tal predicado, no caso x homem. Vale salientar que responsabilidade do programador manter a denio de um predicado consistente. Por exemplo, poderia ser criadoo predicado come(x,y) para representar que x come y ou y come x, o programador que dever especicar os fatos de maneira consistente. As regras Prolog so descries dpredicados por meio de condicionais. Por exempl o, pode-se denir o predicado pai(x), signicando que x pai, atravs da regra: pai(X) :prole(X,_), homem(X). A regr

    a signica que x pai se x possui ao menos um lho. O usurio interage com o programaatravs de consultas (queries). Por exemplo, s ejam dados os fatos: homem(pedro).homem(joao). mulher(maria). mulher(teresa). o usurio pode realizar a consulta homem(X). e receber as seguintes respostas X=pe dro; X=joao; No, signicando que pedro e joao so homens, o No indica que no existem mais respostas que satisfaam a consulta. As computaes em Prolog utilizam os conceitos de clusulas de horn, resoluo ecadeamento para trs (backtracking), com estes possvel realizar a computao de a mara equivalente a uma deduo em Lgica de 1 ordem.

  • 7/18/2019 61228673 Apostila Prolog 17

    5/34

    Tanto fatos quanto regras so representados atravs de clusulas de horn, ou seja, so mulas que contm predicados ou negao de predicados conectados por disjunes, onde aonos um predicado no uma negao. Quanticadores no so representados explicitamente,a linguagem trata uma regra como se ela estivesse universal mente quanticada. Utilizando a regra de inferncia da particularizao universal repetidas vezes, possvretirar os quanticadores e fazer com que uma varivel assuma qualquer valor do domnio de representao. Para realizar uma deduo Prolog utiliza unicao e a regra de infda resoluo. Assim, duas clusulas do origem a um resolvente quando possuem predicads correspondentes, sendo um positivo (no negado) e outro negativo (negado). Quando o usurio realiza uma consulta o motor de inferncia tenta resolver metas, sendo que u ma meta pode conter submetas, quando no existem mais metas para serem satisfeitas em uma linha de resoluo, o sistema utiliza encadeamento para trs (backtracking) em bus ca de outras respostas possveis. Ao longo desta apostila os conceitos citados sero exemplicados, no entanto, as explicaes fornecidas sobre o funcionamentodestes na linguagem Prolog no sero detalhadas. 2 Implementaes de Prolog

    Diversas implementaes da linguagem Prolog podem ser encontradas, o que para muitosconstitui um problema, pois estas nem sempre so totalmente compatveis. Atualmente,

    5 ----------------------- Page 7----------------------existem verses livres e comerciais criadas para os principais sistemas operaciona is. Algumas das implementaes mais conhecidas so: Win-Prolog [5]- respeita a sintaxede Edinburgo, a implemenao mais prxima do dialeto puro. A verso 4.6, a mais recente, est disponvel apenas

    Windo ws (98, ME, NT, 2k, XP). um sistema comercial, mas possui uma verso para teste s gratuita. OpenProlog[6]-disponvelunicamenteparaMacintosh(MacOS7.5ousuperior). Respeita a sintaxe padro ISO, baseada na sintaxe de Edinburgo. um software gratuito, desde que seu autor seja avisado de sua utilizao. Ciao Prolog [7]- distribudo gratuitamente, possui licena Library General Pub lic License (LGPL). Respeitaa sintaxe padro ISO, pode ser utilizada em diverso s sistemasoperacionais, taiscomo, Windows(98, NT,2k, XP),Linux, SunOS,Solari s, MacOS X, entre outros.

  • 7/18/2019 61228673 Apostila Prolog 17

    6/34

    YAP Prolog [8] - criado pela Universidade do Porto em parceria com a Unive rsidade Federal do Rio de Janeiro. Uma das principais caractersticas desta i mplementao sua velocidade. Respeita a sintaxe padro ISO, tambm compatvel com outras implementde Prolog, tais como, Quintus e SICStus. A verso 5.1. 1 pode ser utilizada em diversas distribuies Linux e Windows. SWIProlog[9]-softwaregratuito, sobalicena Lesser GNU Public License. Pode ser utilizado nas plataformas Windows, Linux e MacOS.Possui diversas ferr amentas de edio grca, tais como, J-Prolog Editor e SWI-Prolog-Editor (recomendado). Permite a utilizao da linguagem Prolog por outras linguagens, tais como, C/C ++ e Java. uma das implementaes mais utilizadas atualmente. SICStus Prolog [10] - um software comercial, mas possui verso gratuita para avaliao. RspeitaasintaxepadroISOepodeserusadanasplataformasWindows (2k e XP), Linux, Solaris 7, MacOS X e algumas distribuies Unix. Assim como o SWI, possui interfaces paracomunicao com outras linguagens, por exemplo, C & C++, .NET, Java, Visual Basic eTcl/Tk. Amzi! Prolog [11] - pode ser utilizado de maneira conjunta a IDE Eclipse, permite tambm comunicao com outras linguagens. Possui distribuies gratuitas e cociais, que podem ser utilizadas em sistemas operacionais diversos, tais como, Windows, Linux, Solaris e HP/UX. Visual Prolog [12] - bastante diferente da verso padro de Prolog, fortemente tipado. Tambm conhecido como PDC Prolog ou Turbo Prolog, possui distribuies gratuitas e comerciais para Windows e Linux. Fornece um ambiente complto p ara programao, porm, um dialeto mais complexo que o original. Outrasdistribuies Prolog conhecidas so: GNU Prolog [13], XSB [14] e Trinc Prol og [15]. Aimplementao utilizada ao longo desta apostila a SWI-Prolog, todo cdigo utilizado os exemplos e exerccios apresentados aqui foram desenvolvidos nesta ve rso de Prolog. 6 ----------------------- Page 8----------------------3 Sintaxe SWI-Prolog

    Assim como todas as linguagens de programao, existem algumas regras que devem serrespeitadas pelo programador. Os dados representados em Prolog podem ser um dosseguintes tipos:

  • 7/18/2019 61228673 Apostila Prolog 17

    7/34

    variveis - devem ser iniciados com letras maisculas ou underscore (_), segui dos de qualquer caractere alfanumrico. Caso uma varivel seja denida apenas com underscore, ela ser considerada uma varivel annima, ou seja, no se deseja sab er seu valor.Ex.: X, Y1, _Nome, ...; no variveis; atmicas; tomos - so constantes expressas atrae palavras. Devem ser inici ados com letra minscula seguida de qualquer caracterealfanumrico. Cas o seja necessrio denir um tomo com letra maiscula ou nmero, deveusar aspas simples. Ex.: joao, `Joo', `16', `Marys', ...; inteiros-qualquernmeroquenocontenhaumponto(.) serconsiderado uminteiro. Caracteres ASCII entreaspasduplassoconsideradosinteir os. Ex.: 1, 6, -3, a (interpretado como 97), ...; nmerosempontoutuante-qualquernmerocomumpontoepelomenos uma casa decimal. Ex.: 5.3 (correto),7.8 (correto), 7. (incorr eto); no atmicas; listas - uma seqencia de elementos orenados. Uma lista declarada entre colchetes e os elementos devem ser separados por vrgula. P ode-se separar a cabea (1o. elemento) do corpo (demais elementos) deum a lista utilizando . Ex.: [ a, b, c], [a 3.1 Os comandos write e read b, c ],... .

    O comando write exibe o valor do parmetro no dispositivo de sada corrente. O dispositivo padro o monitor, assim, o comando write(`Teste de impresso.'). ir exibir a ensagem Teste de impresso. na tela do monitor. O mesmo comando pode ser utilizado para imprimir o valor de qualquer varivel. No entanto, no existe um comando padroProlog para escrita de expresses formatadas. Devido a isso, o SWI-Prolog utilizacomandos de extenso, um deste o comando writef do C-Prolog de Edinburgo. Este comando possui a seguinte sintaxe writef(Formato, Argumentos). Onde as opes para determinar a formatao so: %w - imprime o termo; %d - imprime o termo ignorando seu tip

    o, por exemplo, n impresso como uma string. %s - imprime o termo como uma string; 7 ----------------------- Page 9-----------------------

  • 7/18/2019 61228673 Apostila Prolog 17

    8/34

    %Nc - imprime o termo de modo centralizado numa quantidade N de colunas; %Nl - imprime o termo alinhado esquerda numa quantidade N de colunas; %Nr - imprime o termo alinhado direita numa quantidade N de colunas; Para gerar alguns caracteresdeve se usar seqencias de escape, estas so: n - cria uma nova linha; l - criar umseparador de linha, o resultado igual ao produzido por n; r - retorna ao incio da linha; t - tabulao; % - imprime o smbolo %; nnn - onde n um nmero decimal, prodo caractere ASCII com o cdigo informado. O comando read l um valor no dispositivode entrada corrente e unica (atribui) o valor uma varivel. O dispositivo de entrada padro o teclado, assim, o comando read(X). ir ler um valor do teclado e unicareste valor com a varivel X. 3.2 Comentrios

    Assim como em outras linguagens de programao Prolog possui caracteres, ou seqenciasde caracteres, que identicam um trecho de comentrios. Os comentrios no so levados m considerao pelos interpretadores, porm, so importantes para que outras programadoes possam compreender mais facilmente a codicao de um programa. Em Prolog existemdois tipos de comentrios, estes so identicados pelos smbolos % e /* */. O smbolo % xpressa que tudo aquilo que estiver entre ele e o nal da linha deve ser tratadocomo comentrio. Os smbolos /* */ indicam que tudo que estiv er entre /* e */ ser tratado como comentrio, pode-se observar exemplos de comentrios no trecho de cdigo abaixo: / Descrio dos precidados homem e mulher elementos do universo de representao omem(pedro ). % representa o fato homem(joao ). % representa o fato mulher(maria). % representa o fato mulher( teresa ). % representa o fato sobre . / de que de que de que de que todos os pedro homem. joao homem. maria mulher teresa mulhe.

    Consideraes mais detalhadas sobre a sintaxe, os tipos de dados permitidos e so breoutros comandos podem ser encontrados no manual do SWI-Prolog, disponvel em [16].

    8 ----------------------- Page 10----------------------4 Utilizando o SWI-Prolog

    Aps realizar o download e a instalao do SWI-Prolog e do SWI-Prolog-Editor, inicie

  • 7/18/2019 61228673 Apostila Prolog 17

    9/34

    o editor, ser apresentada a tela deste, a qual deve ser similar a exibida na Figura 1. Pode-se observar que a tela se divide em duas janelas editveis, identicadas na ima gem com os nmeros 1 e 2. A rea 1 corresponde a janela de edio do programa,a rea 2 a janela de interao do usurio com o interpretador. Para que se possa realr qualque r interaocomoprogramaqueestsendoeditadonecessrio, apssalvaroarquivo, clsobre boto de consulta, identicado com o nmero 3. Caso o arquivo seja alterado e oboto no seja acionado o interpretador ir trabalhar com a ltima verso do programa foi consultada. O nmero 4 identica o prompt de comandos, a partir deste que podem ser enviados os comandos para o interpretador. Todo comando enviado para o interpretador deve obrigatoriamente ser nalizado pelo caractere ponto (.). Por ex emplo, o comando ?- write(Teste)no resultar em uma impresso, enquanto o comando ?write(Teste) . resultar na impresso da string `Teste'. O smbolo ?- ser usado nos exempos e exerccios apresentados para representar o prompt de comandos, ele no de ve ser digitado. As outras funcionalidades (e.g. salvar, abrir, debug, ... ) existentes no si stema so similares ou idnticas aes encontradas em diversos sistemas. Mais detalhes de funcionamento do programa podem ser encontradas no manual do sistema. Figura 1: Tela inicial do SWI-Prolog Editor 9 ----------------------- Page 11----------------------5 Fatos, Regras e Consultas

    Como j foi armado, um programa Prolog captura a descrio de um determinado problema.O programador deve implementar um conjunto de fatos e regras relacionados ao problema em questo. Ao longo de toda esta seo sero apresentados alguns fatos, regras consultas Prolog que podem constituir um programa. Para facilitar a explicao destes conceitos ser implementado um programa que descreva as relaes de uma famlia. A

    igura 2 exibe a rvore genealgica de uma famlia, nesta possvel observar que existeiversos tipos de relao, por exemplo, bob pai de pat, pam av de ann, ann irm djim lho de pat, entre outras. Figura 2: rvore genealgica Para se representar estasrelaes em Prolog, inicialmente pode-se criar a relao genitor(x, y), signicando quex genitor de y. Ento, podemos inserir na janela de edio do programa os seguintes ftos: genitor(pam, genitor(tom, genitor(tom, genitor(bob, genitor(bob, genitor(pat , bob). bob). liz ). ann). pat ). jim ).

    Estasclusulasdescrevemtodaainformaosobrearelaogenitor existentenarvore

  • 7/18/2019 61228673 Apostila Prolog 17

    10/34

    apresentada (domnio). Aps a denio desta relao podem ser realizadas consultas no sa, para isso basta clicar no boto de consulta, e digitar perguntas no promp t decomandos, tal como exibido a seguir: 3 ? Yes 4 ? No genitor(pat , jim ). genitor(jim , pat ).

    a consulta rotulada com o nmero 3, retorna a resposta yes (sim), isso ocorre poiso motor de inferncia encontrar o fato correspondente e responder positivamente.J pa ra 10 ----------------------- Page 12----------------------a pergunta rotulada com o nmero 2, a resposta retornada No (no), pois o programa no possui nenhum fto que indique que pat genitora de jim. As consultas apresentadas exemplicam o tipo mais simples de consulta, quando um fato da base j satisfaz a pergunta. Consultas mais interessantes so possveis, por e xemplo, pode-se indagar quem so os genitores de um determinado sujeito, ou quem so os lhos de deste na base de fatos do exemplo. Para isso, pode-se digitar no promp t de comandos as seguintes perguntas: 5 ? X = X = No 6 ? X = X = No 7 ? X = Y = X = Y = X = Y = X = Y = X = Y = X =Y = No genitor(X, bob). pam ; tom ; genitor(bob, X). ann ; pat ; genitor(X,Y). pam bob ; tom bob ; tom liz ; bob ann ; bob pat ; pat jim ;

    a consulta rotulado com o nmero 5, indaga quem so os pais do indivduo bob. Isso ocorre pois X uma varivel, assim, o motor de inferncia realiza substituies sobre estpara encontrar quais fatos da base satisfazem a indagao. O mesmo ocorre na consulta rotulada com o nmero 6, porm, esta indaga quais so os lhos do indivduo bob. A

  • 7/18/2019 61228673 Apostila Prolog 17

    11/34

    consulta rotulada com o nmero 7 exibe pares genitor-lho, observe que o ordem dasrespostas idntica a ordem dos fatos inseridos na base. Os exemplos exibidos at o momento ilustram consultas simples, possvel, por exemplo, realizar consultas sobrefatos que no esto diretamente descritos. Diga-se, por exemplo, que se deseja saber quem so os avs de determinado sujeito, apesar de no existir um fato que determineesta relao pode-se criar uma consulta que realize es ta pergunta. Para isso, pode-se digitar no prompt de comandos a seguinte pergunta: 8 ? genitor(Y, jim) , genitor(X,Y). Y = pat X = bob ; No a consulta pode ser interpretada como Y genitorde jim e X genitor de Y, ou seja, essa consulta busca quem o pai do pai de um sujeito. Note que as clusulas esto separadas por uma vrgula (,), para o SWI-Prolog avrgula representa uma conjuno, enquanto um ponto e vrgula (;) representa uma disjunEnto, uma seqencia de 11 ----------------------- Page 13----------------------clusulas separadas por vrgula s sera satisfeita se e somente se todas as clusulas fo remsatisfeitas. Do mesmo modo, pode-se armar que uma seqencia de clusulas separadaspor ponto e vrgula sera satisfeita se ao menos uma clusula for satisfeita. Umoutroconectivoimportanteanegao. Paraexemplicarautilizaodesteconectivo sero denidos os cados homem(x) e mulher(x), signicando que x homem e x mulher respectivamente. Assim, so denidos os fatos: mulher(pam). homem(tom). homem(bob). mulher( liz ). mulher(pat ). mulher(ann). homem(jim ). aps denidos os fatos, podemos indagar, porexemplo, quem a me de bob, ou seja, deseja-se saber quem o genitor de bob que muher. Para isso, pode-se digitar nop rompt de comandos a seguinte pergunta: 9 ? genitor(X, bob) , mulher(X). X = pam ; No a mesma consulta poderia ser realizadaatravs da seguintes pergunta: 10 ? genitor(X, bob) , not(homem(X)). X = pam ; No5.1 Regras

    Muitas outras consultas podem ser realizadas sobre uma base de fatos, porm, muito

  • 7/18/2019 61228673 Apostila Prolog 17

    12/34

    mais interessante utilizar regras, pois o poder de expresso obtido muito maior. Para exemplicar o uso de regras ser denida a relao prole(y,x), signicando que y prle de x. Esta relao a relao inversa de genitor(x,y), assim, pode-se armar que y e de x se x genitor de y. Para isso, pode-se criar a seguinte regra na janela deedio do programa: prole(Y,X) : genitor(X,Y).

    o smbolo :- pode ser lido como se. A parte da regra a esquerda do smbolo :- denominada de concluso (ou cabea), j a parte a direita deste chamada de condio (ou corAssim, para responder a consulta o interpretador Prolog precisa satisfaz er parte condicional da regra, uma vez que no existem fatos relacionados a prole, para ento obter uma concluso. Para isso, so utilizadas substituies, at que se satisfaae condicional ou no existam mais possibilidades de substituio. Consultas so realizaas sobre regras da mesma maneira como se estas fossem fa tos, por exemplo, paraindagar quem a prole do indivduo tom deve-se digitar no prompt de comandos a seguinte consulta: 11 ? prole(X,tom). 12 ----------------------- Page 14----------------------X = bob ; X = liz ; No para satisfazer a regra o interpretador Prologsubstituiu a varivel X at que encon trou o fato genitor(tom, bob), o qual corresponde a parte condicional da regra prole( Y,X) :- genitor(X,Y), aps as substituies adequadas. Posteriormente foi encontrado o fato genitor(tom, liz), o qual tambm pode satisfazer a regra, nenhuma outra substituio resultou em sucesso. Outras relaes pdem ser denidas para o exemplo. Pode-se denir as relaes mae(x,y) e avos(x,y), apresentadas anteriormente como consultas. Para isso, dev e-se digitar na janela deedio do programa as seguintes regras: mae(X,Y) : avos(X,Z) : genitor(X,Y) , mulher(X). genitor(X,Y) , genitor(Y,Z).

    Um outra relao que pode ser denida a relao irma(x,y), signicando x irm de y. Ndeve-se ter cuidado na denio deste relacionamento, pois, pode-se denir este atravsda seguinte regra: irma(X,Y) : genitor(Z,X) , genitor(Z,Y) , mulher(X).

    porm, esta regra permite uma pessoa seja irm de si mesma, para comprovar isso bast

  • 7/18/2019 61228673 Apostila Prolog 17

    13/34

    a realizar a seguinte consulta: 12 ? Yes irma(pat , pat ).

    o programador deve estar atento a especicaes deste tipo, para descrever corretament e a relao necessrio indicar que x e y precisam ser diferentes, assim a regra coreta seria: irma(X,Y) : genitor(Z,X) , genitor(Z,Y) , mulher(X) , not(X = Y).

    Uma diferena bsica entre uma regra e um fato que um fato sempre uma informao veira, j uma regra precisa ser avaliada para que se possa determinar se esta verdadeira ou no. Regras podem depender diretamente de um fato, como no exemplo anterior ou de outras regras (inclusive dela mesma). Regras denidas em term os de si mesma so chamadas de regras recursivas ou recorrentes, este tipo de regra s er apresentado na seo seguinte. 5.2 Regras recursivas

    A recurso um dos elementos mais importantes da linguagem Prolog, este conceito permite a resoluo de problemas signicativamente complexos de maneira relativamente simples. A construo de uma regra recursiva ser apresentada atravs da denio da relandente(x,y), signicando que y um descendente de x, tal como ilustrado na Figura3. possvel denir esta relao utilizando a relao genitor, assim, uma descendncia ou seja, quando x genitor de y, seria representada com a segu inte regra: descendente(X,Z) : 13 ----------------------- Page 15----------------------Figura 3:Relao descendente. Para outros casos de descendncia, que no uma descendncia diretaoderiam ser utilizadas seguintes regras: descendente(X,Z) : descendente(X,Z) : ... genitor(X,Y) , genitor(Y,Z). genitor(X,Y) , genitor(Y,W) , genitor(W,Z). genitor(X,Z).

    porm, esta soluo seria limitada e trabalhosa. Usando recurso possvel obter uma sm mais simples e completa para a relao de descendncia. Par a isso, necessrio deniseguinte armao x um descendente de z se existe um y, tal que, x seja genitor de ye y seja um descendente de z, a seguinte regra descreve isso: descendente(X,Z): genitor(X,Y) , descendente(Y,Z).

    assim, utilizando as duas regras, pode-se descrever a relao de descendncia de manei

  • 7/18/2019 61228673 Apostila Prolog 17

    14/34

    ra correta. As duas regras so necessrias, pois o uso somente da primeira regra s seria suciente para casos de descendncia direta (equivalente relao genitor), enquanto uso exclusivo da segunda regra levaria a uma busca innita de descendncia. Ento,a regra Prolog para relao de descendncia incorpora as seguintes regras: descendente(X,Z) : descendente(X,Z) : genitor(X,Z). genitor(X,Y) , descendente(Y,Z).

    Pode-se ento realizar consultas na base de exemplo sobre a relao de descendncia, paa isso, basta escrever a seguinte consulta: 13 ? X = bob X = ann X = pat X = jimNo descendente(pam,X). ; ; ; ;

    com isso so exibidos os nomes de todos os descendentes de pam. 14 ----------------------- Page 16----------------------O programa completo que descreve as relaes familiares discutidas nesta seo pode ser observado a seguir: / Programa Prolog sobre relaes familiares . / genitor( pam, bob). % fato genitor( tom, bob). % fato genitor( tom, liz ). % fato genitor( bob, ann). % fato genitor( bob, pat ). % fato genitor( pat , jim ). % fato mulher(pam). % fato mulher( liz ). % fato mulher(pat). % fato mulher(ann). % fato homem(tom). % fato homem(bob). % fato homem(jim ). % fato prole(Y,X) : genitor(X,Y). % regra mae(X,Y) : genitor(X,Y) , mulher(X).% regra avos(X,Z) : genitor(X,Y) , genitor(Y,Z). % regra irma(X,Y) : genitor(Z,X) , genitor(Z,Y) , mulher(X). % regra descendente(X,Z) : genitor(X,Z). % regradescendente(X,Z) : genitor(X,Y) , descendente(Y,Z). % regra recursiva Um conjunto de regras utilizados para descrever uma nica relao , em geral, chamada de procediento (procedure). Assim, as regras relacionadas descendncia, ilustradas no exemplo, podem ser denominadas de procedimento. 5.3 Como Prolog responde consultas

    Uma consulta Prolog sempre um conjunto de metas. Quando uma pergunta feita, Prolog precisa satisfazer todas as metas. Isso, como j armado, equivalente a prova

  • 7/18/2019 61228673 Apostila Prolog 17

    15/34

    r um teorema ou realizar uma deduo. Para isso, Prolog busca vericar se a(s) meta(s) so conseqncias lgicas dos fatos e regras contidos no programa. Para ilustrar o prcedimento executado para responder uma consulta ser utilizado o programa de exemplo, relacionado relacionamentos familiares. Diga-se que a consulta ?- descendente(tom, pat). seja realizada. Sabe-se que descendente(bob, pat) um fato existente no programa. Este fato seria derivado a partir da primeira regra relacionada adescendncia. Alm disso, sabe-se que a regra genitor(t om, bob) um fato. Com isso,e o fato derivado descendente(bob, pat) pode-se concluir descendente(tom, pat)utilizando a segunda regra relacionada descendncia existente no programa. Isso ilustra o que foi utilizado pra realizar a prova, ser apresentado agora como esta prova foi obtida. Prolog encontra uma prova na ordem inversa a forma ilustrada anteriormente. Prolog inicia com uma meta e, utilizando regras, substitui estas metas por novas metas, at que uma meta seja satisfeita por um fato. Assim, feita apergunta descendente(tom, pat), Prolog procede da seguinte ma neira. Para satisfazer esta meta procurada alguma clusula (fato ou regra) da qual a meta possa serdeduzida. Ento, so encontradas as duas regras relacionadas descendncia existentes o programa, pois, a cabea da regra corresponde meta. Como a regra de-

    15 ----------------------- Page 17----------------------scendente(X,Z) :- genitor(X,Z).aparece primeiro, e como a meta atual descendente (tom, pat), as variveisso substitudas, tal como a seguir: X = tom, Z = pat a meta descendente(tom, pat) substituda pela meta genitor(tom, pat). Como no existe umaclusulaondeacabeasejacorresondenteaesta,Prologrealizaumencaminhamento para trs, ou seja, retorna a meta original para tentar encontrar uma maneira alte rnativa de satisfaz-la. Ento, a regra

    descendente(X,Z) :- genitor(X,Y), descendente(Y,Z). ser utilizad a. Mais uma vez,as variveis X e Z sero substitudas por tom e pat respectivamente, porm Y aindanofubstituda. Assim, ametaatualdlugarasmetas genitor(tom,Y), descendente(Y, pat). Prolog deve agora satisfazer a conjuno de metas genitor(tom,Y), descendente(Y, pat),isso feito na ordem em que as metas esto escritas, ou seja, primeiramente P rologir tentar satisfazer genitor(tom,Y). Realizando uma busca por clusulas que satisfaa m

  • 7/18/2019 61228673 Apostila Prolog 17

    16/34

    a meta, Prolog encontra o fato genitor(tom, bob), assim, Y substituda por bob. Com isso, a meta atual descendente(bob, pat). Para satisfazer esta meta a regra descendente(X,Z) :- genitor(X,Z) ser usada novamente. Observe que esta uma nova seqencia de prova, sendo assim, as substituies anteriores no possuem nenhuma relao sta. Com isso, Prolog usa um novo conjunto de variveis, e assim, pode-se reescrever a regra como descendente(X1,Z1) :genitor(X1,Z1). Assim, como a cabea deve corresponder meta, as seguintes substituies so realizadas: X = bob, Z = pat e ento, a mta atual trocada para nova meta genitor(bob, pat). Como esta satisfei ta por umfato presente no programa o procedimento acaba. 6 Listas

    ListassoumdostiposdedadosmaisteisexistentesnalinguagemProlog, diz-sequeuma lista uma seqncia ordenada de uma quantidade qualquer de elementos. Os elementos de uma lista podem ser de qualquer tipo, tais como, nmeros ou tomos. Os elementos contidosem uma lista devem ser separados por vrgulas, e precisa m estar entre colchetes.Por exemplo, uma lista pode conter os nomes dos indivduos do exe mplo da seo anterior, esta lista seria denida como: [pam, liz, pat, ann, tom, bob, jim] Existem dois tipos de listas, as listas vazias e as no vazias. Uma lista vazi a representada por [ ]. Listas no vazias podem ser divididas em duas partes, so elas: cabea - corresponde ao primeiro elemento da lista; cauda - corresponde aos elementos restantes da lista. Por exemplo, para a lista: 16 ----------------------- Page 18----------------------[pam, liz, pat, ann, tom, bob, jim] pam a cabea, enquanto [liz, pat, ann, tom, bob, jim] a cauda. Observe que a cauda uma nova lista, que porsua vez tambm possui cabea e cauda. Assim, pode-se dizer que o ltimo elemento de uma lista possui uma cauda vazia (uma lista vazia). Podese especicar que um elemen

    to de uma lista tambm uma lista, assim, pode-se representar listas tais como: Hobbies1 = [tenis, musica]. Hobbies2 = [sky, comida]. Lista = [ann, Hobbies1, tom,Hobbies2].

  • 7/18/2019 61228673 Apostila Prolog 17

    17/34

    possvel separar as partes de uma lista utilizando uma barra vertical, assim, pode-se escrever Lista = [cabea cauda]. Com isso, possvel determinar as seguintes listas : [a b, c] = [a, b, c]

    possvel realizar uma srie de operaes sobre listas, as sees seguintes exibem algstas aes. 6.1 Checagem de pertinncia

    Para se checar se um determinado elemento pertence uma lista deve-se utilizar arelao member(x,y), que indica se x pertence y, por exemplo: 3 ? Yes 4 ? No 5 ? Yesmember(a, [a,b,c ]). member(a, [[a,b] ,c ]). member([a,b] , [[a,b] ,c ]).

    na consulta rotulada com o nmero 3, a um elemento da lista, uma vez que corresponde cabea desta. J a consulta rotulada com o nmero 4, indica que a no pertence , isso ocorre por que o elemento contido na lista uma outra lista [a,b] e no o tomo a. Isso ilustrado na consulta rotulada com o nmero 5. 6.2 Concatenao

    Pararealizar aconcatenao de listas pode-seutilizar o predicado append(L1,L2,L3).,este predicadoconcatenaalista L1 e L2 exibindooresultadoem L3. OMesmopredicadopode ser utilizado para decompor listas. Para denir a relao de concatenao, necessrtisfazer as seguintes restries: um argumento uma lista vazia - caso algum argumento seja vazio a concatenao resultar na repetio do argumento no vazio; nenhum dos antos vazio - a concatenao resulta na adio de todos os elementos da segunda lista nal da primeira lista. Visto isso, tem-se os exemplos: 17 ----------------------- Page 19----------------------conc([a,b], [], [a,b]) = true conc([a,b], [c,d],

    [a,b,c,d]) = true Para denir esta relao pode-se implementar as seguintes regras: conc ([] , L, L). conc ([X L1] , L2, [X L3]) : conc(L1,L2,L3).

  • 7/18/2019 61228673 Apostila Prolog 17

    18/34

    Denidas as regras, pode-se realizar as seguintes consultas: 6 ? conc ([a,b] , [c] , L). L = [a, b, c] ; No 7 ? conc ([a] , [b, c] , L). L = [a, b, c] ; No As regras denidas tambm podem ser usadas para decompor uma lista em suas componentes.Para checar isso, basta realizar a seguinte consulta: 6 ? L1 = L1 = L1 = L1 = No6.3 conc(L1, L2, [a,b,c ]). [] L2 = [a, b, c] ; [a] L2 = [b, c] ; [a, b] L2 = [c] ; [a, b, c] L2 = [] ; Adicionando elementos

    A adio de um elemento uma lista pode ser denida de modo simples. Para isso, bastainserir o elemento no incio da lista, esta relao denida atravs da seguinte regra:sere (X, L, [X L]). com isso, pode-se realizar as seguintes inseres: 7 ? insere (a, [b,c] , L). L = [a, b, c] ; No 8 ? insere ([1 ,2] , 3, L). L = [[1 , 2] 3] ; No 6.4 Excluindo elementos

    A excluso de um elemento pode ser implementada atravs das seguintes regras: exclui(X, [X exclui (X, [Y Tail ] , Tail ). Tail ] , [Y Tail1 ]) : exclui (X, Tail ,Tail1 ).

    a primeira regra utilizada quando o elemento que se deseja excluir corresponde cabea da lista. J a segunda regra exclui um elemento que pertence a cauda da lista. V ale 18 ----------------------- Page 20----------------------salientar que esta implementao no exclui todos os elementos existentes na lista que correspondam aoelemento passado como argumento. Denidas as regras podem ser realizadas as seguintes consultas: 9 ? exclui (a, [a,b,c] , L). L = [b, c] ; No

  • 7/18/2019 61228673 Apostila Prolog 17

    19/34

    10 ? L = [a, No 11 ? L = [a, L = [a, No

    exclui (b, [a,b,c] , L). c] ; exclui (c , [a,c ,b,c] , L). b, c] ; c , b] ;

    Existem diversas outras operaes nativas de Prolog, um exerccio interessante ser iarealizaraimplementaodealgumasoperaes. Pode-se, porexemplo, criarumaoperao para chse uma lista est contida em outra ou uma operao para realizar permutao dos element7 Aritmtica

    Geralmente, quandoseescreveumaexpressomatemticaanotaoinxautilizada, por exemplo , e e so argumentos e e so operadores. Em Prolog uma expresso representada internamete como uma rvore, assim a expresso anterior seria representada pela rvore da Figura 4. Uma maneira de representar em Prolog a expre sso em questo utiliza notao prexaa expresso seria representada como . Porm, por ser mais usual a representao inxa tmbm compreendida pela linguagem. Figura 4: rvore para a expresso Prolog possui dendos operadores para as quatro operaes: , para realizar soma, subtrao, multiplicaoviso, respectivamente. Para se obter o resultado de uma operao necessrio utilizaroperador is, tal como ilustrado nas consultas abaix o: 3 ? X = No 4 ? X = No 5 ?X is 2 + 3. 5 ; X is 4 3 ; X is 2 19 ----------------------- Page 21----------------------X = 10 ; No 6 ? X is 9 / 2. X = 4.5 ; No Para o SWI-Prolog a operao representa uma diviso real, para se obter uma diviso inteira deve-se usar o operador. A precedncia de operaes aritmticas em Prologamesmaprecednciaadotadanamatemticaquandonecessriodevemser utilizados parnteses para descrever uma expresso corretamente. Alguns dos operador es reconhecidos so: mod - para obter o resto da diviso; -

    para potenciao; 1. 5.

  • 7/18/2019 61228673 Apostila Prolog 17

    20/34

    cos - funo cosseno; sin - funo seno; tan - funo tangente; exp - exponencial; ln -ritmo natural; log - logaritmo; sqrt - raiz quadrada. Existem tambm operaes de converso, algumas so automticas outras precisam ser explicitamente solicitadas. Um exemplo de converso automtica ocorre quando um nmero inteiro relacionado em uma exprescom nmeros de ponto utuante, automaticamente os inteiros so convertidos para nmeros nmeros de ponto utuante. Algumas converses explcitas nativas so: integer(X) - conerte X para inteiro; oat(X) - converte X para ponto utuante. Prolog tambm possuioperaes para comparao, os operadores so: - maior que; - menor que; - maior ou igua- menor ou igual; - igual; - diferente. 20 ----------------------- Page 22---------------------- importante explicitar a diferena entre os operadores e , o primeiro operador verica se dois objetos so iguais, enquanto o segundo verica se o resultado da operao igual. Isso ca mais claro atravs das consultas: 18 ? No 19 ? Yes 2? A = 2 B = 1 No 8 1 + 2 = 2 + 1. 1 + 2 =:= 2 + 1. 1 + A = B + 2. ; Corte de uxo

  • 7/18/2019 61228673 Apostila Prolog 17

    21/34

    A ordem das clusulas em um programa e a ordem de denio de uma regra podem determinar o uxo de execuo de um programa. Esta seo apresenta um elemento para controle do uo denominado de corte, representado por !. A principal funo do corte melhorar a ecincia de um programa. Como j foi apresentado, Prolog utiliza encadeamento para trssempre que necessrio para satisf azer uma meta. Porm, muitas vezes, a utilizao de ecadeamento para trs causa uma busca desnecessria, levando a inecincia. Para estes casos o uso do mecanismo de cor te extremamente til. Para apresentar o corte ser utilizado o seguinte exemplo: Sejam dados dois nme ros e , desejado saber qual o valor mximo destes. As seguintes regras descrevem a relao maximo(x,y), signicando quex o mximo valor se x maior ou igual a y, y o maior valor se y maior que x: mao(X,Y,X) : maximo(X,Y,Y) : X >= Y. X < Y.

    estas regras computam a relao de maneira correta, porm, elas so exclusivas, ou sejaquando a primeira obtm sucesso a segunda ir falhar. Porm, Prolog sempre executa asduas regras, utilizando encadeamento para trs, o que para esta relao resulta apenas em inecincia. A mesma relao pode ser obtida, porm, sem gerar processamento ineciete utilizando corte. Para isso, as regras seriam escritas como: maximo(X,Y,X) :maximo(X,Y,Y) : X >= Y, !. X < Y.

    com isso, caso a primeira regra obtenha sucesso a segunda regra no ser executada.A execuo do programa com corte no altera o resultado deste, o corte apenas evita que sejam realizadas buscas desnecessrias. No entanto, o uso do corte exige muito mais ateno do programador. Isso ocorre pois um programa sem cortes pode ter a ordemde suas clusulas e regras modicadas sem alterar o signicado do mesmo. Por sua ve

    z, um programa que possua cortes pode ter seu signicado alterado caso suas clusulas sejam reordenadas. O seguinte exemplo ilustr a estas armaes. Sejam dadas as regras: 21 ----------------------- Page 23----------------------p : p : a, b. c.

    o signicado lgico das regras pode ser interpretado pela frmula: . Com esta frmula podemos modicar a ordem das clusulas e seu signicado no ser alterado. Porm, caso sejutilizado corte, tal como nas seguintes regras: p : p : a, ! , b. c. .

    o signicado lgico das regras pode ser interpretado pela frmula:

  • 7/18/2019 61228673 Apostila Prolog 17

    22/34

    Com esta, caso a ordem das regras seja alterada para: p : p : c. a, ! , b.

    o signicado lgico das regras pode ser pela frmula: . Assim, pode-se armar que o corte um mecanismo til, porm, deve ser utilizado com cuidado. 9 Exemplos

    Uma das melhores formas de se aprender uma nova linguagem de programao observandoo cdigo de programas. Esta seo apresenta alguns programas escritos em Prolog, o nvede complexidade destes programas ser crescente, no que diz respeito aos con ceitos utilizados. Uma boa atividade para o leitor seria realizar algumas modicaes ouextenses sobre os programas apresentados. Exemplo 9.1. Exemplo Descrio: O exemplo clssico para determinar que se todo homem mortal e se Scrates um homem, ento Scrmortal. Essas armaes podem ser representadas atravs das frmulas:

    a partir destas pode-se concluir:

    O programa Prolog que descreve estas relaes pode ser representado como a segui r.Cdigo: mortal(X) : % Todos os homens so mortais homem(X), writef (`%w%w%w', [ `Sim, ', X, ` mortal ']). homem( socrates ). % Scrates um homem Consulta: 22 ----------------------- Page 24----------------------? mortal( socrates ). Sim, socrates mortal Yes

    Exemplo 9.2. Exemplo Descrio: Dado um conjunto de animais determinar a cadeia alimentar de um animal qualquer.

  • 7/18/2019 61228673 Apostila Prolog 17

    23/34

    O programa Prolog que descreve estas relaes pode ser representado como a segui r.Cdigo: animal(urso ). animal(peixe ). animal(peixinho ). animal(guaxinim ). animal(raposa ). animal(coelho ). animal(veado ). animal( lince ). planta(alga ). planta(grama). come(urso , peixe ). come(peixe , peixinho ). come(peixinho , alga ). come(guaxinim , peixe ). come(urso , guaxinim ). come(urso , raposa ). come(raposa , coelho ). come(coelho , grama). come(urso , veado ). come(veado , grama).come(lince , veado ). cadeiaalimentar(X, Z) : come(X, Z). cadeiaalimentar(X, Z): come(X, Y), cadeiaalimentar(Y, Z). Consulta: ? Y Y Y Y Y Y Y Y = = = = = = == cadeiaalimentar(urso , Y). peixe ; guaxinim ; raposa ; veado ; peixinho ; alga; peixe ; peixinho ; 23 ----------------------- Page 25----------------------Y= Y = Y = Y = No alga ; coelho ; grama ; grama ;

    A repetio de elementos ocorre, pois, um urso come um animal z diretamente e co mealgum animal y que come z. Ento, a cada vez que um animal aparece na cadeia alime

  • 7/18/2019 61228673 Apostila Prolog 17

    24/34

    ntar de um urso ele ser exibido. Exemplo 9.3. Exemplo Descrio: Implementar um cdigopara solucionar o jogo Torre de Hanoi, com n peas. O jogo formado por uma base contendo trs pinos, em um destes pinos esto dispostos sete discos uns sobre os outros, em ordem crescente de dimetro, de cima para baixo, tal como ilustrado na Figura 5(a). O problema consiste em passar todos os discos de um pino para outro qualquer, usando um dos pinos como auxiliar, de maneira qu e um disco maior nunca que em cima de outro menor em nenhuma situao. O nmero de discos pode variar sendo queo mais simples contm apenas trs. A Figura 5(a) ilustr a um possvel estado iniciale a Figura 5(b) ilustra um possvel estado nal para o esta do inicial exibido. (a)Estado inicial para o jogo torre de hanoi. (b) Estado nal para o jogo torre dehanoi. Figura 5: Jogo Torre de Hanoi Um programa Prolog que fornece solues para ojogo descrito pode ser implementa do como a seguir. Cdigo: hanoi(N) : move(N, esquerdo , central , direito ). move(0, _, _, _) : !. move(N, A, B, C) : M is N1, move(M, A, C, B) , inform(A, B) , move(M, C, B, A). inform(X, Y) : writef (`%w%w%w%w', [ `Mova o disco do pino ', X, ` para o pino ', Y ]) , nl. Consulta: ? hanoi (3). Mova o disco do pino esquerdo para o pino central 24 ----------------------- Page 26----------------------Mova Mova Mova Mova Mova Mova o o o o o o discodisco disco disco disco disco do do do do do do pino pino pino pino pino pino esquerdo central esquerdo direito direito esquerdo para o para o para o para o para o para o pino pino pino pino pino pino direito direito central esquerdo central central

  • 7/18/2019 61228673 Apostila Prolog 17

    25/34

    Yes Para visualizar a soluo procure uma verso do jogo na internet, porm, o cdigo iementado considera que o estado inicial do jogo contm todos os discos no pino daesquerda, enquanto alguns verses disponveis na internet aceitam outras conguraes. Eemplo 9.4. Exemplo Descrio: O bubble sort, o mais simples algoritmo de ordenao. Ogoritmo consiste em percorrer um vetor vrias vezes, em cada iterao o menor ou o maior elemento colocado em sua posio correta no vetor. O programa Prolog que implementa este algoritmo o exibido a seguir. Cdigo: bubblesort (Lista_In , Lista_Out) :append(L_Front, [A, B Rest ] , Lista_In) , % Lista_In = [A + B Rest ] B < A,! ,% checa se B menor que A append(L_Front, [B, A Rest ] , L_Rest), % L_Rest = [B +A Rest ] bubblesort (L_Rest, Lista_Out ). % utiliza e regra recurs ivamente bubblesort (Lista , Lista ). % Lista j est ordenada Consulta: ? bubblesort ([2 ,3 ,1,7 ,5 ,4] , L). L = [1 , 2, 3, 4, 5, 7] ; No

    Exemplo 9.5. Exemplo Descrio: Dada uma lista de elementos, determine se ela um paldromo ou no. Um palndromo uma palavra ou nmero cuja leitura a mesma, quer se faesquerda para a direita, quer se faa da direita para a esquerda; Cdigo: palindrome([]). palindrome ([_]). palindrome ([F R]) : append(S,[F] ,R) , palindrome(S).Consulta: ? Yes ? palindrome ([m,a,a]). 25 ----------------------- Page 27----------------------No ? palindrome ([s ,o,c ,o,r ,r ,a,m,m,e,e,m,m,a,r ,r ,o,c ,o,s ]). palindrome ([m,a,m]).

  • 7/18/2019 61228673 Apostila Prolog 17

    26/34

    Yes

    Exemplo 9.6. Exemplo Descrio: Mximo Divisor Comum (M.D.C.). Dados dois inteiros positivos A e B, o eu mximo divisor comum, C, o maior nmero que divide A e B sem deixar resto. Para encontrar o m.d.c de dois nmeros necessrio trabalhar com trs casos,so eles: se A=B, ento, C=A ou B; se A < B, ento, C igual ao maior divisor comum deA e B - A; se A > B, ento, C igual ao maior divisor comum de B e A - B. Um programa Prolog que que implementa m.d.c pode ser representado como a seg uir. Cdigo: mdc(A, A, A). A < B, Temp is B mdc(A, Temp, mdc(A, B, C) : A > B, Temp is A mdc(Temp, B, Consulta: ? C = No ? C = No mdc(12, 18, C). 6 ; mdc(4,4,C). 4 ; mdc(A, B, C) : A, C). B, C).

    Exemplo 9.7. Exemplo Descrio: Clculo de fatorial. Implementar um programa Prolog que realize o clculo do fatorial de um nmero. Cdigo: fatorial (0 ,1). fatorial (N,F): N>0, N1 is N1, factorial (N1,F1), F is N F1. 26 ----------------------- Page 28----------------------Consulta:

  • 7/18/2019 61228673 Apostila Prolog 17

    27/34

    ? W = No ? X = No

    fatorial (3,W). 6 ; fatorial (4, X). 24 ;

    Exemplo 9.8. Exemplo Descrio: Implementar um programa que determina se um determinado dia faz parte de um dia da semana ou nal de semana. Note que a determinao de uma categoria j exclui a possibilidade de que o elemento pertena a outra categoria,ou seja, no ex iste um dia que seja semana e nal de semana. Cdigo: semana(segunda). semana(terca ). semana(quarta ). semana(quinta ). semana(sexta ). fimdesemana(sabado ). fimdesemana(domingo). categoria (X) : fimdesemana(X) , writef (`%w%w', [X, ` um final de semana. ']) , !. categoria (X) : semana(X) , writef (`%w%w', [X, ` um dia de semana. ']) , !. Consulta: ? categoria segunda um Yes. ? categoria domingo um Yes. (segunda ). dia de semana. (domingo). final de semana.

    10

    Exerccios

    As questes 10.1 at 10.4 so relacionadas ao programa Prolog apresentado a seguir: genitor( pam, bob). genitor( tom, bob). genitor( tom, liz ). 27 ----------------------- Page 29-----------------------

  • 7/18/2019 61228673 Apostila Prolog 17

    28/34

    genitor( bob, ann). genitor( bob, pat ). genitor( pat , jim ). mulher(pam). mulher( liz ). mulher(pat ). mulher(ann). homem(tom). homem(bob). homem(jim ). prole(Y,X) : genitor(X,Y). mae(X,Y) : genitor(X,Y) , mulher(X). avos(X,Z) : genitor(X,Y) , genitor(Y,Z). irma(X,Y) : genitor(Z,X) , genitor(Z,Y) , mulher(X) , not(X= Y). descendente(X,Z) : genitor(X,Z). descendente(X,Z) : genitor(X,Y) , descendente(Y,Z). Exerccio 10.1. Quais as respostas para as seguintes consultas? 1. ?- genitor(X, jim). 2. ?- genitor(jim, X). 3. ?- genitor(pam, X), genitor(X, pat). 4. ?- genitor(pam, X), genitor(X, Y), genitor(Y, jim). Exerccio 10.2. Formule consultas para descobrir: 1. Quem so os pais de Pat? 2. Liz possui lhos? 3. Quem o avde Pat? 4. Quem a me de Jim? 5. Quem o irmo de Bob? 6. Quem a irm de Pat? Exer0.3. Formule regras para as seguintes relaes: 1. tio(a); 2. irmo; 3. avs paternos; . avs maternos; 5. ascendente (o inverso de descendente); 6. primo(a), insira novos fatos para realizar consultas sobre esta relao. 28 ----------------------- Page30-----------------------

  • 7/18/2019 61228673 Apostila Prolog 17

    29/34

    Exerccio 10.4. Em quais das seguintes consultas Prolog utiliza encadeamento paratrs? 1. ?- genitor(pam, bob). 2. ?- mae(pam, bob). 3. ?- avos(pam, ann). 4. ?- avos(bob, jim). Exerccio 10.5. Considere as seguintes premissas: Todos os animais tmpele. Peixe um tipo de animal, pssaros so outro tipo e mamferos so um terceiro t. Normalmente, os peixes tm nadadeiras e podem nadar, enquanto os pssaros tm asas epodem voar. Se por um lado os pssaros e os peixes pem ovos, os mamferos no pem. Era tubares sejam peixes, eles no pem ovos, seus lhotes nascem j formados. Salmo tro tipo de peixe, e considerado uma delcia. O canrio um pssaro amarelo. Uma aveuz um tipo de pssaro grande que no voa, apenas anda. Os mamferos normalmente andampara se mover, como por exemplo uma vaca. As vacas do leite, mas tambm servem elasmesmas de comida (carne). Contudo, nem todos os mamferos andam para se mover. Por exemplo, o morcego voa. Considere ainda que existem os seguinte animais: 1. Piupiu, que um canrio. 2. Nemo, que um peixe. 3. Tutu, que um tubaro. 4. Mimosa, uma vaca. 5. Vamp, que um morcego. 6. Xica, que uma avestruz. 7. Alfred, que usalmo. Dena fatos e regras Prolog que representam as premissas acima, e formulecons ultas Prolog para responder s seguintes perguntas: 1. O piupiu voa? 2. Quala cor do piupiu? 3. A Xica voa? 4. A Xica tem asas? 5. O Vamp voa? Tem asas? Poem ovos? 6. Quais os nomes dos animais que pem ovos? 7. Quais os nomes dos animaisque so comestveis? 29 ----------------------- Page 31-----------------------

  • 7/18/2019 61228673 Apostila Prolog 17

    30/34

    8. Quais os nomes dos animais que se movem andando? 9. Quais os nomes dos animais que se movem nadando mas no pem ovos? As questes 10.6 at 10.8 so relacionadas aoograma Prolog apresentado a seguir : animal(urso ). animal(peixe ). animal(peixinho ). animal(guaxinim ). animal(raposa ). animal(coelho ). animal(veado ). animal( lince ). planta(alga ). planta(grama). come(urso , peixe ). come(peixe , peixinho ). come(peixinho , alga ). come(guaxinim , peixe ). come(urso , guaxinim ). come(urso , raposa ). come(raposa , coelho ). come(coelho , grama). come(urso, veado ). come(veado , grama). come(lince , veado ). presa(X) : come(_, X) , animal(X).

    Exerccio 10.6. Quais as respostas para as seguintes consultas? 1. ?- come(urso, peixinho). 2. ?- come(raposa, coelho). 3. ?- come(guaxinim, X). 4. ?- come(X, grama). 5. ?- come(urso, X), come(X, coelho). 6. ?- presa(X), not(come(raposa, X)).Exerccio 10.7. Formule regras para as seguintes relaes: 1. herbvoro; 2. carnvoro.erccio10.8. Utilizandoaregrada questo anterior, elaboreconsultasparaas seguintes perguntas: 1. Quais animais so herbvoros? 30

  • 7/18/2019 61228673 Apostila Prolog 17

    31/34

    ----------------------- Page 32----------------------2. Quais animais so carnvoros? 3. Quais animais herbvoros so presas de uma raposa? Exerccio 10.9. Elabore um programa Prolog que fornea o nome da capital de qualquer estado brasileiro. Exerccio10.10. Implemente um programa para determinar quais tipos sanguneos podem doar/receber sangue de quais tipos. A tabela seguinte fornece a informao neces sria para aimplementao. A Doa/Recebe Recebe Doa Tabela 1: Tipos sanguneos. B AB Doa Doa/Recebe Doa Recebe Doa/Recebe Doa Doa O Recebe Recebe Recebe Doa/Recebe

    A B AB O

    Exerccio 10.11. Dena: 1. um predicado que fornea a interseco de duas listas; 2. um redicado que identique se um conjunto de elementos est contido em uma li sta; 3.dois predicados que identiquem se uma lista possui tamanho par ou mpar; 4. um predicado que escreva uma lista em ordem inversa. Dica: utilize concate nao; 5. um predicado que retorne o maior valor contido em uma lista numrica; 6. um predicado para obter a soma dos N primeiros nmeros naturais. Exerccio10.12. Implementeum programaque retornea N-sima potnciadeum nmero. Exerccio 10.13. As regras abaixo identicm se um nmero positivo, negativo ou zero. Dena regras que realizem o mesmo procedimento, porm, de maneira mais eciente. Dica: utilize cortes. checagem(N, positivo) : checagem(0, zero ). checagem(N, negativo) : N > 0. N < 0.

    Exerccio 10.14. Implemente um programa que classique se uma pessoa considerada: criana (idade

  • 7/18/2019 61228673 Apostila Prolog 17

    32/34

    31 ----------------------- Page 33----------------------Exerccio 10.16. Um estudante acostumado a usar linguagens procedimentais est desenvolvendo um compilador em Prolog. Uma das tarefas consiste em traduzir um cdig o de erro para uma pseudo-descrio em portugus. O cdigo por ele usado : traduza(Codigo , Significado): traduzodigo , Significado): traduza(Codigo , Significado): Codigo=1, Significado=integer_overflow . Codigo=2, Significado=divisao_por_zero . Codigo=3, Significado=id_desconhecido .

    O cdigo funciona, porm, pode ser implementado de outra maneira (mais descritiva emenos procedimental). Melhore o cdigo. 32 ----------------------- Page 34----------------------Referncias [1] Ivan Bratko. Prolog Programming for Articial Intelligence. Addison-Wesley, 1 986. [2] L. Sterling e E. Shapiro. The Art of Prolog. MIT Press, 1986. [3] Marco Antnio Casanova, Fernando Giorno, and Antnio L. Furtado.Programao em lgica e a linguagem Prolog. Edgar Blucher, 1987. [4] Judith L. Gersting. Fundamentos matemticos para Cincia da Computao. LTC, 2001. [5] Logic ProgrammAssociates. Logic Programming Associates. www.lpa.co.uk /, 2006. [6] Mike Brady. Open Prolog Home Page. www.cs.tcd.ie/open-prolog/, 2006. [7] The Computationallogic, Languages, Implementation, and Parallelism Laboratory. The Ciao Prolog Development System WWW Site. www.clip.dia..upm.es/Software/Ciao, 2006. [8] LIACC-Universidade do Porto and COPPE Sistemas-UFRJ. Yet Another Prolog. www.ncc.up.pt/ vsc/Yap, 2006. [9] Jan Wielemaker. What is SWI-Prolog? www.swi-prolog.org/, 2006. [10] Swedish Institute of Computer Science. SICStus Prolog. www.sics.se/sicstus/ , 2006. [11] Amzi! Inc. AMZI! www.amzi.com/, 2006. [12] Prolog DevelopmentCenter. Visual Prolog. www.visual-prolog.com/, 2006. [13] Daniel Diaz. The GNU P

    rolog web site. gnu-prolog.inria.fr, 2003. [14] Stony Brook University. Welcometo the home of XSB! xsb.sourceforge.net/, 2

  • 7/18/2019 61228673 Apostila Prolog 17

    33/34

    006. [15] TRINC. Trinc Prolog R3a. www.trinc-prolog.com, 2006. [16] University of Amsterdam. SWI-Prolog anual. gollem.science.uva.nl/SWI-Prolog/Manual/, 2006. 33 5.6.17 Reference M

  • 7/18/2019 61228673 Apostila Prolog 17

    34/34