Sie sind auf Seite 1von 6

Introduo ao Prolog Prolog uma linguagem de programao para Inteligncia Artificial.

. As outras linguagens de programao so imperativas ou procedurais, enquanto o Prolog introduz um ponto de vista declarativo. Sintaxe a) Clusulas Um programa Prolog formado por clusulas. Um clusula Prolog uma clusula Horn ( A :- B 1,...Bn ou B1 and ... and Bn A) As clusulas podem ser regras ou fatos. Fato: progenitor(joao, carlos) Regra: filho(X,Y) :- progenitor(Y,X)

b) Regras c) Fatos So clusulas que so verdades incondicionais. uma clusula com uma ou mais condies. Para uma regra ser aplicada todas as condies devem ser verdadeiras. O lado direito so as condies e o lado esquerdo a concluso. O sinal :- significa se o lado esquerdo verdadeiro ento o lado direito tambm .

d) Argumentos Os argumentos podem ser tomos,nmeros, variveis ou estruturas.

e) tomos So objetos concretos(nmeros no so tomos). Palavras iniciadas com letras minsculas. Exemplo: joao,Carlos, etc String: Joao e Carlos.

f) Varivel So objetos gerais e so iniciados com letra maisculos. Exemplo: X, Y, etc. Podem ser substitudas por outros objetos, ou seja, so instanciadas. assumido que elas esto quantificadas universalmente. (Para todo X,Y)

Uma varivel annima iniciada com underline _.

g) Estruturas So funes que podem ter um ou mais argumentos Exemplo: start_data(6, may,1996) e triangle(point(2,4), point(3,4),point(5,7)) Uma estrutura definida por um nome e sua aridade Ex: start_data/3 e triangle/3.

Exerccio 1: A partir de uma base de dados com os seguintes fatos: homem(joao). homem(jose). homem(carlos). homem(antonio). mulher(ana). mulher(isabel). mulher(maria). progenitor(joao,ana,jose). progenitor(isabel,Jose,carlos). progenitor(isabel,Jose,antonio). homem(X) significa que X homem , mulher(X) significa que X mulher e progenitor(X,Y,Z) significa que X e Y so progenitores de Z. Defina os seguintes predicado: a) pai(X,Y) = X pai de Y b) mae(X,Y) = X pai de Y c) filho(X,Y) = X filho de Y d) irmo(X,Y) = X irmo de Y e) avos_materno (X,Y) = X um av materno de Y f) avos_paterno(X,Y) = X um av paterno de Y g) tio_materno(X,Y) = X tio materno de Y h) tio_paterno(X,Y) = X tio paterno de Y i) primo(X,Y) = X primo de Y j) sogra(X,Y) = X sogra de Y k) cunhado(X,Y) = X cunhado de Y

Listas Listas so seqncias de qualquer nmero de objeto. Ex Frutas = [maca,abacate,limao] As listas podem ser vazias ou no vazias Ex: [] ou = [maca,abacate,limao]. Uma lista vazia um tomo do Prolog. O primeiro elemento de uma lista chamado de cabea e o resto da lista de cauda: o Exemplo: [Cabeca|Cauda] = [maca|abacate,limao]

Uma lista pode ter como elemento outra lista.

Operaes sobre lista 1. member(X,L)

X membro da lista L. Caso 1: X est no primeiro elemento da lista Caso 2: X est na cauda da lista

member(X,[X|_]). member(X,[_|H]) :- member(X,H). 2. conc(L1,L2,L3) L3 a concatenao de L1 e L2 Inserir L2 depois de L1.

conc([],L2,L2). conc([X|H1],L2,[X|H2]) :- conc(H1,L2,H2). 3. delete(X,L1,L2) L2 a lista obtida por L1 aps a deleo de X. Caso 1: X o primeiro da lista L1. Caso 2: X no o primeiro da lista L1

delete(X,[X|L],L). delete(X,[Y|L1],[Y|L2]) :- delete(X,L1,L2). 4. sublist(S,L) S uma sublista de L. sublist([a,b,c],[a,b,c,d,e])

sublist(S,L) :- conc(S,_,L). 5. perm(L1,L2) L2 uma permutao de L1. perm([1,3,2],[3,2,1]).

perm([],[]). perm(L,[X|H]) :- delete(X,L,L1), perm(L1,H). 6. countList(L,T) T o tamanho de L. countList([a,b,c,d],4).

countList([],0). countList([X|L],N) :-countList(L,N1), N is N1 + 1. 7. mdc(X,Y,D) D o mximo divisor comum de X e Y. mdc(10,15,5).

mdc(X,0,X). mdc(X,Y,D) :- mdc(Y,X mod Y,D). Exercicio: Defina os seguintes predicados: a) soma(L,X) = X a soma da lista L. Ex: soma([2,3,4],9). b) produto(L,X) = X o produto da lista L. Ex: produto([2,3,4],24). c) max(L,X) = X o maior elemento da lista L. d) min(X,L) = X o menor elemento da lista L. Considere a seguinte base de dados representado o seguinte grafo:

aresta(a,b). aresta(b,c). aresta(c,d). aresta(c,e). aresta(f,e). aresta(e,d). aresta(a,f). aresta(f,g). aresta(f,c). aresta(g,c).

Defina o predicado caminho(X,Y) = existe um caminho de X para Y. Defina um predicado que dada uma lista L inverta a lista L. inverter(L1,L2) = L2 a lista L1 invertida. Ex: inverter([2,3,1,4],[4,1,2,3]). Defina um predicado que recebe uma lista e informa se essa lista palindrome ou no. palindrome([a,b,a]) Yes palindrome([a,b,b,a]) Yes palindrome([a,b,c,a]) No Defina um predicado que dado duas listas informa que essas duas listas so iguais: igual([a,b,c],[a,b,c]) Yes igual([a,b,c,d],[c,d,e]) No

Defina o predicado range(N,M,L): L a lista formada pelos nmeros de N at M. range(2,5,[2,3,4,5]). range(2,4,X). X = [2,3,4]. Operaes sobre conjuntos 1. subset(X,Y) a. X subconjunto de Y. b. mdc([2,3],[1,2,3,4]). subset([],[]) subset([X|R],S) :- member(X,S), subset(R,S). 2. union(X,Y,Z) a. Z a unio de X e Y. b. union([2,3],[3,4,5],[2,3,4,5]). union([],Z,Z). union([X|Y],Z,W) :- member(X,Z), union(Y,Z,W). union([X|Y],Z,[X|W]) :- \+member(X,Z), union(Y,Z,W) 3. intersection(X,Y,Z) a. Z a interseco de X e Y. b. union([2,3],[3,4,5],[3]). intersection([],Z,[]). intersection([X|Y],M,[X|Z]) :- member(X,M),intersection(Y,M,Z). intersection([X|Y],M, Z) :- \+ member(X,M),intersection(Y,M,Z). Defina pref(A,B) que testa se A prefixo de B. pref([1,2,3],[1,2,3,4,5]) pref([1,2,3],[1,4,3,4,5]) Yes No

Defina suf(A,B) que testa se A sufixo de B. suf([1,2,3],[4,5,1,2,3]) suf([1,2,3],[1,4,3,4,5]) Yes No

Podemos facilmente definir o predicado que testa se uma lista est ordenada ou no da seguinte maneira: ordenado([]). ordenado([X]). ordenado([X,Y|L]) :- X =<Y, ordenado(L).

Defina o predicado ordenar(L1,L2) que dado uma lista de inteiro L1 obtm uma lista ordenada L2.

Das könnte Ihnen auch gefallen