Dispõe de 3:00 horas para realizar este exame |
Leia as questões com toda a atenção |
e responda com calma e clareza em folha convencional |
Em resposta ao conhecimento expresso nas frases
resolveu-se considerar a seguinte BC:
homem(incompetente,nao_prudente). homem(ignorante,sem_esperanca). homem(violento,incompetente). homem(nao_prudente,ignorante). homem(X,Y) :- homem(X,Z), homem(Z,Y).
Supondo que forçamos sempre o backtracking (digitando ;), cada vez que obtemos uma resposta do interpretador de Prolog, descreva, justificando por meio da árvore de procura, o que se obteria colocando a seguinte questão:
?- homem(nao_prudente,X).
Implemente em Prolog o predicado separa/4, que recebe no primeiro
argumento um objecto, no segundo uma lista, e nos devolve no terceiro argumento todos os
elementos da lista antes da primeira ocorrência do objecto e no último parâmetro os
elementos que sucedem na lista ao objecto em questão.
Exemplo:
?- separa(*,[1,2,3,4,*,a,b,c,d],A,D). A = [1,2,3,4] D = [a,b,c,d]
Recordando o que sabe sobre árvores binárias e seu manuseamento, responda às alineas seguintes.
?- altura(arv(1,arv(2,v,v),v),N). N = 2 ?- altura(arv(1,arv(2,v,v),arv(1,v,arv(8,v,arv(8,v,v)))),N). N = 4
A árvore vazia é balanceada. Se não for vazia, uma árvore diz-se balanceada quando a altura da sua árvore esquerda não diferir da altura da sua árvore direita por mais de 1 unidade e as suas árvores esquerda e direita forem também balanceadas.
Implemente em Prolog o predicado balanceada/1 que receba uma árvore
binária e retorne yes caso a árvore binária seja balanceada e no na
situação contrária.
Exemplos:
?- balanceada(arv(1,v,arv(2,arv(2,v,v),v))). no ?- balanceada(arv(1,v,arv(2,v,v))). yes
Para estudos na área da demografia das populações, construiu-se uma base de
conhecimento (BC) com os dados que se poderam recolher sobre cada individuo,
sobre os casais e sobre os descendentes (note-se que tanto os membros
dos casais, como os filhos, têm de ser individuos). Para manipular essa BC foram,
também, desenvolvidos alguns predicados operacionais, tais como validaFam/1 e filho/2.
O extracto de Prolog seguinte mostra essa BC.
%indiv( C,N,LNasc,DNasc ) :- C 'e o codigo do individuo de nome N, % nascido no local LNasc na data DNasc. indiv( p001,joao,porto,1983 ). indiv( p002,nuno,lisboa,1955 ). indiv( p003,maria,braga,1956 ). indiv( p004,joana,aveiro,1986 ). %casal( C,CMu,CMa,D ) :- C 'e o codigo que identifica o casal cuja mulher % 'e o individuo de codigo CMu, o marido 'e o individuo % de codigo CMa, casados na data D casal( cp001,p003,p002,1980 ). %descendente( CC,CI) :- CI 'e o codigo de um individuo que 'e filho do casal CC descendente( cp001,p001 ). descendente( cp001,p004 ). validaFam(Cod) :- casal(Cod, Mu, Ma, DC), indiv(Mu, _, DNMu, _), TolMu is DNMu+15, DC >= TolMu, indiv(Ma, _, DNMa, _), TolMa is DNMa+15, DC >= TolMa. filho(F,Prog) :- indiv(CodF, F, _, _), indiv(CodP, Prog, _, _), descendente(CodFam, CodF), ( casal(CodFam, CodP, _, _); casal(CodFam, _, CodP, _)).
Responda, então, às alíneas seguintes:
CASAL <cod> (Codmul,Codmar,data) FILHOS <(CodF1,Data1),...>
Pretende-se construir um programa que seja capaz de ler palavras (sequências de letras
separadas por 1 ou mais espaços, ou new-line (NL)) e reconhecer conceitos, que podem ser
expressos por palavras diferentes.
Considere-se por exemplo a seguinte lista (reduzida):
giro = lindo = belo --> conceito(bonito) bera = fraco --> conceito(mau) ricaco = riquinho --> conceito(rico)
Uma forma fácil e eficiente de implementar tal programa é concebê-lo como um ciclo
standard guiado por um autómato determinista, que vá lendo caracteres e transitando de
estado por cada caracter lido, até chegar ao fim duma palavra (nessa altu Assim sendo,
pede-se-lhe que desenhe o referido autómato determinista para reconhecer os conceitos e
as palavras indicadas acima (todas as outras palavras devem ser rejeitadas, como erro).
Represente o autómato em causa numa BC em Prolog.