Anda di halaman 1dari 60

Introduo Programao Prolog (Tutorial)

Esta aula introduz conceitos bsicos da linguagem de programao lgica Prolog Os conceitos so introduzidos atravs de um tutorial sobre relaes familiares Maiores detalhes sobre terminologia e notao sero vistos nas prximas aulas
Inteligncia Artificial

Introduo
Prolog = Programming in Logic Linguagem de programao utilizada para resolver problemas envolvendo objetos e relaes entre objetos Conceitos bsicos: fatos, perguntas, variveis, conjunes e regras Conceitos avanados: listas e recurso

Programao Lgica
Programao Procedural (procedimental):
Programa = Algoritmo + Estruturas de Dados

Programao Lgica
Algoritmo = Lgica + Controle Programa = Lgica + Controle + Estruturas de Dados Em PL, programa-se de forma declarativa, ou seja, especificando o que deve ser computado ao invs de como deve ser computado
3

Programao em Prolog
Programar em Prolog envolve: 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 de dados e Prolog

Objetos Objetos Simples Estruturas Constantes tomos Variveis

Nmeros

tomos
So cadeias compostas pelos seguintes caracteres: letras maisculas: A, B, ..., Z letras minsculas: a, ..., z dgitos: 1, 2, ..., 9 caracters especiais, tais como: *, +, >, _, =, :, ., &.

Objetos

Objetos Simples Estruturas Constantes tomos Variveis

Nmeros

tomos (cont)
Podem ser construdos de trs maneiras: cadeias de letras, dgitos e o caractere _, comeando com uma letra minscula. cadeias de caracteres especiais cadeias de caracteres entre apstrofos
7

Objetos Objetos Simples Estruturas Constantes tomos Variveis

Nmeros

Nmeros
Incluem nmeros inteiros e nmeros reais.

Objetos Objetos Simples Estruturas Constantes tomos Variveis

Nmeros

Variveis
So cadeias de letras, dgitos e caracteres _, Objetos sempre comeando com letra maiscula ou com o Objetos Simples Estruturas caractere _. Constantes tomos Variveis

Nmeros

Estruturas
So objetos de dados que tm vrios componentes, Objetos podendo cada um deles, por sua vez, ser uma Objetos Simples Estruturas estrutura. Constantes tomos Variveis

Nmeros

10

Definindo Relaes por Fatos


Sara Abrao

Isaque

Ismael

A figura ao lado mostra um exemplo da relao famlia O fato que Abrao um progenitor de Isaque pode ser escrito em Prolog como:
progenitor(abrao,isaque).

Esa

Jac

Neste caso definiu-se progenitor como o nome de uma relao; abrao e isaque so seus argumentos

Jos
11

Definindo Relaes por Fatos


Sara Abrao

A rvore familiar completa em Prolog :


progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

Isaque

Ismael

Esa

Jac

Jos

Este programa consiste de seis clusulas Cada uma dessas clusulas declara um fato sobre a relao progenitor
12

Definindo Relaes por Fatos


Sara Abrao

Por exemplo
progenitor(abrao,isaque).

Isaque

Ismael

Esa

Jac

uma instncia particular da relao progenitor Esta instncia tambm chamada de relacionamento Em geral, uma relao definida como o conjunto de todas suas instncias

Jos
13

Definindo Relaes por Fatos


A ordem dos argumentos em uma relao definida arbitrariamente, mas deve ser seguida e usada de forma consistente progenitor(abrao,isaque)
significa que Abrao progenitor de Isaque

progenitor(isaque,abrao)
significa que Isaque progenitor de Abrao

Note que progenitor(abrao,isaque) no tem o mesmo significado que progenitor(isaque,abrao)


14

Definindo Relaes por Fatos


Os nomes das relaes e seus argumentos so arbitrrios, ou seja:
progenitor(abrao,isaque) a(b,c)

so semanticamente equivalentes desde que


a signifique progenitor b signifique abrao e c signifique isaque

Normalmente, o programador escolhe nomes significativos


15

Definindo Relaes por Fatos


Sara Abrao Isaque Ismael

Esa

Jac

Jos

Quando o programa interpretado/compilado, pode-se questionar Prolog sobre a relao progenitor, por exemplo: Isaque o pai de Jac? Esta pergunta pode ser comunicada Prolog digitando: ?- progenitor(isaque,jac). Como Prolog encontra essa pergunta como um fato inserido em sua base, Prolog responde: yes

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

16

Definindo Relaes por Fatos


Sara Abrao

Uma outra pergunta pode ser ?- progenitor(ismael,jac).


Ismael

Isaque

Prolog responde: no porque o programa no menciona nada sobre Ismael como sendo o progenitor de Jac Prolog tambm responde no pergunta: ?- progenitor(jac,moiss). no

Esa

Jac

Jos

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

17

Definindo Relaes por Fatos


Sara Abrao Isaque Ismael

Perguntas mais interessantes tambm podem ser efetuadas: Quem o progenitor de Ismael? ?- progenitor(X,ismael). Neste caso, Prolog no vai responder apenas yes ou no. Prolog fornecer o valor de X tal que a pergunta acima seja verdadeira Assim a resposta : X = abrao

Esa

Jac

Jos

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

18

Definindo Relaes por Fatos


Sara Abrao Isaque Ismael

A pergunta Quais os filhos de Isaque? pode ser escrita como: ?- progenitor(isaque,X). Neste caso, h mais de uma resposta possvel; Prolog primeiro responde com uma soluo: X = esa Pode-se requisitar uma outra soluo (digitando ;) e Prolog encontra: X = jac Se mais solues forem requisitadas, Prolog responde no pois todas as solues foram exauridas (no = sem mais solues)
19

Esa

Jac

Jos

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

Definindo Relaes por Fatos


Sara Abrao Isaque Ismael

Esa

Jac

Questes mais amplas podem ser efetuadas: Quem o progenitor de quem? Reformulando: encontre X e Y tais que X o progenitor de Y ?- progenitor(X,Y). Prolog encontra todos os pares progenitor-filho um aps o outro As solues so mostradas uma de cada vez:
X = sara X = abrao X = abrao ... Y = isaque; Y = isaque; Y = ismael;

Jos

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).

As solues podem ser interrompidas digitando [enter] ao invs de ;


20

Definindo Relaes por Fatos


Perguntas mais complexas tambm podem ser efetuadas, tais como: Quem o av de Jos? Como nosso programa no conhece diretamente a relao av, esta pergunta deve ser desmembrada em dois passos
(1) Quem o progenitor de Jos? Assuma que um Y (2) Quem o progenitor de Y? Assuma que um X
X

progenitor
Y

av

Esta pergunta composta pode ser escrita em Prolog como: ?-progenitor(Y,jos),progenitor(X,Y). X = isaque Y = jac

progenitor
Jos

21

Definindo Relaes por Fatos


A pergunta composta
?- progenitor(Y,jos), progenitor(X,Y).

Pode ser lida como:


Encontre X e Y tais que satisfaam os seguintes requisitos progenitor(Y,jos) e progenitor(X,Y)

De maneira similar, podemos perguntar: Quem so os netos de Abrao?


?- progenitor(abrao,X), progenitor(X,Y). X = isaque Y = esa; X = isaque Y = jac
22

Definindo Relaes por Fatos


Outro tipo de pergunta pode ser efetuado: Esa e Jc tm um progenitor em comum? Isso pode ser expresso em duas etapas:
Quem o progenitor, X, de Esa? (este mesmo) X um progenitor de Jac?

A pergunta correspondente em Prolog :


?- progenitor(X,esa), progenitor(X,jac). X = isaque

23

Pontos Importantes
O nome de uma relao deve comear com uma letra minscula A relao escrita primeiro e os seus argumentos so separados por vrgulas e colocados entre parnteses O ponto final . deve seguir o final do fato fcil definir uma relao em Prolog, por exemplo a relao progenitor, escrevendo ntuplas de objetos que satisfazem a relao O usurio pode perguntar ao sistema Prolog sobre relaes definidas no programa
24

Pontos Importantes
Um programa Prolog consiste de clusulas; cada clusula termina com um ponto final Os argumentos das relaes podem (entre outras coisas) ser: objetos concretos ou constantes (tais como abrao e isaque) ou objetos gerais tais como X e Y. Objetos do primeiro tipo so chamados tomos; objetos do segundo tipo so chamados variveis A aridade de uma relao o seu nmero de argumentos e denotada como uma barra seguida pela aridade progenitor/2 significa que a relao progenitor possui
2 argumentos, ou que a relao progenitor tem aridade 2
25

Pontos Importantes
Perguntas consistem em uma ou mais clusulas
Uma seqncia de clusulas, tal como: progenitor(X,esa), progenitor(X,jac) Significa a conjuno das clusulas
X um progenitor de Esa e X um progenitor de Jac

A resposta a uma pergunta pode ser


Positiva: a pergunta satisfatvel e teve sucesso (suceeded) Negativa: a pergunta insatisfatvel e falhou (failed)

Se vrias respostas satisfazem uma pergunta, Prolog encontra tantas quantas possveis
Se o usurio estiver satisfeito com a resposta, basta digitar return Se desejar mais respostas, usa-se ponto-e-vrgula ;

26

Exerccio
Expressar em portugus: valioso(ouro). femea(jane). possui(joao,ouro). pai(joao,maria). da(joao,livro,maria).

27

Exerccio
gosta(joao, peixe). gosta(joao,maria). gosta(maria,livro). gosta(pedro,livro). gosta(maria,flor). gosta(maria,vinho).
Quais as respostas dadas por Prolog?

???????-

gosta(maria,X). gosta(X,livro). gosta(Quem,Oque). gosta(X,Y). gosta(X,X). gosta(_a,_b). gosta(A,peixe).

28

Exerccio
Sara Abrao Isaque Ismael

Esa

Jac

Jos

Quais as respostas dadas por Prolog? (a) ?- progenitor(jos,X). (b) ?- progenitor(X,jos). (c) ?- progenitor(sara,X), progenitor(X,jac). (d) ?- progenitor(sara,X), progenitor(X,Y), progenitor(Y,jos).

progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos).


29

Definindo Relaes por Regras


Nosso programa sobre famlias pode ser estendido de vrias formas Vamos adicionar a informao sobre o sexo das pessoas envolvidas na relao progenitor Por exemplo:
mulher(sara). homem(abrao). homem(isaque). homem(ismael). homem(esa). homem(jac). homem(jos).

As relaes mulher e homem so relaes unrias Uma relao binria, como progenitor, define um relacionamento entre pares de objetos Relaes unrias so usadas para declarar propriedades simples sim/no dos objetos A primeira clusula unria pode ser lida como Sara uma mulher
30

Definindo Relaes por Regras


Informao sobre o sexo das pessoas envolvidas na relao progenitor:
mulher(sara). homem(abrao). homem(isaque). homem(ismael). homem(esa). homem(jac). homem(jos).

Podemos declarar a mesma informao usando uma relao binria sexo:


sexo(sara,feminino). sexo(abrao,masculino). sexo(isaque,masculino). sexo(ismael,masculino). sexo(esa,masculino). sexo(jac,masculino). sexo(jos,masculino).

31

Escolhendo Objetos e Relaes


Como representar: Sara uma mulher
mulher(sara).
Permite responder: Quem mulher? No permite responder: Qual o sexo de Sara?

sexo(sara,feminino).
Permite responder: Quem mulher? Permite responder: Qual o sexo de Sara? No permite responder: Qual a propriedade de Sara que tem o valor feminino?

propriedade(sara,sexo,feminino).
Permite responder todas as perguntas Representao objeto-atributo-valor
32

Definindo Relaes por Regras


Vamos estender o programa introduzindo a relao filho_geral como o inverso da relao progenitor Podemos definir filho_geral de maneira similar relao progenitor, ou seja enumerando uma lista de fatos sobre a relao filho_geral, por exemplo
filho_geral(isaque,sara). filho_geral(iisaque,abrao). filho_geral(ismael,abrao). ...
33

Definindo Relaes por Regras


Entretanto, a relao filho_geral pode ser definida de modo mais elegante:
Para todo X e Y, Y um filho_geral de X se X um progenitor de Y.

Em Prolog:
filho_geral(Y,X) :progenitor(X,Y).

Esta clusula tambm pode ser lida como:


Par todo X e Y, se X um progenitor de Y ento Y um filho_geral de X
34

Definindo Relaes por Regras


Clusulas Prolog como:
filho_geral(Y,X) :progenitor(X,Y).

so chamadas regras (rules) H uma diferena importante entre fatos e regras:


Um fato sempre verdadeiro (verdade incondicional) Regras especificam coisas que so verdadeiras se alguma condio satisfeita
35

Definindo Relaes por Regras


filho_geral(Y,X) :- progenitor(X,Y).

Cabea (head) ou concluso da regra (lado esquerdo da regra)

Corpo (body) ou condio da regra (lado direito da regra)

36

Definindo Relaes por Regras


Vamos perguntar se Ismael filho_geral de Abrao:
?- filho_geral(ismael,abrao).

Como no h fatos sobre a relao filho_geral, a nica forma de Prolog responder esta pergunta aplicando a regra sobre filho_geral
filho_geral(Y,X) :progenitor(X,Y).

A regra geral no sentido que aplicvel a quaisquer objetos X e Y; portanto ela pode tambm ser aplicada a objetos particulares tais como ismael e abrao Para aplicar a regra a ismael e abrao, Y tem que ser substitudo por ismael e X por abrao Neste caso, dizemos que as variveis X e Y esto instanciadas a:
X = abrao e Y = ismael

Depois da instanciao, obtemos um caso especial da regra geral, que :


filho_geral(ismael,abrao) :progenitor(abrao,ismael).
37

Definindo Relaes por Regras


A condio da regra com as variveis instanciadas
filho_geral(ismael,abrao) :progenitor(abrao,ismael).

:
progenitor(abrao,ismael).

Assim, Prolog tenta provar que a condio verdadeira Para provar a condio, trivial por Prolog encontra um fato correspondente no programa Isso implica que a concluso da regra tambm verdadeira e Prolog responde afirmativamente pergunta:
?- filho_geral(ismael,abrao). yes

38

Definindo Relaes por Regras


Vamos incluir a especificao da relao me, com base no seguinte fundamento lgico:
Para todo X e Y, X a me de Y se X um progenitor de Y e X uma mulher.

Traduzindo para Prolog:


me(X,Y) :progenitor(X,Y), mulher(X).

Uma vrgula entre duas condies indica a conjuno das condies, significando que ambas condies tm que ser verdadeiras
39

Definindo Relaes por Regras


Exemplo: de Portugus para Prolog
Uma pessoa me se tiver algum filho e essa pessoa for mulher Uma pessoa me se for progenitor de algum e essa pessoa for mulher Uma pessoa X me de Y se X for progenitor de Y e X for mulher X me de Y se X progenitor de Y e X mulher me(X,Y) :progenitor(X,Y), mulher(X).
40

Definindo Relaes por Regras


Em Prolog, uma regra consiste de uma cabea e uma corpo A cabea e o corpo so conectados pelo smbolo :-, denominado neck, formado por dois pontos e hfen :- pronunciado se me(X,Y) :- progenitor(X,Y), mulher(X).

41

Exerccio
Identifique a cabea e cauda de cada regra. Expressar cada regra em Portugus: gosta(joao,X) :gosta(X,vinho), gosta(X,comida). gosta(joao,X) :mulher(X), gosta(X,vinho).
42

Exerccio
Usando a base ao lado, defina a regra: Uma pessoa pode roubar algo se essa pessoa um ladro e ela gosta de um objeto Qual a resposta dada por Prolog a pergunta: Joo rouba o qu?
ladrao(joao). ladrao(pedro). gosta(maria,flor). gosta(maria,queijo). gosta(maria,vinho). gosta(joao,rubi). gosta(joao,X) :gosta(X,vinho).

43

Grafos Definindo Relaes


Relaes como progenitor, filho_geral e me podem ser ilustradas por diagramas que seguem as seguintes convenes
Ns nos grafos correspondem a objetos (argumentos das relaes) Arcos entre ns correspondem a relaes binrias (2 argumentos) Arcos so orientados apontando do primeiro argumento da relao para o segundo argumento Relaes unrias so indicadas nos diagramas simplesmente marcando os objetos correspondentes com o nome da relao As relaes sendo definidas so representadas por arcos tracejados
mulher

X
progenitor

X
progenitor filho_geral

X
progenitor me

Y
progenitor

av_geral

Z
44

Grafos Definindo Relaes


Cada diagrama deve ser interpretado da seguinte forma: se as relaes mostradas pelos arcos slidos so verdadeiras ento a relao mostrada pelo arco tracejado tambm verdadeira Assim, a relao av_geral pode ser imediatamente escrita como:
av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z).
mulher

X
progenitor

X
progenitor filho_geral

X
progenitor me

Y
progenitor

av_geral

Z
45

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, fcil de ler Assim, um padro escrever a cabea de uma clusula bem como cada condio em seu corpo em uma linha separada Alm disso, as condies so deslocadas de modo a melhor separar a cabea do corpo de uma regra
46

Layout de um Programa Prolog


Por exemplo, a relao
av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z).

deve ser escrita da seguinte forma:


av_geral(X,Z) :progenitor(X,Y), progenitor(Y,Z).

47

Definindo Relaes por Regras


A relao irmo pode ser definida como:
Para todo X e Y, X irmo de Y se ambos X e Y tm um progenitor em comum e X um homem.
Z
progenitor homem progenitor

Em Prolog:
irmo(X,Y) :progenitor(Z,X), progenitor(Z,Y), homem(X).

irmo

Note a forma de expressar ambos X e Y tm um progenitor em comum:


Algum Z deve ser o progenitor de X e este mesmo Z deve ser o progenitor de Y

Uma forma alternativa, mas menos elegante seria: Z1 progenitor de X e Z2 progenitor de Y e Z1 igual a Z2
48

Definindo Relaes por Regras


Podemos perguntar a Prolog:
?- irmo(esa,jac). yes

Portanto, poderamos concluir que a relao irmo, como definida, funciona corretamente Entretanto h uma falha em nosso programa que revelada se perguntamos Quem o irmo de Jac?
?- irmo(X,jac).

Prolog fornecer duas respostas


X = esa ; X = jac

Assim, Jac irmo dele mesmo? Provavelmente isso no era bem o que tnhamos em mente quando definimos a relao irmo Entretanto, de acordo com nossa definio sobre irmos, a resposta de Prolog perfeitamente lgica

49

Definindo Relaes por Regras


Nossa regra sobre irmos no menciona que X e Y no devem ser a mesma pessoa se X deve ser irmo de Y Como isso no foi definido, Prolog (corretamente) assume que X e Y podem ser a mesma pessoa e como conseqncia encontra que todo homem que tem um progenitor irmo de si prprio Para corrigir a regra sobre irmos, devemos adicionar a restrio que X e Y devem ser diferentes Veremos nas prximas aulas como isso pode ser efetuado de diversas maneiras, mas para o momento, vamos assumir que a relao diferente j conhecida de Prolog e que diferente(X,Y) satisfeita se e somente se X e Y no so iguais Isso nos leva seguinte regra sobre irmos:
irmo(X,Y) :progenitor(Z,X), progenitor(Z,Y), homem(X), diferente(X,Y).

50

Pontos Importantes
Programas Prolog podem ser estendidos simplesmente pela adio de novas clusulas Clusulas Prolog so de trs tipos: fatos, regras e perguntas
Fatos declaram coisas que so sempre (incondicionalmente) verdadeiras Regras declaram coisas que so verdadeiras dependendo de determinadas condies Atravs de perguntas, o usurio pode questionar o programa sobre quais coisas so verdadeiras

Clusulas Prolog consistem em uma cabea e o corpo; o corpo uma lista de condies separadas por vrgulas (que significam conjunes) Fatos so clusulas que tm uma cabea e o corpo vazio; perguntas tm apenas o corpo; regras tm uma cabea e um corpo (no vazio)
51

Pontos Importantes
Durante a computao, uma varivel pode ser substituda por um objeto: dizemos que a varivel est instanciada As variveis so universalmente quantificadas e so lidas como Para todo Todavia, leituras alternativas so possveis para variveis que aparecem apenas no corpo Por exemplo:
temfilhos(X) :- progenitor(X,Y).

Pode ser lida de duas formas:


Para todo X e Y, se X um progenitor de Y ento X tem filhos Para todo X, X tem filhos se existe algum Y tal que X um progenitor de Y
52

Exerccios
Traduza para Prolog: Todo mundo que tem filho feliz (defina a relao unria feliz) Defina as relaes irm e irmo_geral Defina a relao neto_geral usando a relao progenitor Defina a relao tio(X,Y) em termos das relaes progenitor e irmo

53

Regras Recursivas
Vamos adicionar a relao ancestral Esta relao ser definida por duas regras: a primeira ser o caso base (no recursivo) e a segunda ser o caso recursivo
Para todo X e Z, X um ancestral de Z se X um progenitor de Z. ancestral(X,Z) :progenitor(X,Z).
X
progenitor ancestral

54

Regras Recursivas
X
progenitor progenitor

X
progenitor

Y
progenitor

ancestral progenitor

Y1
ancestral progenitor

Y1

Y2 Z
progenitor progenitor

Y2

ancestral

ancestral(X,Z) :progenitor(X,Y), progenitor(Y,Z).

Y3
progenitor

ancestral(X,Z) :progenitor(X,Y1), progenitor(Y1,Y2), progenitor(Y2,Z).

ancestral(X,Z) :Z progenitor(X,Y1), progenitor(Y1,Y2), progenitor(Y2,Y3), progenitor(Y3,Z).


55

Regras Recursivas
Para todo X e Z, progenitor X um ancestral de Z se Y h algum Y tal que X um progenitor de Y e Y um ancestral de Z. ancestral ... ancestral(X,Z) :progenitor(X,Y), ancestral(Y,Z).
Z
56

ancestral

Regras Recursivas
ancestral(X,Z) :% caso base progenitor(X,Z). ancestral(X,Z) :% caso recursivo progenitor(X,Y), ancestral(Y,Z). Podemos perguntar: quais os descendentes de Sara?
?- ancestral(sara,X). X = isaque; X = esa; X = jac; X = jos
57

Programa da Famlia Bblica


progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). mulher(sara). homem(abrao). homem(isaque). homem(ismael). homem(esa). homem(jac). homem(jos). filho_geral(Y,X) :progenitor(X,Y). me(X,Y) :progenitor(X,Y), mulher(X). av_geral(X,Z) :progenitor(X,Y), progenitor(Y,Z). irmo(X,Y) :progenitor(Z,X), progenitor(Z,Y), homem(X). ancestral(X,Z) :progenitor(X,Z). ancestral(X,Z) :progenitor(X,Y), ancestral(Y,Z).
58

Exerccio
Vimos a seguinte definio da relao ancestral
ancestral(X,Z) :progenitor(X,Z). ancestral(X,Z) :progenitor(X,Y), ancestral(Y,Z).
X
progenitor

Considere a seguinte definio alternativa:


ancestral(X,Z) :progenitor(X,Z). ancestral(X,Z) :progenitor(Y,Z), ancestral(X,Y).
ancestral

ancestral

...

Esta uma definio correta de ancestrais? possvel modificar o diagrama de forma a corresponder a esta nova definio?

Z
59

Slides baseados nos livros: Bratko, I.; Prolog Programming for Artificial Intelligence, 3rd Edition, Pearson Education, 2001. Clocksin, W.F.; Mellish, C.S.; Programming in Prolog, 5th Edition, Springer-Verlag, 2003.
Material baseado em slides de Jos Augusto Baranauskas USP-Ribeiro Preto
60