Conteúdo 1 Prolog 2 Bases de conhecimento

Propaganda
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
Download