Beruflich Dokumente
Kultur Dokumente
. 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 .
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)
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]
X membro da lista L. Caso 1: X est no primeiro elemento da lista Caso 2: X est na cauda da lista
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
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
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.