Programao em Lgica Programas em Lgica Prolog Tcnicas

  • Slides: 63
Download presentation
Programação em Lógica • Programas em Lógica • Prolog • Técnicas de programação Gabriel

Programação em Lógica • Programas em Lógica • Prolog • Técnicas de programação Gabriel David FEUP - Rua dos Bragas, 4099 Porto Codex - PORTUGAL Tel. 351 -2 -2041842 - Fax: 351 -2 -2059280 Email: gtd@fe. up. pt URL: http: //www. fe. up. pt 1

Lógica e computadores m Lógica q q q m linguagem precisa para a expressão

Lógica e computadores m Lógica q q q m linguagem precisa para a expressão dos objectivos, conhecimento e assunções fundamento para a dedução de consequências a partir de premissas limitada apenas pela capacidade humana de raciocínio Computadores q q q também requerem uma formulação precisa de objectivos e assunções dificuldades iniciais de construção desenho da linguagem de instrução das máquinas dominada pelo hardware seguiram-se linguagens cada vez mais abstractas, mas essencialmente baseadas na arquitectura de von Neumann 2

Paradigma m Programação em Lógica q q m derivada de um modelo abstracto, natural

Paradigma m Programação em Lógica q q m derivada de um modelo abstracto, natural para o raciocínio humano, independente de máquinas concretas exprimir o conhecimento relevante e as assunções como axiomas lógicos; formalizar o problema como uma expressão lógica a ser provada a partir dos axiomas Exemplo - conhecimento (dois axiomas): 1 humano(Sócrates) 2 x humano(X) mortal(X) m problema mortal(Sócrates)? m Sim! É uma consequência lógica dos axiomas q eliminação do universal e modus ponens 3

Fundamento m 1965 Robinson: Princípio da Resolução q m Cláusula de Horn q m

Fundamento m 1965 Robinson: Princípio da Resolução q m Cláusula de Horn q m m A se B 1, B 2, . . . , Bn Leitura declarativa q m base matemática das provas desenvolvida no contexto dos sistemas de demonstração de teoremas A é verdadeiro se todos os Bi's forem verdadeiros Conhecimento: conjunto de cláusulas de Horn Sistema de inferência q q prova construtiva de um golo a partir dos axiomas só baseada no algoritmo da unificação e no princípio da resolução 4

Origens m 1970's Kowalski: leitura procedimental da cláusula de Horn: q q m 1970's

Origens m 1970's Kowalski: leitura procedimental da cláusula de Horn: q q m 1970's Colmerauer (Marselha): implementação q m sistema demonstrador de teoremas chamado Prolog (Programmation en Logique) 1978/79 Edinburgo q m para resolver/executar A, resolver/executar B 1 e B 2 e. . . Bn A é visto como a cabeça de um procedimento e os Bi's o corpo primeiras implementações eficientes de Prolog; estabelecimento de um estilo 1981 projecto japonês da Quinta Geração de Computadores q construir máquinas para executar directamente Prolog 5

Programa em Lógica m m Programa em Lógica - conjunto de axiomas ou regras

Programa em Lógica m m Programa em Lógica - conjunto de axiomas ou regras (cláusulas de Horn) que definem relações entre objectos Computação - dedução de consequências do programa Significado do programa - conjunto de consequências definido pelo programa Arte da Programação em Lógica - construir programas concisos e elegantes, que tenham o significado pretendido 6

Factos m m relação ou predicado objectos ou indivíduos facto interpretação gosta joao, maria

Factos m m relação ou predicado objectos ou indivíduos facto interpretação gosta joao, maria gosta( joao, maria ). O João gosta da Maria. Notas: q nada se diz sobre o recíproco q nomes de predicados e de objectos começam com minúscula (átomos) q predicados primeiro, objectos em lista ordenada q ponto final A interpretação é convencional, mas essencial para a compreensão da formulação do problema. 7

Programas simples Um conjunto de factos é um programa situação. Família ø descreve uma

Programas simples Um conjunto de factos é um programa situação. Família ø descreve uma pai( terach, abraao ). macho( terach ). pai( terach, nachor ). macho( abraao ). pai( terach, haran ). macho( nachor ). pai( abraao, isaac ). macho( haran ). pai( haran, lot ). macho( isaac ). pai( haran, milcah ). macho( lot ). pai( isaac, jacob ). macho( jacob ). pai( haran, yiscah ). femea( sara ). Soma soma( 0, 0, 0 ). soma( 0, 1, 1 ). soma( 0, 2, 2 ); soma( 1, 0 , 1 ). soma( 1, 1, 2 ). 8

Perguntas m pergunta ou golo (goal) q m sintacticamente semelhante a um facto gosta(

Perguntas m pergunta ou golo (goal) q m sintacticamente semelhante a um facto gosta( joao, maria )? ou ? - gosta( joao, maria ) sistema responde 'yes' se existir no programa o facto gosta( joao, maria ). Um facto G. afirma que o golo G é verdadeiro. Uma pergunta G? interroga se o golo é verdadeiro. 9

Regra de dedução 1: identidade q Um golo é verdadeiro relativamente a um programa,

Regra de dedução 1: identidade q Um golo é verdadeiro relativamente a um programa, se for uma sua consequência lógica. Regra da identidade: de G deduzir G q Uma pergunta é uma consequência lógica de um facto idêntico. q Operacionalmente: procurar um facto no programa que seja idêntico à pergunta. programa conclusão pai( abraao, isaac ). pai( haran, lot ). … femea( sara ). femea(abraao) femea( milcah ). americano( clinton ) femea( yiscah ). 10

Respostas negativas Ex: (programa da Família) pai( abraao, isaac )? yes femea(abraao )? no

Respostas negativas Ex: (programa da Família) pai( abraao, isaac )? yes femea(abraao )? no americano( clinton )? no q q Resposta 'no' - significa que o golo não é consequência lógica do programa, mas nada diz sobre a sua veracidade. possível interpretação de 'no': • tanto quanto sei, não, i. e, • não consegui provar o golo com os factos de que disponho. 11

Programas para quê? Realidade Programa A se B. C se A. B. computação Conclusões

Programas para quê? Realidade Programa A se B. C se A. B. computação Conclusões A, B, C 12

Interpretação m m indivíduos — constantes e termos afirmações — factos e golos q

Interpretação m m indivíduos — constantes e termos afirmações — factos e golos q m relacionam indivíduos; são verdadeiras ou falsas Objectivo: se a interpretação I dos factos representados no programa for correcta, então todas as conclusões computadas a partir do programa correspondem, nessa interpretação, a afirmações também verdadeiras q mesmo que não directamente observáveis - daí o carácter inteligente destas 13

Variável lógica Variável - representa um indivíduo não especificado [não uma posição de memória].

Variável lógica Variável - representa um indivíduo não especificado [não uma posição de memória]. m Ex: de quem é que Abraão é pai? q fazer perguntas com os vários indivíduos até obter uma resposta 'yes' • pai( abraao, lot )? no • pai( abraao, milcah )? no • pai( abraao, isaac )? yes q ou perguntar • pai( abraao, X )? q significando: pergunta existencial variáveis nas perguntas são implicitamente existenciais Nota: começa com maiúscula. • existe algum indivíduo X que faça com que o golo seja uma consequência lógica do programa? q resultado: Uma variável resume muitas perguntas. • X = isaac 14

Termos 1) Constantes e variáveis são termos 2) Termos compostos são termos: functor +

Termos 1) Constantes e variáveis são termos 2) Termos compostos são termos: functor + lista de argumentos nome/aridade termos arv/3 nil 3 5 R nil • termos base (ground) nome( joao, costa ) nome/2 - sem variáveis lista( a, lista( b, nil ) ) lista/2 • termos não base (nonground) s(0) s/1 - com variáveis - estruturas incompletas Termos arv(nil, 3, nil), 5, R) arv/3 • são a única estrutura de dados • interpretação de um termo é um indivíduo • um predicado é V ou F (não confundir com termo) 15

Substituição - conjunto finito de pares Xi=ti Xi variável, ti termo, Xi Xj para

Substituição - conjunto finito de pares Xi=ti Xi variável, ti termo, Xi Xj para todo o i j e Xi não ocorre em tj para todo i, j m Ex: = { X = isaac } e G= pai( abraao, X ) q aplicação da substituição aos argumentos de G G = pai( abraao, X ) = pai( abraao, isaac ). instância de A, a variável X está instanciada não existe a noção de atribuição q m m 16

Exemplos de substituição m Ex: possui( joao, livro( lusiadas, autor( luis, camoes) ) ).

Exemplos de substituição m Ex: possui( joao, livro( lusiadas, autor( luis, camoes) ) ). q m m possui( joao, X )? q X= livro( lusiadas, autor( luis, camoes ) ) possui( Nome, livro( Obra, autor( _, camoes ) ) )? q q m m livro( lusiadas, autor( luis, camoes) ) é um termo cuja interpretação dá um indivíduo, um exemplar dos Lusíadas Quem possui alguma obra do Camões ? Nome= joao, Obra= lusiadas o símbolo _ é uma variável anónima e portanto não aparece na resposta. as respostas dadas pelo Prolog são substituições. 17

Regra de dedução 2: generalização Generalização - uma pergunta existencial P é uma consequência

Regra de dedução 2: generalização Generalização - uma pergunta existencial P é uma consequência lógica de uma sua instância, P , para qualquer substituição . q q de pai( abraao, isaac ) concluir pai( abraao, X ), pois existe um X (X= isaac) que torna este verdadeiro operacionalmente, para responder a uma pergunta existencial com variáveis, procurar um facto que seja uma instância dessa pergunta; a resposta é essa instância, representada pela substituição respectiva conclusão pai( abraao, X ) programa pai( abraao, isaac ). X= isaac 18

Soluções múltiplas m Podem existir soluções múltiplas: quais as soluções de soma( A, B,

Soluções múltiplas m Podem existir soluções múltiplas: quais as soluções de soma( A, B, 4 )? q q m {A=0, B=4}, {A=1, B=3}, {A=2, B=2}, {A=3, B=1}, {A=4, B=0} Quais as soluções de soma( A, A, 4 )? q q a substituição de A na pergunta é feita só de uma vez, pelo que o significado é qual o número que somado consigo próprio dá 4? , {A=2} 19

Regra de dedução 3: instanciação Instanciação - de um facto universalmente quantificado P, deduzir

Regra de dedução 3: instanciação Instanciação - de um facto universalmente quantificado P, deduzir uma sua instância P , para qualquer substituição . m Suponha-se que todos os elementos da Família gostam de maná. q q q m Em vez disto, pode-se usar um facto universal. q m m gosta( abraao, mana ). gosta( terach, mana ). • • • gosta( X, mana ). A variável resume muitos factos. As variáveis nos factos estão universalmente quantificadas. 20

Exemplos de instanciação m Operacionalmente: q q pergunta sem variáveis — encontrar um facto

Exemplos de instanciação m Operacionalmente: q q pergunta sem variáveis — encontrar um facto de que a pergunta seja instância Ex: incluir o facto soma( 0, X, X ) no programa significa que o 0 é o elemento neutro da adição. programa gosta( X, mana). conclusão gosta( abraao, mana ) 21

Combinação de regras m Operacionalmente: q q pergunta com variáveis — procurar uma instância

Combinação de regras m Operacionalmente: q q pergunta com variáveis — procurar uma instância comum à pergunta e ao facto, o que envolve dois passos: instanciação (do facto para a instância) e generalização (da instância para a pergunta) Ex: soma( 0, 3, Y ), a partir do facto soma( 0, X, X ) e da instância comum soma( 0, 3, 3), responde {Y=3} (substituições sem variáveis da pergunta, não aparecem na resposta) programa soma( 0, 3, Y ). conclusão soma( 0, 3, Y ) instância comum soma( 0, 3, 3 ) Y= 3 22

Perguntas conjuntivas m pergunta conjuntiva é aquela que possui mais do que um golo

Perguntas conjuntivas m pergunta conjuntiva é aquela que possui mais do que um golo • pai( abraao, isaac ), mae( sara, isaac )? q q m vírgula = conjunção resposta a perguntas sem variáveis é a conjunção das respostas a cada golo perguntas com variáveis partilhadas por vários golos • pai( haran, X ), macho (X )? • Haran tem algum filho homem? q q o alcance da variável é a pergunta conjuntiva também estas variáveis são existenciais 23

Variáveis partilhadas m operacionalmente, para resolver A 1, A 2, . . . ,

Variáveis partilhadas m operacionalmente, para resolver A 1, A 2, . . . , An? encontrar uma substituição tal que A 1 , A 2 , . . . An sejam instâncias sem variáveis de factos no programa. q m solução: {X=lot} Uso: restrição — dentre os filhos de Haran escolher só os machos • Ex: pai( terach, X), pai( X, Y )? q - escolhe os filhos de Terach que por sua vez têm filhos, i. e. , netos 24

Regras Regra - define uma nova relação em termos das relações existentes. m dá

Regras Regra - define uma nova relação em termos das relações existentes. m dá um nome a uma pergunta conjuntiva; transforma-a numa pergunta simples • avo( X, Y ) pai( X, Z ), pai( Z, Y ), m forma geral das cláusulas de Horn • (cabeça) (corpo) – facto A – regra A B 1, B 2, . . . Bn – pergunta B m leitura procedimental q q a pergunta é traduzida por e reduzida a para concluir avo( terach, Y ) pai( terach, Z ), pai( Z, Y ) pai( haran, Y ) {Z=haran} { Z=haran, Y=lot} 25

Leitura declarativa • avo( X, Y ) pai( X, Z ), pai( Z, Y

Leitura declarativa • avo( X, Y ) pai( X, Z ), pai( Z, Y ), m regra vista como um axioma lógico q q denota implicação lógica lê-se: para todo o X, Y e Z, X é avô de Y se X for o pai de Z o pai de Y as variáveis nas regras (caso particular: factos) são quantificadas universalmente leitura alternativa: para todo o X e Y, X é avô de Y se existir um Z tal que X seja o pai de Z o pai de Y 26

Equivalências • avo( X, Y ) pai( X, Z ), pai( Z, Y ),

Equivalências • avo( X, Y ) pai( X, Z ), pai( Z, Y ), m justificação da segunda leitura q equivalências: a b a ~b; X, p(X) ~ x: ~p(X) q X Y Z avo( X, Y) pai( X, Z ), pai( Z, Y ) X Y Z avo( X, Y) ~[ pai( X, Z ), pai( Z, Y )] X Y avo( X, Y) Z ~[ pai( X, Z ), pai( Z, Y )] X Y avo( X, Y) ~ Z: [ pai( X, Z ), pai( Z, Y )] X Y avo( X, Y) Z: [ pai( X, Z ), pai( Z, Y )] só as variáveis dos golos da pergunta interessam para a expressão da substituição q q q m variáveis nas perguntas (cláusulas só com corpo) são portanto existenciais 27

Regra de dedução 4: modus ponens m Lei do modus ponens universal trata das

Regra de dedução 4: modus ponens m Lei do modus ponens universal trata das deduções via regras q diz que da regra • R= (A B 1, B 2, . . . , Bn) q e dos factos • B'1. B'2. . . B'n. q q m se pode deduzir A' se A' B'1, B'2, . . . , B'n for uma instância de R. [identidade e instanciação são casos particulares] Um programa em lógica é um conjunto finito de regras. 28

Consequência lógica m Um golo quantificado existencialmente G é uma consequência lógica de um

Consequência lógica m Um golo quantificado existencialmente G é uma consequência lógica de um programa P, se existir uma cláusula em P com uma instância sem variáveis A B 1, B 2, . . . , Bn, n 0, tal que B 1, B 2, . . . , Bn sejam consequências lógicas de P e A uma instância de G. q responder a perguntas é aplicar (redução) o modus ponens da frente para trás o número de vezes necessário para ir do golo até aos factos a) escolhendo uma instância do golo e b) uma regra para aplicar, recursivamente. 29

Procedimentos Procedimento - colecção de regras com o mesmo predicado na cabeça. m para

Procedimentos Procedimento - colecção de regras com o mesmo predicado na cabeça. m para obter todos os netos — acrescentar definições em falta ao procedimento do predicado avo/2. • • m avo( X, Y ) pai( X, Z ), pai( Z, Y ), avo( X, Y ) pai( X, Z ), mae( Z, Y ), avo( X, Y ) mae( X, Z ), pai( Z, Y ), avo( X, Y ) mae( X, Z ), mae( Z, Y ), outra representação, mais compacta progenitor( X, Y ) pai( X, Y ), progenitor( X, Y ) mae( X, Y ), avo( X, Y ) progenitor( X, Z ), progenitor( Z, Y ), q progenitor/2 tem duas alternativas — é uma forma de representar disjunção 30

Traço de uma execução avo( X, jacob ) progenitor( X, Z ), progenitor( Z,

Traço de uma execução avo( X, jacob ) progenitor( X, Z ), progenitor( Z, jacob ) progenitor( X, Z ), pai( Z, jacob) progenitor( X, isaac ) mae( X, isaac ) Ñ {Z= isaac } {Z= isaac, X= sara} resolvente - pergunta conjuntiva com os golos ainda a processar traço - evolução da computação, com a indicação de a) golo seleccionado b) regra escolhida para a redução c) substituição associada Ñ - resolvente vazia (= true) 31

Outro traço de execução avo( X, jacob ) progenitor( X, Z ), progenitor( Z,

Outro traço de execução avo( X, jacob ) progenitor( X, Z ), progenitor( Z, jacob ) pai( X, Z ), progenitor( Z, jacob ) progenitor( isaac, jacob ) { X=abraao, Z= isaac } pai( isaac, jacob ) { X=abraao, Z= isaac } { X=abraao, Z= isaac} 32

Unificação q q um termo T é uma instância comum de T 1 e

Unificação q q um termo T é uma instância comum de T 1 e T 2 se existirem substituições 1 e 2 tais que T=T 1 1 e T=T 2 2 um termo S é mais geral do que um termo T, se T for uma instância de S não for uma instância de T um termo S é uma variante de um termo T se se puderem converter um no outro por simples renomeação de variáveis um unificador de dois termos é uma substituição que torna os dois termos iguais livro( Titulo, autor( Proprio, camoes), data(1585, Mes, Dia)) ) livro( lusiadas, autor( luis, Apelido), Ano ) = {Titulo=lusiadas, Proprio=luis, Apelido=camoes, Ano= data(1585, Mes, Dia)} 33

Algoritmo de unificação m o algoritmo de unificação produz o unificador ou reporta falha

Algoritmo de unificação m o algoritmo de unificação produz o unificador ou reporta falha q q q baseia-se na comparação de functores e na tentativa de unificar os respectivos argumentos, propagando cada substituição a todas as ocorrências de variáveis o resultado é o unificador mais geral possível (a respectiva instância é a mais geral de todas as instâncias) verificação de ocorrência - para unificar uma variável S com um termo T, T não pode conter S [não há unificador mais geral para X e s(X)] 34

Interpretador abstracto Entrada Saída Algoritmo q q programa P golo G G , se

Interpretador abstracto Entrada Saída Algoritmo q q programa P golo G G , se existir, ou falha inicializar a resolvente para ser o golo G enquanto a resolvente não estiver vazia fazer • escolher um golo A da resolvente e uma cláusula (renomeada) A' B 1, B 2, . . . , Bn n 0 em P tal que A e A' unifiquem com unificador (sair do ciclo se não existirem tais golo e cláusula) • remover A da resolvente e adicionar-lhe B 1, B 2, . . . , Bn • aplicar à resolvente e a G q se a resolvente estiver vazia devolver G, se não reportar falha 35

Bases de dados q q q conjunto de factos = base de dados (BD

Bases de dados q q q conjunto de factos = base de dados (BD extensional) regras = vistas (BD intencional) predicado só com factos = relação pai( Pai, Filho ), mae( Mae, Filho ), macho( Pessoa ), femea( Pessoa ) [esquemas] definição de vistas progenitor( P, Filho ) pai (P, Filho ). progenitor( P, Filho ) mae( P, Filho ). irmao( X, Y ) progenitor( P, X ), progenitor( P, Y ), macho( X ), X = Y. tio( Tio, Sob ) irmao( Tio, P ), progenitor( P, Sob ). antepassado( A, X ) progenitor( A, X ). antepassado( A, X ) progenitor( A, Y ), antepassado( Y, X ). 36

PL vs BD relacionais m m programação em lógica — extensão ao modelo relacional,

PL vs BD relacionais m m programação em lógica — extensão ao modelo relacional, fornece uma linguagem integrada de acesso aos dados, e de programação de aplicações operações básicas q q reunião r_uniao_s( X 1, . . . , Xn ) r( X 1, . . . , Xn ) r_uniao_s( X 1, . . . , Xn ) diferença • requer um predicado de negação r_menos_s( X 1, . . . , Xn ) r( X 1, . . . , Xn ), not s( X 1, . . . , Xn ) é verdadeiro relativamente a um programa P se G não for uma consequência lógica de P not G 37

Operações da álgebra relacional q produto cartesiano r_vezes_s( X 1, . . . ,

Operações da álgebra relacional q produto cartesiano r_vezes_s( X 1, . . . , Xm+1, . . . , Xm+n ) r( X 1, . . . , Xm ), s( Xm+1, . . . , Xm+n ) q projecção r 13( X 1, X 3 ) r( X 1, X 2, X 3 ) q selecção r 1( X 1, X 2, X 3 ) r( X 1, X 2, X 3 ), X 2 > X 3 m operações derivadas q q intersecção r_inter_s( X 1, . . . , Xn ) r( X 1, . . . , Xn ), s( X 1, . . . , Xn ) junção natural r_join_y( X 1, X 2, X 3 ) r( X 1, X 2 ), s( X 2, X 3 ) 38

Estilo de programação m dois estilos 1) exprimir a informação à custa de relações

Estilo de programação m dois estilos 1) exprimir a informação à custa de relações entre indivíduos atómicos 2) codificar informação em termos, indivíduos complexos e manipular estruturas m arte: encontrar o adequado nível de abstracção q q esconder os detalhes da representação — independência dos dados evidenciar associações entre indivíduos, evitando redundâncias — normalização 39

Representação de informação m m m Representar o facto de o João possuir um

Representação de informação m m m Representar o facto de o João possuir um exemplar dos Lusíadas de Luís de Camões, editado em 1940. Codificação em termos complexos, com poucos predicados q possui( joao, livro( lusiadas, autor( luis, camoes), 1940 ) ). q Quem possui livros editados em 1940? ? - possui( X, livro( _, _, 1940 ) ). Codificação baseada em predicados, com termos simples q escritor( 1, luis, camoes). livro( 427, lusiadas, 1940 ). autor( 1, 427). pessoa(1002, joao ). possui( 1002, 427 ). ? - possui( Cod. P, Cod. L), pessoa( Cod. P, X ), livro(Cod. L, _, 1940). 40

Tipos m m não existe noção independente de tipo; existem predicados que definem implicitamente

Tipos m m não existe noção independente de tipo; existem predicados que definem implicitamente tipos tipo — conjunto de termos q q q definição de tipo — (muitas vezes) predicado unário tipo macho definido como o conjunto dos termos X tais que macho(X) é verdade tipos recursivos simples — definidos por programas em lógica unários recursivos • inteiros, listas, árvores binárias m inteiros: predicado de tipo q % natural( X ) X é um número natural % sn(0) denota n natural( 0 ). natural( s(X) ) natural( X ). s(X) representa o sucessor de X 41

Aritmética m relação de ordem % X Y se X e Y são números

Aritmética m relação de ordem % X Y se X e Y são números naturais e X Y (notação infixa de ' '( X, Y ) ) 0 X natural( X ). s(X) s(Y) X Y q traço de um golo: s(s(0)) s(0) 0 • este golo não tem redução porque não unifica com nenhuma cabeça de cláusula — o traço falha ( para suceder teria que terminar em Ñ) 42

Adição m operação de adição como relação ternária % soma( X, Y, Z )

Adição m operação de adição como relação ternária % soma( X, Y, Z ) se X, Y e Z são números naturais e Z é a soma de X e Y soma( 0, X, X ) natural( X ). soma( s(X), Y, s(Z) ) soma( X, Y, Z ). m definição de tipo recursivo permite forma compacta para a adição, em vez da explícita 43

Múltiplos usos m uso funcional soma( s(s(0)), s(0), X ) soma( s(0), Z 1

Múltiplos usos m uso funcional soma( s(s(0)), s(0), X ) soma( s(0), Z 1 ) { X = s( Z 1) } soma( 0, s(0), Z 2 ) { Z 1 = s(Z 2), X = s(s(Z 2)) } Ñ { Z 2 = s(0), Z 1 = s(s(0)), X = s(s(s(0))) } q note como se constrói um termo para devolver em X, à custa de o manter aberto com uma variável e da unificação que causa instanciação parcial m uso invertido soma( s(0), Y, s(s(s(0))) soma( 0, Y, s(s(0)) ) Ñ { Y= s(s(0)) } q note como se define o resultado e se pergunta as parcelas 44

Várias soluções m Traço com soluções múltiplas soma( X, Y, s(s(s(0))) ) Ñ ;

Várias soluções m Traço com soluções múltiplas soma( X, Y, s(s(s(0))) ) Ñ ; soma( X, Y, s(s(s(0))) ) soma( X 1, Y, s(s(0)) ) Ñ { X= 0, Y= s(s(s(0))) } { X= s(X 1) } { X 1= 0, Y= s(s(0)) } etc. ; {no} m pede-se uma nova solução com um sinal “; ” 45

Significado de um programa P, M(P), é o conjunto dos golos completamente instanciados dedutíveis

Significado de um programa P, M(P), é o conjunto dos golos completamente instanciados dedutíveis de P. m esquema da relação/predicado descreve o significado pretendido M, também definido em termos de golos na relação q relativamente ao significado pretendido • programa correcto M(P) M • programa completo M M(P) q objectivo: programas correctos e completos ou, pelo menos, correctos 46

Listas Lista — estrutura de dados binária em que o 1º argumento é um

Listas Lista — estrutura de dados binária em que o 1º argumento é um elemento e o 2º recursivamente o resto da lista; a base da recursão é a lista vazia [] Representações formal par elementos • (a, • (b, []) ) • a • [a | [b | []] ] [a, b] b [] . (a, []) b []. (a, . (b, . (c, []))). (a, X). (a, . (b, X)) cabeça cauda [a|[]] [a|[b|[c | []] [a|X] [a | [b | X] ] [a, b, c] [a|X] [a, b| X] 47

Manipulação de listas q definição de tipo % lista( Xs ) Xs é uma

Manipulação de listas q definição de tipo % lista( Xs ) Xs é uma lista( [] ). lista( [1, 2, 3] ) lista( [2, 3] ) R: { X= 1, Xs=[2, 3] } lista([X | Xs] ) lista( Xs ). q membro de uma lista % member( X, Xs ) X é um elemento omite-se da lista Xs member( X, [X|Xs] ) lista( Xs ). member(X, [Z| Xs] ) member( X, Xs ). • nomes das variáveis são arbitrários e locais às regras • mas convém ter uma disciplina member(b, [a, b, c]). R: yes member(X, [a, b, c] ) R: { X= a } ou {X=b} ou {X = c} member(b, Xs) R: { Xs= [b]} ou {Xs = [X, b|Z]} 48

Predicados sobre listas m Comprimento de uma lista % comp( Xs, N ) a

Predicados sobre listas m Comprimento de uma lista % comp( Xs, N ) a lista Xs tem N elementos comp( [], 0 ). comp( [X| Xs], s(N) ) comp(Xs, N ). m Prefixo e sufixo de uma lista % prefixo(Ps, Xs ) Ps é uma sublista consecutiva no início da lista Xs prefixo( [], Xs ). prefixo( [X|Xs], [X| Ys] ) prefixo( Xs, Ys ). sufixo( Xs, Xs ). sufixo( Xs, [Y| Ys] ) sufixo( Xs, Ys ). 49

Concatenação % append( Xs, Ys, Zs ) se Zs for o resultado da concatenacao

Concatenação % append( Xs, Ys, Zs ) se Zs for o resultado da concatenacao de Xs e Ys append( [], Ys ). append( [X|Xs], Ys, [X|Zs] ) append( Xs, Ys, Zs ). q programa semelhante em estrutura ao da soma de inteiros, mas assimétrico no primeiro argumento: append( [a, b], [c, d], Zs ) append( Xs, [c, d], [a, b, c, d] ) append( [b], [c, d], Zs 1 ) { Zs= [a|Zs 1] } append( Xs 1, [c, d], [b, c, d] ) { Xs= [a|Xs 1] } append( [], [c, d], Zs 2 ) { Zs 1= [b|Zs 2] } append( Xs 2, [c, d] ) { Xs 1= [b|Xs 2] } Ñ { Zs 2= [c, d] } Ñ { Xs 2= [ ] } R: Zs = [a, b, c, d] q R: Xs = [a, b] partição de uma lista • append( Xs, Ys, [a, b, c, d] ) q tem múltiplas soluções e aplicações variadas • member( X, Xs ) append( As, [X|Ys], Xs ) 50

Aplicações da concatenação m Sublistas % sublista( Sub, Lista ) Sub é uma sublista

Aplicações da concatenação m Sublistas % sublista( Sub, Lista ) Sub é uma sublista de Lista % prefixo de sufixo sublista( Sub, Lista ) prefixo( Sub, Xs ), sufixo( Xs, Lista ). % ou sublista(Xs, As. Xs. Bs ) append( As, Xs. Bs, As. Xs. Bs ), append( Xs, Bs, Xs. Bs ). m Inverter uma lista % inverte( Lista, Inv ) Inv é o resultado de inverter Lista % algoritmo ingénuo inverte( [], [] ). inverte( [X| Xs], Zs ) inverte( Xs, Ys ), append( Ys, [X], Zs ). 51

Árvore de prova q q Árvore de prova — os nós são os golos

Árvore de prova q q Árvore de prova — os nós são os golos reduzidos durante a computação; a raiz é o golo da pergunta; há arcos de cada nó para todos os nós obtidos daquele por um passo de redução. Objectivo: mais declarativa do que o traço, mostrar as razões da dedução. inverte( [b, c, d], [d, c, b] ) inverte( [c, d], [d, c] ) append([d, c], [b], [d, c, b] ) inverte( [d], [d] ) append([d], [c], [d, c] ) inverte( [], [] ) append([c], [b], [c, b] ) append([], [d] ) append([], [c] ) append([], [b] ) Dimensão da árvore de prova quadrática no número de elementos da lista a inverter. 52

Evitar a concatenação Inverter sem concatenação (tentativa) % inverte( Lista, Inv ) Inv é

Evitar a concatenação Inverter sem concatenação (tentativa) % inverte( Lista, Inv ) Inv é o resultado de inverter Lista % algoritmo sem append inverte( [X| Xs], Acc ) inverte( Xs, [X|Acc] ). inverte( [], Acc ). • traço inverte( [b, c, d], [] ) inverte( [c, d], [b] ) inverte( [d], [c, b] ) inverte( [], [d, c, b] ) Ñ q inverteu, mas. . . e o resultado? 53

Acumuladores m Inverter sem concatenação usando acumulador para extrair o resultado (por unificação no

Acumuladores m Inverter sem concatenação usando acumulador para extrair o resultado (por unificação no último passo) % inverte( Lista, Inv ) Inv é o resultado de inverter Lista % algoritmo com acumulador (argumento suplementar) inverte( Xs, Ys ) inverte( Xs, [], Ys ). inverte( [X| Xs], Acc, Ys ) inverte( Xs, [X|Acc], Ys ). inverte( [], Ys ). • traço inverte( [b, c, d], Ys ) inverte( [b, c, d], [], Ys ) inverte( [c, d], [b], Ys ) inverte( [d], [c, b], Ys ) inverte( [], [d, c, b], Ys ) Ñ m { Ys= [d, c, b] } este traço corresponde a uma árvore de tamanho linear no número de elementos da lista 54

Filtro % apaga( Lista, X, Sem. Xs ) a lista Sem. Xs é Lista

Filtro % apaga( Lista, X, Sem. Xs ) a lista Sem. Xs é Lista com todos os X removidos apaga( [X| Xs], X, Ys ) apaga( Xs, X, Ys ). apaga( [X| Xs], Z, [X|Ys] ) X Z, apaga( Xs, Z, Ys ). apaga( [], X, [] ). m A condição X Z na segunda regra é essencial para obter resultados correctos 55

Ordenação % quicksort( Xs, Ys ) a lista Ys é uma permutação ordenada de

Ordenação % quicksort( Xs, Ys ) a lista Ys é uma permutação ordenada de Xs quicksort( [X| Xs], Ys ) particao( Xs, X, Pequenos, Grandes ), quicksort( Pequenos, Ps), quicksort( Grandes, Gs ), append( Ps, [X| Gs], Ys ). quicksort( [], [] ). particao( [X| Xs ], Y, [X| Ls], Bs ) X Y, particao( Xs, Y, Ls, Bs ). particao( [X| Xs ], Y, Ls, [X| Bs] ) X > Y, particao( Xs, Y, Ls, Bs ). particao( [], Y, [] ). 56

Árvores m Árvore - estrutura duplamente recursiva % arvore(Arv ) Arv é uma árvore

Árvores m Árvore - estrutura duplamente recursiva % arvore(Arv ) Arv é uma árvore arvore( void). arvore( arv(Elem, Esq, Dir) ) arvore( Esq ), arvore( Dir ). % membro_arv( E, A ) E é um elemento da árvore binária A membro_arv( X, arv(X, E, D) ). membro_arv( X, arv(Z, E, D) ) membro_arv(X, E ). membro_arv( X, arv(Z, E, D) ) membro_arv(X, D ). % isomorfa(Arv 1, Arv 2 ) Arv 1 e Arv 2 são isomorfas isomorfa( void, void ). isomorfa( arv(X, Esq 1, Dir 1), arv(X, Esq 2, Dir 2) ) isomorfa( Esq 1, Esq 2), isomorfa(Dir 1, Dir 2 ). isomorfa( arv(X, Esq 1, Dir 1), arv(X, Esq 2, Dir 2) ) isomorfa( Esq 1, Dir 2), isomorfa(Dir 1, Esq 2 ). % pre_ordem( Arv, Pre ) Pre é uma travessia em preordem da árvore Arv pre_ordem( arv(X, E, D), Pre ) pre_ordem( E, Es ), pre_ordem( D, Ds ), append( [X| Es], Ds, Pre ). pre_ordem( void, [] ). 57

Árvore de pesquisa m Árvore de pesquisa de um golo G relativamente a um

Árvore de pesquisa m Árvore de pesquisa de um golo G relativamente a um programa P q raiz da árvore: G q nós: resolventes, com um golo seleccionado q arcos a sair de um nó: um por cada cláusula de P cuja cabeça unifica com o golo seleccionado no nó q cada caminho na árvore, desde a raiz: computação de G por P q folhas: nós de sucesso, se corresponderem a resolventes vazias; nós de falha se o golo selecionado não puder ser reduzido 58

Árvore de pesquisa do Jacob avo( X, jacob ) progenitor( X, Z ), progenitor(

Árvore de pesquisa do Jacob avo( X, jacob ) progenitor( X, Z ), progenitor( Z, jacob ) progenitor( X, Z ), pai( Z, jacob) progenitor( X, Z ), mae( Z, jacob) {Z= isaac } progenitor( X, isaac ) pai( X, isaac ) mae( X, isaac ) {X= abraao} Ñ sucesso X=abraao, Z=isaac falha {X= sara} Ñ sucesso X=sara, Z=isaac 59

Outra árvore de pesquisa avo( X, jacob ) progenitor( X, Z ), progenitor( Z,

Outra árvore de pesquisa avo( X, jacob ) progenitor( X, Z ), progenitor( Z, jacob ) pai( X, Z ), progenitor( Z, jacob) pai( X, Z ), pai( Z, jacob) mae( X, Z ), pai( Z, jacob) pai( X, Z ), mae( Z, jacob ) {Z= isaac} pai( X, isaac ) {X= abraao} Ñ sucesso X=abraao, Z=isaac mae( X, Z ), progenitor( Z, jacob) falha pai( X, Z ), mae( Z, jacob ) {Z= isaac} mae( X, isaac ) falha {X= sara} Ñ sucesso X=sara, Z=isaac 60

Características destas árvores m m árvore de pesquisa: independente do critério de selecção de

Características destas árvores m m árvore de pesquisa: independente do critério de selecção de cláusulas (tem todas as alternativas) podem existir várias árvores de pesquisa diferentes para o mesmo golo e o mesmo programa, conforme o critério de selecção dos golos conclusão principal: o número de nós de sucesso é o mesmo em todas elas uma árvore de pesquisa resume todas as respostas; chama-se de pesquisa porque um interpretador concreto terá que ter uma estratégia para percorrer a árvore em busca de soluções (pesquisa em profundidade, em largura, em paralelo, . . . ) 61

Computações infinitas append( Xs, [c, d], Ys) {Xs= [X|Xs 1], Ys= [X|Ys 1]} append(

Computações infinitas append( Xs, [c, d], Ys) {Xs= [X|Xs 1], Ys= [X|Ys 1]} append( Xs 1, [c, d], Ys 1) {Xs 1= [X 1|Xs 2], Ys 1= [X 1|Ys 2]} append( Xs 2, [c, d], Ys 2) {Xs 2= [X 2|Xs 3], Ys 2= [X 2|Ys 3]} {Xs= [], Ys= [c, d]} Ñ {Xs 1= [], Ys 1= [c, d]} Ñ {Xs 2= [], Ys 2= [c, d]} Ñ ° ° ° ramos infinitos na árvore° correspondem a computações sem fim uma pesquisa em profundidade pode perder-se num ramo infinito avaliar a complexidade de uma pergunta: (interpretadores que pesquisem sequencialmente toda a árvore) melhor analisar o número de nós da árvore de pesquisa do que da árvore de prova (esta inclui não determinismo) append( Xs 3, [c, d], Ys 3) m m m 62

Negação por falha m m m os programas em lógica descrevem o que é

Negação por falha m m m os programas em lógica descrevem o que é verdade; o falso é omitido certas relações são mais fáceis de especificar com a negação disjunto( Xs, Ys ) not ( member( X, Xs ), member( X, Ys ) ) para obter conclusões negativas: assunção do mundo fechado q not G é uma consequência do programa P se G não for uma consequência de P (mesmo que G dê ramo infinito) árvore de pesquisa finitamente falhada: não contém nós de sucesso nem ramos infinitos conjunto de falha finita do programa P: conjunto dos golos que têm uma árvore finitamente falhada relativamente a P árvore finitamente falhada: progenitor( isaac, X ) pai( isaac, X ) mae(isaac, X) falha Dedução usando negação por falha: not G é uma consequência de P se G estiver no conjunto de falha finita de P 63