Baixe o app para aproveitar ainda mais
Prévia do material em texto
Inteligência Artificial É a inteligência similar à humana exibida por mecanismos ou software, ciência que estuda o fenômeno da inteligência. Com o objetivo de modelar e simular a inteligência. O que é inteligência artificial? Área de pesquisa na qual trabalha se uma forma de fazer o computador a realizar tarefas nas quais o ser humano é melhor. Estrutura DADOS INFORMAÇÃO CONHECIMENTO ANÁLISE SÍNTESE COMPREENSÃO Dado É a estrutura fundamental sobre a qual um sistema de informação é construído. Precisão e um critério importante na hora da avaliação de um dado. Característica de um dado Campo – representa atributos específicos. Registro – coleção de campos interligados relacionados a um objeto comum. Arquivo - coleção de registros interligados relatando um tópico comum. Exemplo de dado: Informação Dados cuja forma e conteúdo são uteis para o uso no processo de tomada de decisão. Parte da criação e generalizada a partir de uma base dados. A transformação de dados em informação e realizado através de uma apresentação de dados de uma forma que o usuário entenda. Exemplo de Informação: Pontos importante sobre informação Informação é uma declaração em relação a estrutura permite que permita a pessoa tomar uma decisão. Apresentação de um formato compreensível transforma o dado em informação. A utilidade da informação para um usuário final e um ponto importante para a avaliação da eficácia e da validade da informação. Conhecimento É a capacidade de resolver problemas, inovar e aprender baseado em experiências vividas. Instintos, ideias, regras guiam as ações e decisões. Explicar como as coisas acontecem e um critério importante na validação do conhecimento. Exemplo de Conhecimento João recebe por mês 930,00 reais Com os recursos que ele recebe, João pode alugar um quarto em uma boa república, trocar de carro todo ano e frequentar barzinhos nos finais de semana. Pontos importantes sobre conhecimento O conhecimento e intuitivo e baseado na socialização ou experiências passadas geralmente aplicamos em um problema similar. Conhecimento e adquirido por mentores (ex: pais), não é estritamente codificado. Importante lembrar Dado não é Informação Informação não é Conhecimento Conhecimento não é Inteligência Inteligência não é Sabedoria Exemplo de inteligência: Inteligência Se João trocar o whisky por chopp, sobra dinheiro para ele jantar fora Exemplo de sabedoria: Sabedoria Se João guardar um dinheiro todo mês, quando ele se formar ele pode: Viajar, montar uma empresa, comprar um apartamento Sabedoria é combinar o racional com o emocional. Aspectos da inteligência Intuição Bom senso Criatividade Raciocínio lógico e matemático Capacidade de aprender Procedimento inteligente Aprende por experiência Usa conhecimento adquirido por experiência Soluciona problemas na ausência de alguma informação Reage rapidamente perante uma nova situação Determina o que é importante Raciocina e pensa Entende imagens visuais Processa e manipula símbolos É criativo e imaginativo Usa heurística Comportamento inteligente Percepção Resolução de Problemas Tomada de Decisão Compreensão Aprendizagem etc. 4 Categorias das definições de inteligência artificial Sistemas que pensam como humanos – modelamento cognitivo - atividades tais como tomada de decisão, resolução de problemas, aprendizagem. Sistemas que pensam racionalmente – leis do pensamento - estudo das faculdades mentais através do uso de modelos computacionais. Sistemas que atuam como humanos - teste de Turing - criar máquinas que executam funções que requerem inteligência usadas pelas pessoas. Sistemas que atuam racionalmente – agentes racionais - estudo que procura explicar e emular o comportamento inteligente em termos de processos computacionais Teste de Turing Os indivíduos A e B são separados fisicamente. Eles comunicam via um sistema intermediário. O objetivo do Interrogador é de descobrir quem de B e C é a máquina Maquina Inteligente Um computador e inteligente se ele parece humano para o homem. Mas há muitas dimensões de inteligência e outros fatores que devem ser avaliados: Tipo, qualidade e quantidade do conhecimento do sistema Tipos de inferências sobre o conhecimento Direcionamento da busca Meios de aquisição automática de conhecimento Expansibilidade do conhecimento Áreas de apoio para a Inteligência Artificial Sub-áreas de IA Temas de pesquisa de IA Mineração de Dados Vida artificial Programação genética Sistemas tutores inteligentes Música e IA Visão computacional Jogos Lógicas Objetivos de IA Engenharia: Resolver problemas do mundo real utilizando IA como ferramenta Científico: Explicar os princípios da inteligência Aplicacoes de IA Primeiras aplicações de IA Motivadas principalmente pelo desejo dos cientistas em mostrar seu valor prático Aplicações mais recentes Motivadas, principalmente, pelo desejo de mostrar ganhos sociais ou financeiros Medicina Engenharia Educação Produtos da IA Interfaces de linguagem natural Programas de tradução automática Ensino computadorizado Eventos recentes Atualmente, as pesquisas sobre IA se baseiam muito mais no aprimoramento de teorias propostas e bem fundamentadas. Muito dos processos já alcançados, encorajam cientistas a apoiar a realização de aplicações do mundo real. Buscadores Inteligentes (aplicados principalmente à Web) Reconhecimento de Voz Robótica Uma Nova Visão A partir dos anos 80 notou-se que o modelo de raciocínio utilizado em ia era diferente dos humanos. Mas essas diferenças não invalidam o uso de modelos não humanos. Ex.: avião que voa de uma forma diferente dos pássaros. Problemas x IA Os primeiros problemas a serem estudados foram: Prova automática de teoremas; Quebra cabeça Jogos Apresentam características que os tornam bons candidatos para a pesquisa em IA: São solucionáveis por seres-humanos Formam classes de complexidade variável São problemas de conhecimento total Busca em Espaço de Estados Um problema de busca pode ser formalizado através dos seguintes elementos: Espaço de estados – onde cada elemento descreve uma situação possível. Estado inicial – situação inicial do problema. Estado final – situação (ões) que se deseja alcançar. Operadores – dada a descrição de um estado determinam todos os estados que podem ser alcançados a partir do estado dado. Árvore de busca É possível construir uma arvore de busca a partir de um problema da busca, aonde a raiz está associada a um estado inicial e os nós são associados aos estados obtidos através da aplicação das regras. Exemplo: Classificação dos problemas de busca Na solução de problemas, o mecanismo de busca é livre para escolher qualquer caminho da arvore, e a solução é chegar do estado inicial ao estado meta. Aplicações: Problemas Reais Cálculo de rotas rotas em redes de computadores sistemas de planejamento de viagens planejamento de rotas de aviões Caixeiro viajante Alocação (Scheduling) Salas de aula Máquinas industriais (job shop) Projeto de VLSI Cell layout Channel routing Busca em espaço de estados Usar um método de busca de busca para saber a ordem correta de aplicação dos operadores que leva do estado inicial ao final, uma vez terminado e executado a solução Busca Problemas de busca são descritos por diagramas de arvores: Nó inicial – aonde a busca começa Nó final – aonde a busca termina Objetivo – encontrar um caminho que ligue o no inicial ao final Entrada – descrição dos nos inicial e objetivo Saída – sequencia aonde liga o no inicial ao no final Definições importantes Busca por profundidade – números de ligações entre um dado no e o no inicial Busca por largura – número de sucessores (filhos) de um no Algoritmo básico de busca 1 Definir um conjunto L de nós iniciais; 2 Se L é vazio Então Busca não foi bem sucedida Senão Escolher um nó n de L; 3 Se n é um nó objetivo Então Retornar caminho do nó inicial até n;Parar Senão Remover n de L; Adicionar a L todos os filhos de n, rotulando cada um com o seu caminho até o nó inicial; Voltar ao passo 2 Existem vários tipos de algoritmos de busca o que muda e a forma que o no n e tratado no passo 2 Métodos de busca Busca cega – depende da posição do nó na arvore Busca heurística – utilizar informações especificas do domínio para ajudar na decisão Busca cega Busca em Profundidade (BP) A árvore é examinada de cima para baixo Aconselhável nos casos onde os caminhos improdutivos não são muito longos Busca em Largura (BL) A árvore é examinada da esquerda para a direita Aconselhável quando o número de ramos não é muito grande Algoritmo BP 1 Definir um conjunto L de nós iniciais 2 Se L é vazio Então Busca não foi bem sucedida Senão Seja n o primeiro nó de L; 3 Se n é um nó objetivo Então Retornar caminho do nó inicial até n; Parar Senão Remover n de L; Adicionar ao início de L todos os filhos de n, rotulando cada um com o seu caminho até o nó inicial; Voltar ao passo 2; Algoritmo BL 1 Definir um conjunto L de nós iniciais 2 Se L é vazio Então Busca não foi bem sucedida Senão Seja n o primeiro nó de L; 3 Se n é um nó objetivo Então Retornar caminho do nó inicial até n; Parar Senão Remover n de L; Adicionar ao final de L todos os filhos de n, rotulando cada um com o seu caminho até o nó inicial; Voltar ao passo 2; Observações BP e BL não precisam ser realizadas em uma ordem específica Memória utilizada pelas duas técnicas BP: precisa armazenar todos os filhos não visitados de cada nó entre nó atual e nó inicial - utiliza menos memória BL: antes de examinar nó a uma profundidade d, é necessário examinar e armazenar todos os nós a uma profundidade d – 1 - é geralmente mais rápida Métodos de busca cega não examinam a árvore de forma otimizada Busca Heurística Digamos que você está numa Cidade, e quer pegar um trem para casa, mas não sabe qual deve pegar. Se você morasse na zona Norte, naturalmente ignoraria todos os trens que fossem para o sul. Se você morasse na zona Sul, naturalmente ignoraria todos os trens que fossem para o Norte. Intenção básica: selecionar de L o nó n mais próximo possível do nó objetivo O tempo gasto avaliando uma função heurística deve ser recuperado por uma redução correspondente no espaço de pesquisa Atividade nível base: esforço gasto tentando resolver o problema Atividade nível meta: trabalho gasto decidindo como resolver o problema Trade-off atividade no nível base versus atividade no nível meta Busca eficiente: tempo gasto no nível meta é recuperado com reduções no tempo necessário para o nível base Explosão Combinatória Com quatro cidades, temos 6 caminhos possíveis. Com dez cidades, temos 362.880 caminhos possíveis. Quanto mais cidades adicionarmos ao TSP, mais caminhos possíveis há. O que nos leva a uma explosão combinatória. Problemas de IA são basicamente problemas de busca, devemos limitar de algo forma o processo de busca para tornar o processo mais rápido e eficiente, os “macetes” que nos humanos usamos a IA chama de heurística que ajuda a limitar a busca. #Algoritmos heurísticos Escolher primeiro as opções mais promissoras. Em algumas situações é possível colher medidas que determinam uma ordenação razoável. Alguns dos Principais métodos: Hill Climbing Objetivo: subir o máximo possível Procura entres os nós o no mais próximo do objetivo, parece com busca de profundidade mas escolho os filhos por distância do objetivo Algoritmo 1 Definir um conjunto L de nós iniciais classificados de acordo com suas distâncias ao nó objetivo (em ordem decrescente) 2 Seja n o primeiro nó de L; Se L é vazio Então Busca não foi bem sucedida 3 Se n é um nó objetivo Então Retornar caminho do nó inicial até n; Parar Senão Remover n de L; Classificar os filhos de n de acordo com suas distâncias ao nó objetivo Adicionar ao início de L todos os filhos de n, rotulando cada um com o seu caminho até o nó inicial; Voltar ao passo 2; Problemas Máximo Local - Existe um pico mais elevado que pode ou não estar próximo ao objetivo Planície – todos os pontos próximos levam ao mesmo valor Aresta (ponte) – a uma direção aonde o valor aumenta mas o existe um caminho ate la Best-first Geralmente encontra caminhos mais curtos que o Hill Climbing. Sempre move em direção ao nó mais próximo do objetivo, não importa onde ele esteja na árvore Algoritmo 1 Definir um conjunto L de nós iniciais 2 Seja n o melhor nó de L; Se L é vazio Então Busca não foi bem sucedida 3 Se n é um nó objetivo Então Retornar caminho do nó inicial até n; Parar Senão Remover n de L; Adicionar ao início de L todos os filhos de n, rotulando cada um com o seu caminho até o nó inicial; Voltar ao passo 2; Em Feixe Parecido com busca em largura que avança de nível a nível Move para baixo apenas através dos melhores nos de cada nível Outros nos do mesmo nível são ignorados Vantagens: Reduz números de nos visitados Escapa do problema de ramificação infinita Branch and Bound Cada passo estabelecemos um bound (limite) de quais branches (ramos) serão investigados, ou seja, ele só considera caminhos que levem a outros nós, desde que o caminho seja o mais curto entre os nós. A* Utiliza a função de avaliação e custo para selecionar o estado sucessor Função avaliação - se refere ao futuro (opta pelo caminho que tenha um estado mais perto da meta) Função de custo – se refere ao passado (sabe o quão está o estado do estado inicial) Geralmente tem um desempenho melhor Problemas com a Busca Heurística O processo de “olhar para a frente e voltar atrás” certamente irá levar tempo. O tempo gasto na avaliação da função heurística para selecionar um nó para avanço deve ser recuperado por uma redução correspondente, no tamanho do espaço de busca explorado. Heurísticas e Aprendizado Quando um sistema é capaz de aprender o uso da heurística irá aumentar a economia, ao se usar a heurística conforme o sistema vai aprendendo quais as melhores heurísticas usar em cada situação. Prolog Linguagem de programação que envolve objetos e relações entre objetos para resolver problemas. Conceito básico: fatos, perguntas, variáveis Conceito avançado: lista e recursão Programação logica Programação procedural – programa = algoritmo + estrutura de dados Programação logica – algoritmo = logica + controle Programa = logica + controle + estrutura de dados Em PL especificamos o que deve ser computado ao contrário de como deve ser computado Programação em Prolog declarar alguns fatos a respeito de objetos e seus relacionamentos definir algumas regras sobre os objetos e seus relacionamentos e fazer perguntas sobre os objetos e seus relacionamentos Objetos e dados em Prolog Átomos São cadeias compostas por caracteres, exemplo: letras maiúsculas, letras minúsculas, dígitos e caracteres especiais. Existem 3 formas de construir um átomo: Cadeias de letras, dígitos e o caractere _, começando com uma letra minúscula Cadeias de caractere especiais Cadeias de caracteres entre apóstrofos Números Composto por inteiros e reais Variáveis Composta por cadeias de letras, dígitos e caracteres _, sempre começando com letra maiúscula ou _ Estruturas Objetos de dados contendo vários componentes Definindo relações por fatos O fato que Abraão e um progenitor de Isaque pode ser escrito em Prolog como progenitor(abraao,isaque) Definiu-se progenitor como o nome de uma relação, e Abraão e Isaque são argumentos. Este programa consiste de clausulas, e cada umadeclara uma relação de progenitor progenitor(abraao,isaque) – É uma instancia particular que também e chamada de relacionamento. Relação e definido como um conjunto de todas as instancias A ordem dos argumentos não tem uma regra certa, mas depois de “declarado” essa ordem deve ser seguida. Exemplo: Podemos “declara” uma relação da seguinte forma progenitor(abraao,isaque) e também progenitor(isaque,abraao) assim mudando o sentido do progenitor Os nomes das relações e seus argumentos são escolhidos de forma livre, mas normalmente o programador escolhe nomes que tenha um significado. Quando compilamos o programa podemos perguntar fazer a seguinte pergunta ao programa: Abraao e o pai de Isaque? Para que o programa então a pergunta, devemos comunicar o programa da seguinte forma: ?- progenitor(abraao,isaque) Se em sua base foi inserido o fato, o prolog apenas retornara YES se não ele retornara NO Depois de fazermos todas as outras relações progenitor(sara,isaque). progenitor(abraão,isaque). progenitor(abraão,ismael). progenitor(isaque,esaú). progenitor(isaque,jacó). progenitor(jacó,josé). Assim forma arvore da família e também expandido nossa grade de perguntas Com por exemplo: Podemos perguntar “Quais os filhos de Isaque? ” ?- progenitor(isaque,X) Aqui a mais de uma resposta para essa pergunta, a primeira resposta que o programa pode dar e X = esau, digitando ; o prolog nos dá a segunda resposta X = jaco, se digitar mais vezes o ; o prolog responde com NO. Outra pergunta que podemos fazer é “Quem é o progenitor de quem? “ ?- progenitor(X,Y) Sendo que X é o progenitor de Y O prolog ira nos trazer todos os pares de progenitor-filho mostrando um de cada vez. Podemos parar as soluções digitando enter ao invés de ; Perguntas mais complexas como “Quem é o avo de Jose? “ O programa não reconhece essa pergunta diretamente, então vamos usar dois passo para realizar a pergunta ?- progenitor(Y,jose),progenitor(X,Y) X = isaque Y = jaco Sendo Y o progenitor de jose e X o progenitor de Y Seguindo com o mesmo raciocínio podemos perguntar também “Quem são os netos de Abraao? ” ?- progenitor(abraao,X), progenitor(X,Y) X = isaque Y = esau X = isaque Y = jaco Outro tipo de pergunta “Esaú e Jacó tem um progenitor em comum? “ ?- progenitor(X,esau), progenitor(X,jaco) X = isaque Sendo X o progenitor de Esaú e essa mesmo X também progenitor de Jacó Pontos Importantes O nome de uma relação deve começar com letra minúscula Escrevemos primeiro a relação depois seus argumentos entre parênteses e separados por vírgula. Exemplo: progenitor(abraao,isaque). – Progenitor e a relação (abraao,isaque) são os argumentos. O ponto final deve sempre seguir o final do fato O usuário pode perguntar ao sistema prolog sobre relações definidas no programa. Perguntas consistem em uma ou mais clausulas A resposta pode ser positiva ou negativa Se existe mais de uma resposta para uma pergunta e o usuário em satisfeito com uma reposta basta digitar return, mas se ele deseja ver mais respostas basta usa o ponto e virgula Definindo relações por regras Conforme vamos adicionando informações ao programa ele vai ficando maior e mais completo, adicionando a informação sobre sexo das pessoas envolvidas na relação progenitor temos: mulher(sara). homem(abraão). homem(isaque). homem(ismael). homem(esaú). homem(jacó). homem(josé). As relações mulher e homem são unárias, são usadas para declarar propriedades simples de sim ou não dos objetos. Também podemos declara a informação de sexo usando uma relação: sexo(sara,feminino). sexo(abraão,masculino). sexo(isaque,masculino). sexo(ismael,masculino). sexo(esaú,masculino). sexo(jacó,masculino). sexo(josé,masculino). Assim podemos responder perguntas como: “Quem é mulher?” “Qual o sexo de Sara?” Relacao filho_geral Usando a relação filho_geral de maneira similar à relação progenitor, ou seja, enumerando uma lista de fatos sobre a relação filho_geral, por exemplo: filho_geral(isaque,sara). filho_geral(iisaque,abraão). filho_geral(ismael,abraão). Também podendo definir a relação filho_geral da seguinte forma: Para todo X e Y Y é um filho_geral de X se X é um progenitor de Y. Em Prolog: filho_geral(X,Y) :- progenitor(X,Y). Ou para todo X e Y Se X é u progenitor de Y então Y é um filho_geral de X Em Prolog: filho_geral(Y,X) :- progenitor(X,Y). Há uma diferença entre regra e fato Um fato e sempre verdadeiro Uma regra pode ou não ser verdadeira tudo depende se a condição foi ou n ao satisfeita filho_geral(X,Y) – cabeção(head) ou conclusão da regra (lado esquerdo da regra) :- - neck (se) progenitor(X,Y) – corpo(body) ou condição da regra (lado direito da regra) Exemplo de pergunta: “Ismael e filho de Abraão? “ ?- filho-geral(Ismael,abraao). Não fatos sobre a relação filho_geral, sendo assim o prolog deve aplicar a regra sobre filho_geral: filho_geral(Y,X) :- progenitor(X,Y). O prolog ira fazer uma instanciação dos objetos X e Y, aonde X = abraao e Y = Ismael Ficando: filho_geral(Ismael,abraao) :- progenitor(abraao,ismael). Relação mãe Incluindo a relação mãe, com a base logica: Para todo X e Y X é a mãe de Y se X é um progenitor de Y e X é uma mulher Em prolog: Mae(X,Y) :- Progenitor(X,Y), Mulher(X). A virgula entre as condições significa uma conjunção, ou seja, ambas condições têm que ser verdadeira Relação irmão A relação irmão pode ser definida como: Para todo X e Y, X é irmão de Y se ambos X e Y têm um progenitor em comum e X é um homem. Em Prolog: irmão(X,Y) :- progenitor(Z,X), progenitor(Z,Y), homem(X). Note a forma de expressar “ambos X e Y têm um progenitor em comum”: Algum Z deve ser o progenitor de X e este mesmo Z deve ser o progenitor de Y Mas relação tem uma falha, assim o Prolog assumi que X e Y podem ser a mesma pessoa. Para corrigir basta adicionar uma relação de diferente ficando assim o código irmão(X,Y) :- progenitor(Z,X), progenitor(Z,Y), homem(X), diferente(X,Y). Grafos definindo relações Relações como progenitor, filho_geral e mãe podem ser ilustradas por diagramas que seguem as seguintes convenções Nós nos grafos correspondemos a objetos (argumentos das relações) Arcos entre nós correspondem a relações binárias (2 argumentos) Arcos são orientados apontando do primeiro argumento da relação para o segundo argumento Relações unárias são indicadas nos diagramas simplesmente marcando os objetos correspondentes com o nome da relação As relações sendo definidas são representadas por arcos tracejados Cada diagrama deve ser interpretado da seguinte forma: se as relações mostradas pelos arcos sólidos são verdadeiras então a relação mostrada pelo arco tracejado também é verdadeira Assim, a relação avô_geral pode ser imediatamente escrita como: avô_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). Layout de um programa prolog Prolog fornece liberdade na escrita do layout do programa Entretanto, os programas devem ter um aspecto compacto e, acima de tudo, fácil de ler Assim, é um padrão escrever a cabeça de uma cláusula bem como cada condição em seu corpo em uma linha separada Deve ser escrita da seguinte forma: avô_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). Pontos Importantes Programas em prolog podem ser estendidos adicionando novas clausulas Existem 3 tipos de clausulas em prolog Fatos - declaram coisas que são sempre (incondicionalmente) verdadeiras Regras - declaram coisas que são verdadeiras dependendo de determinadas condições Perguntas - o usuário pode questionar o programa sobre quais coisas são verdadeiras Cláusulas em Prolog consistem de uma cabeça e um corpo; Fatos são cláusulas que têm uma cabeça e o corpo vazio; Durante a computação, uma variável pode ser substituída por um objeto: dizemos que a variável está instanciada Regras recursivas Vamos adicionar a relação ancestral Esta relação será definida por duas regras: a primeira será o caso base (não recursivo) e a segunda será o caso recursivo Para todo Xe Z, X é um ancestral de Z se X é um progenitor de Z. Caso base ancestral(X,Z) :- progenitor(X,Z). Caso recursivo ancestral(X,Z) :- progenitor(X,Y), ancestral(Y,Z). Guia de referência rápida Prolog Listas Lista é uma das estruturas mais simples em prolog, ela é uma sequência ordenada de elementos e pode ter qualquer comprimento. Exemplo: [ana, tênis, Pedro] Apesar de usarmos colchetes para representar uma lista isso e apenas para notação, internamente a lista é representada por arvores, assim como todos os objetos estruturados Vale lembrar que: A lista é vazia, escrita como [ ] em Prolog uma lista (não vazia) consiste: No primeiro item, chamado cabeça (head) da lista Na parte restante da lista, chamada cauda (tail) A cabeça da lista pode ser qualquer objeto inclusive uma lista, porem a cauda tem ser uma lista Podemos representar um lista por arvore ou com o termo: .(ana,.(pedor,[]) ) ) Exemplos de listas: ?- Lista1 = [a,b,c], Lista2 = .(a,.(b,.(c,[]))). Lista1 = [a, b, c] Lista2 = [a, b, c] ?- Hobbies1 = .(tênis, .(música,[])), Hobbies2 = [esqui, comida], L = [ana,Hobbies1,pedro,Hobbies2]. Hobbies1 = [tênis,música] Hobbies2 = [esqui,comida] L = [ana, [tênis,música], pedro, [esqui,comida]] É comum tratar cauda como objeto simples. Exemplo: L=[a,b,c] Cauda=[b,c] L= .(a,Cauda) Para uma notação alternativa podemos usar a barra vertical L= [a | Cauda] [a,b,c] = [a | [b,c]] = [a,b | [c]] = [a,b,c | []] Operações em Listas Frequentemente, é necessário realizar operações em listas como por exemplo busca, para isso usasse a recursão, para verifica se um elemento está na lista verificasse se ele está na cabeça ou na cauda. Predicado de pertinência Inicialmente e preciso declarar o nome do predicado que verifica se o elemento está ou não na lista, exemplo: pertence(X,Y) A primeira condição especifica se o elemento X pertence a lista e se ele está na cabeça pertence(X,[X | Z]). A segunda condição especifica se o elemento X pertence a lista e se ele está na cauda pertence(X,[W | Z]) :- pertence(X,Z). Sempre que um procedimento recursivo é definido, deve-se procurar pelas condições limites (ou condições de parada) e pelo caso recursivo: pertence(Cabeca, [Cabeca|Cauda]). pertence(Cabeca, [OutraCabeca|Cauda]) :- pertence(Cabeca,Cauda). Por exemplo, ?- pertence(a,[a,b,c]). yes ?- pertence(d,[a,b,c]). no ?- pertence(X,[a,b,c]). X = a ; X = b ; X = c ; No Modo de chamada de predicados Para documentar como um procedimento deve ser chamado, utiliza-se a notação (como comentário no programa): + o argumento é de entrada (deve estar instanciado) – o argumento é de saída (não deve estar instanciado) ? o argumento é de entrada e saída (pode ou não estar instanciado) O procedimento pertence/2 documentado com o modo de chamada é: % pertence(?Elemento, +Lista) pertence(E, [E|_]). pertence(E, [_|Cauda]) :- pertence(E,Cauda). Definir o procedimento ultimo(Elem,Lista) para encontrar o ultimo elemente de uma lista O último elemento de uma lista que tem somente um elemento é o próprio elemento O último elemento de uma lista que tem mais de um elemento é o ultimo elemento da cauda Concatenar duas listas, formando uma terceira Se o primeiro argumento é a lista vazia, então o segundo e terceiro argumentos devem ser o mesmo Se o primeiro argumento é a lista não-vazia, então ela tem uma cabeça e uma cauda da forma [X|L1]; concatenar [X|L1] com uma segunda lista L2 resulta na lista [X|L3], onde L3 é a concatenação de L1 e L2 Último elemento de uma lista Último elemento da lista tem somente um elemento ele mesmo ultimo(Elemento, [Elemento]). Último elemento da lista tem mais de um elemento e é o último elemento da cauda ultimo(Elemento, [Cabeca|Cauda]) :- ultimo(Elemento,Cauda). Programa completo: % ultimo(?Elemento, +Lista) ultimo(Elemento, [Elemento]). ultimo(Elemento, [Cabeca|Cauda]) :- ultimo(Elemento,Cauda). Concatenar Listas Se o primeiro argumento é a lista vazia, então o segundo e terceiro argumentos devem ser o mesmo concatenar([ ],L,L). Se o primeiro argumento é a lista não-vazia, então ela tem uma cabeça e uma cauda da forma [X|L1]; concatenar [X|L1] com uma segunda lista L2 resulta na lista [X|L3], onde L3 é a concatenação de L1 e L2 concatenar([X|L1],L2,[X|L3]) :- concatenar(L1,L2,L3). Programa completo: % concatenar(?/+L1,?/?L2,+/?L) concatenar([ ],L,L). concatenar([X|L1],L2,[X|L3]) :- concatenar(L1,L2,L3).
Compartilhar