1 / 63

Programação em Lógica

Programação em Lógica. 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. Lógica e computadores. Lógica

ronnie
Download Presentation

Programação em Lógica

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programação em Lógica 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

  2. Lógica e computadores • Lógica • 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 • 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

  3. Paradigma • Programação em Lógica • 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) • problema mortal(Sócrates)? • Sim! É uma consequência lógica dos axiomas • eliminação do universal e modus ponens

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

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

  6. Programa em Lógica • 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 • Significadodo 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

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

  8. Programas simples 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 ). femea( milcah ). mae( sara, isaac ). femea( yiscah ). Um conjunto de factos é um programa ø descreve uma situação. Família Soma soma( 0, 0, 0 ). soma( 0, 1, 1 ). soma( 0, 2, 2 ); soma( 1, 0 ,1 ). soma( 1, 1, 2 ).

  9. Perguntas • pergunta ou golo (goal) • 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.

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

  11. Respostas negativas • Ex: (programa da Família) • pai( abraao, isaac )? • yes • femea(abraao )? • no • americano( clinton )? • no • 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.

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

  13. Interpretação • indivíduos — constantes e termos • afirmações — factos e golos • 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 • mesmo que não directamente observáveis - daí o carácter inteligente destas

  14. Variável lógica Variável - representa um indivíduo não especificado [não uma posição de memória]. • Ex: de quem é que Abraão é pai? • 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 • ou perguntar • pai( abraao, X )? • significando: • existe algum indivíduo X que faça com que o golo seja uma consequência lógica do programa? • resultado: • X = isaac pergunta existencial variáveis nas perguntas são implicitamente existenciais Nota: começa com maiúscula. Uma variável resume muitas perguntas.

  15. Termos 1) Constantes e variáveis são termos 2) Termos compostos são termos: functor + lista de argumentos nome/aridade termos arv/3 5 R arv/3 nil 3 nil • termos base (ground) • - sem variáveis • termos não base (nonground) • - com variáveis • - estruturas incompletas nome( joao, costa ) nome/2 lista( a, lista( b, nil ) ) lista/2 s(0) s/1 arv( arv(nil,3,nil), 5, R) arv/3 • Termos • 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)

  16. Substituição • Ex: q = { X = isaac } e G= pai( abraao, X ) • aplicação da substituição q aos argumentos de G • Gq = pai( abraao, X )q = pai( abraao, isaac ). • instância de A, a variável X está instanciada • não existe a noção de atribuição • 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

  17. Exemplos de substituição • Ex: possui( joao, livro( lusiadas, autor( luis, camoes) ) ). • livro( lusiadas, autor( luis, camoes) ) é um termo cuja interpretação dá um indivíduo, um exemplar dos Lusíadas • possui( joao, X )? • X= livro( lusiadas, autor( luis, camoes ) ) • possui( Nome, livro( Obra, autor( _, camoes ) ) )? • 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.

  18. Regra de dedução 2: generalização Generalização - uma pergunta existencial P é uma consequência lógica de uma sua instância, Pq, para qualquer substituição 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 ) X= isaac programa pai( abraao, isaac ).

  19. Soluções múltiplas • Podem existir soluções múltiplas: quais as soluções de soma( A, B, 4 )? • {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 )? • 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}

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

  21. Exemplos de instanciação • Operacionalmente: • 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 )

  22. Combinação de regras • Operacionalmente: • 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 conclusão soma( 0, 3, Y ) soma( 0, 3, Y ). Y= 3 instância comum soma( 0, 3, 3 )

  23. Perguntas conjuntivas • pergunta conjuntiva é aquela que possui mais do que um golo • pai( abraao, isaac ), mae( sara, isaac )? • 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? • o alcance da variável é a pergunta conjuntiva • também estas variáveis são existenciais

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

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

  26. Leitura declarativa • avo( X, Y )pai( X, Z ), pai( Z, Y ), • regra vista como um axioma lógico •  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 e 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 e Z o pai de Y

  27. Equivalências • avo( X, Y )pai( X, Z ), pai( Z, Y ), • justificação da segunda leitura • equivalências: a  b  a  ~b; X, p(X)  ~x: ~p(X) • 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 • variáveis nas perguntas (cláusulas só com corpo) são portanto existenciais

  28. Regra de dedução 4: modus ponens • Lei do modus ponens universal trata das deduções via regras • diz que da regra • R= (A  B1, B2, ..., Bn) • e dos factos • B'1. B'2. .... B'n. • 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.

  29. Consequência lógica • 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  B1, B2, ..., Bn, n0, tal que B1, B2, ..., Bn sejam consequências lógicas de P e A uma instância de G. • 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.

  30. Procedimentos Procedimento - colecção de regras com o mesmo predicado na cabeça. • para obter todos os netos — acrescentar definições em falta ao procedimento do predicado avo/2. • 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 ), • progenitor/2 tem duas alternativas — é uma forma de representar disjunção

  31. Traço de uma execução avo( X, jacob ) progenitor( X, Z ), progenitor( Z, jacob )  progenitor( X, Z ), pai( Z, jacob) progenitor( X, isaac )  {Z= 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)

  32. 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}

  33. Unificação • um termo T é uma instância comum de T1 e T2 se existirem substituições 1 e 2 tais que T=T11 e T=T22 • um termo S é mais geral do que um termo T, se T for uma instância de S e 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)}

  34. Algoritmo de unificação • o algoritmo de unificação produz o unificador ou reporta falha • 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)]

  35. Interpretador abstracto Entrada programa P golo G Saída G, se existir, ou falha Algoritmo • 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'  B1, B2, ..., 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 B1, B2, ..., Bn • aplicar  à resolvente e a G • se a resolvente estiver vazia devolver G, se não reportar falha

  36. Bases de dados • 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 ).

  37. PL vs BD relacionais • 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 • reunião r_uniao_s( X1, ..., Xn )  r( X1, ..., Xn ) r_uniao_s( X1, ..., Xn )  s( X1, ..., Xn ) • diferença • requer um predicado de negação r_menos_s( X1, ..., Xn )  r( X1, ..., Xn ), not s( X1, ..., Xn ) not G é verdadeiro relativamente a um programa P se G não for uma consequência lógica de P

  38. Operações da álgebra relacional • produto cartesiano r_vezes_s( X1, ..., Xm, Xm+1, ..., Xm+n )  r( X1, ..., Xm ), s( Xm+1, ..., Xm+n ) • projecção r13( X1, X3 )  r( X1, X2, X3 ) • selecção r1( X1, X2, X3 )  r( X1, X2, X3 ), X2 > X3 • operações derivadas • intersecção r_inter_s( X1, ..., Xn )  r( X1, ..., Xn ), s( X1, ..., Xn ) • junção natural r_join_y( X1, X2, X3 )  r( X1, X2 ), s( X2, X3 )

  39. Estilo de programação • 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 • arte: encontrar o adequado nível de abstracção • esconder os detalhes da representação — independência dos dados • evidenciar associações entre indivíduos, evitando redundâncias — normalização

  40. Representação de informação • 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 • possui( joao, livro( lusiadas, autor( luis, camoes), 1940 ) ). • Quem possui livros editados em 1940? ?- possui( X, livro( _, _, 1940 ) ). • Codificação baseada em predicados, com termos simples escritor( 1, luis, camoes). livro( 427, lusiadas, 1940 ). autor( 1, 427). pessoa(1002, joao ). possui( 1002, 427 ). • ?- possui( CodP, CodL), pessoa( CodP, X ), livro(CodL, _, 1940).

  41. Tipos • não existe noção independente de tipo; existem predicados que definem implicitamente tipos • tipo — conjunto de termos • 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 • inteiros: predicado de tipo % 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

  42. Aritmética • 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 • traço de um golo: s(s(0))  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 Ñ)

  43. Adição • 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 ). • definição de tipo recursivo permite forma compacta para a adição, em vez da explícita

  44. Múltiplos usos • uso funcional soma( s(s(0)), s(0), X ) soma( s(0), s(0), Z1 ) { X = s( Z1) } soma( 0, s(0), Z2 ) { Z1 = s(Z2), X = s(s(Z2)) } Ñ { Z2 = s(0), Z1 = s(s(0)), X = s(s(s(0))) } • 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 • uso invertido soma( s(0), Y, s(s(s(0))) soma( 0, Y, s(s(0)) ) Ñ { Y= s(s(0)) } • note como se define o resultado e se pergunta as parcelas

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

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

  47. 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 | [b | []] ] [a, b] • a • b [] cabeça cauda .(a,[]) [a|[]] [a] .(a, .(b, .(c, []))) [a|[b|[c | []] [a, b, c] .(a, X) [a|X] [a|X] .(a, .(b, X)) [a | [b | X] ] [a,b| X] b []

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

  49. Predicados sobre listas • Comprimento de uma lista % comp( Xs, N ) ¬ a lista Xs tem N elementos comp( [], 0 ). comp( [X| Xs], s(N) ) ¬ comp(Xs, N ). • 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 ).

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

More Related