Ybadoo - Soluções em Software Livre
Turmas
1º Semestre de 2026

(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):

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).

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.