(Enade, 2005) Prolog é uma linguagem de programação lógica declarativa, fundamentada na lógica de primeira ordem. Em vez de detalhar sequências de instruções, o programador modela o problema descrevendo fatos e regras sobre o domínio. A execução ocorre por unificação e retrocesso (backtracking): diante de uma consulta, o motor de inferência tenta satisfazê-la combinando-a com a base de conhecimento, testando automaticamente caminhos alternativos até deduzir uma resposta válida ou esgotar as possibilidades. Considere os seguintes predicados escritos em Prolog.
xpto([ ], R, R).
xpto([ H | A ], Y, [ H | B]) :- xpto(A, Y, B).
zpto(X, [ X | _ ]).
zpto(X, [ _ | Z ]) :- zpto(X, Z).Com relação aos predicados escritos em Prolog apresentados, analise as assertivas abaixo e assinale V, se verdadeiras, ou F, se falsas.
( ) A execução de xpto([1,2,3], [ ], F) conclui com sucesso instanciando F para [1,2,3].
( ) A execução de xpto([1,2,3], [1,2,3], F) conclui sem sucesso.
( ) A execução de zpto(5, [1,2,3]) conclui sem sucesso.
( ) A execução de zpto(X, [1,2,3]) conclui com sucesso, instanciando X para 1.
A ordem correta de preenchimento dos parênteses, de cima para baixo, é:
A F – V – V – V.
B V – F – V – V.
C V – V – F – V.
D V – V – V – F.
E V – V – V – V.
1. Análise do predicado xpto:
xpto([ ], R, R).
xpto([ H | A ], Y, [ H | B]) :- xpto(A, Y, B).Este é o clássico predicado de concatenação de listas (geralmente chamado de append ou conc em Prolog):
H) da primeira lista e o coloca no início da terceira lista.[]).xpto([], R, R) entra em ação, fazendo com que o "resto" da terceira lista seja exatamente a segunda lista (Y ou R).Ou seja, xpto(Lista1, Lista2, Lista3) é verdadeiro se Lista3 for a junção de Lista1 com Lista2.
2. Análise do predicado zpto:
zpto(X, [ X | _ ]).
zpto(X, [ _ | Z ]) :- zpto(X, Z).Este é o clássico predicado de pertinência a lista (geralmente chamado de member).
X é membro da lista se X for a cabeça (o primeiro elemento) da lista.X é membro da lista se X for membro da cauda (Z) da lista.Ou seja, zpto(Elemento, Lista) é verdadeiro se Elemento existir dentro da Lista.
( ) A execução de xpto([1,2,3], [ ], F) conclui com sucesso instanciando F para [1,2,3].
Verdadeira: como xpto concatena a primeira lista com a segunda, ao concatenar [1,2,3] com uma lista vazia [], o resultado F será simplesmente [1,2,3].
( ) A execução de xpto([1,2,3], [1,2,3], F) conclui sem sucesso.
Falsa: a execução conclui com sucesso. O predicado vai concatenar [1,2,3] com [1,2,3], resultando em F = [1,2,3,1,2,3]. Não há nenhum motivo para falhar, pois as regras cobrem qualquer combinação de listas válidas.
( ) A execução de zpto(5, [1,2,3]) conclui sem sucesso.
Verdadeira: o predicado zpto verifica se 5 é um membro da lista [1,2,3]. Como o número 5 não está na lista, o Prolog vai percorrer toda a lista, chegar ao fim (lista vazia) e falhar (concluir sem sucesso).
( ) A execução de zpto(X, [1,2,3]) conclui com sucesso, instanciando X para 1.
Verdadeira: estamos perguntando ao Prolog: "Quem é o X que faz parte da lista [1,2,3]?". O Prolog usa a primeira regra (zpto(X, [X | _])), unifica X com o primeiro elemento da lista e retorna com sucesso X = 1.
Observação: se o usuário pedisse mais soluções pressionando ";", o Prolog também retornaria X = 2 e X = 3, mas a afirmativa está correta ao dizer que ele conclui com sucesso instanciando X para 1 na primeira resposta.
Conforme exposto, a resposta correta é:
B V – F – V – V.