Conteúdo 1 Prolog 1 2 Bases de conhecimento 1 1 Prolog Prolog De PROgrammation en LOGique Yap primeiro compilador de Prolog desenvolvido no DCC desde os anos 1980s Regra de Computação Escolhe o literal mais à esquerda num objectivo Regra de procura Escolhe as cláusulas de um predicado de cima para baixo Retrocesso Permite obter mais soluções da árvore SLD: ponto e vı́rgula (;) Unificação Não faz verificação de ocorrência de variáveis Notação 1. variáveis começam por maiúsculas 2. sı́mbolos de predicado, constantes e sı́mbolos funcionais começam com letras minúsculas 3. → é :4. Todas cláusulas terminam com ponto final . 2 Bases de conhecimento Prolog Uma base de conhecimento filho(bob,pam). %Bob é filho de Pam filho(bob,tom). filho(liz,tom). filho(ann,bob). filho(pat,bob). filho(jim,pat). mulher(pam). mulher(liz). mulher(ann). mulher(pat). homem(tom). homem(bob). homem(jim). Prolog Define os predicados especificados abaixo. 1 mae/2 mae(X,Y) sucede se X é mãe de Y avo/2 avo(X,Z) sucede se X é avô ou avó de Z irma/2 irma(X,Y) sucede se X é irmã de Y antecessor/2 antecessor(X,Z) sucede se X é antecessor de Z Prolog Caminhos num grafo acı́clico dirigido r(g,h). r(g,d). r(e,d). r(h,f). r(e,f). r(a,e). r(a,b). r(b,f). r(b,c). r(f,c). Prolog Define os predicados especificados abaixo. path/2 path(X,Y) sucede se no grafo existir um caminho de X para Y path n/3 path n(X,N,Y) sucede se no grafo existir um caminho de comprimento N de X para Y Gramática em Prolog /* Gramatica Independente de Contexto S -> NP VP NP -> DET NP2 NP2 -> NOME ADJS NP2 -> PN ADJS -> ADJ ADJS ADJS -> epsilon VP -> VI VP -> VT NP */ DET -> a NOME -> gato PN -> joana ADJ -> preto VT -> mordeu F → Fn Fv Fn → A N N → Nome Adjs | Np Adjs → Adj Adjs | ε 2 DET -> o Fv → Vt Fn A→a|o Nome → Np → Adj → Vt → Determinar predicados Prolog para representar a gramática e uma palavra aceite. Gramática em Prolog /*Pi posicoes na frase */ s(P0,P1) :- np(P0,P2),vp(P2,P1). np(P0,P1) :- det(P0,P2),np2(P2,P1). np2(P0,P1) :- nome(P0,P2),adjs(P2,P1). np2(P0,P1) :- pn(P0,P1). adjs(P0,P0). adjs(P0,P1) :- adj(P0,P2),adjs(P2,P1). vp(P0,P1) :- vi(P0,P1). vp(P0,P1) :- vt(P0,P2),np(P2,P1). /* lexico */ det(P0,P1) :- liga(o,P0,P1). det(P0,P1) :- liga(a,P0,P1). nome(P0,P1) :- liga(gato,P0,P1). pn(P0,P1) :- liga(joana,P0,P1). adj(P0,P1):- liga(preto,P0,P1). vt(P0,P1):- liga(mordeu,P0,P1). Gramática em Prolog /* uma frase */ liga(o,0,1). liga(gato,1,2). liga(mordeu,2,3). liga(a,3,4). liga(joana,4,5). Representação de dados estruturados Variáveis : X Pais Nome Constantes :a antonio 78 3 Termos complexos : f(a,X) nome(angela) pais(nome(portugal),lingua(portugues),continente(europa)) pais(portugal,portugues,europa) s(np(det(o),nome(gato)),vp(vt(mordeu),np(det(a),pn(joana)))) 0 s(0) s(s(0)) s(s(s(0))) ... arv(a,arv(b,vazia,vazia),arv(c,vazia,vazia)) Exemplos Inteiros como termos: inteiro(0). inteiro(s(N)):- inteiro(N). Exemplo: adição de inteiros em lógica soma(0,Y,Y). soma(s(X),Y,s(Z)):- soma(X,Y,Z). Exemplo: verificar se um termo é uma arvore binária arvore(vazia). arvore(arv(_,Esq,Dir)) :- arvore(Esq),arvore(Dir). Predicados não-lógicos Permitem: • Entrada/Saı́da: ler e escrever (write, get, etc) • Numéricos: para obter um aritmética mais eficiente • etc... Como tem efeitos secundários interfere com a resolução e o retrocesso!!! is X is Expression X is Y+1 se Y é um número Não permite unificação... 4