Usamos a notação
para designar uma função s do conjunto das variáveis no conjunto dos termos,
que à variável X associa o termo ana, à variável Z associa
o termo Y e deixa inalteradas as outras variáveis. Pondo de parte as questões
formais da possível confusão entre ``linguagem'' e ``meta-linguagem'', esta função s
pode ser definida da maneira habitual: para toda a variável V
Dizemos que s é uma substituição. Uma substituição aplica-se, de um modo natural, a termos, átomos ou cláusulas. Por exemplo, se aplicarmos a substituição s à cláusula
avo(X,Z) :- progenitor(X,Y), progenitor(Y,Z).
obteremos a cláusula
avo(ana,Y) :- progenitor(ana,Y), progenitor(Y,Y).
A esta cláusula resultante chamamos instância da primeira cláusula pela
substituição s. Uma instância por uma substituição, obtém-se substituindo as
variáveis pelos termos indicados na substituição. Se são as
únicas variáveis X para as quais
e se
utilizamos a notação
A substituição identidade é denotada por e deixa inalterada todas as
variáveis, e deste modo cada termo, átomo, cláusula, ... A imagem de um termo (átomo,
cláusula) por uma substituição é chamada instância do termo (átomo, cláusula) pela
substituição. Note-se que uma instância de uma instância de t é uma instância
de t. Mais formalmente, a composição de duas substituições, como uma função
sobre o conjunto dos termos (átomos, cláusulas) é ainda uma substituição. Estas
noções permitem dar um sentido rigoroso à noção de questão e resposta.
Seja P um programa e A um átomo. Uma resposta lógica (segundo P)
à questão
?- A.
é uma substituição s tal que s(A), instância de A por s,
é uma consequência lógica de P, quer dizer, .
Segue-se um exemplo para o nosso problema 1: à questão
?- avo(rosa,N).
uma das respostas lógicas, de acordo com o programa que fizemos, é