Buscar

Inteligencia Artificial

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 23 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 23 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 23 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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).

Outros materiais