Recolher soluções e compor estruturas em Prolog
findall, bagof, setof, variáveis livres, diferenças de listas, DCG e predicados de ordem superior.
Recolha de soluções
| Predicado | Repetições e ordem | Variáveis livres em G | Sem soluções |
|---|---|---|---|
findall(T,G,L) | Conserva a enumeração e repetições. | Não agrupam. | Sucede com []. |
bagof(T,G,L) | Conserva repetições em cada grupo. | Criam grupos. | Falha. |
setof(T,G,L) | Ordena por termos e elimina repetidos. | Criam grupos. | Falha. |
Té o template recolhido por prova deG. Variáveis deGausentes deTcriam grupos embagof/setof, salvo quantificação existencial com^.- Com
inscrito(ana,pfl). inscrito(ana,lbaw). inscrito(bruno,pfl).:bagof(C,inscrito(A,C),L)dáA=ana,L=[pfl,lbaw]e depoisA=bruno,L=[pfl]: pedir mais respostas percorre grupos.bagof(C,A^inscrito(A,C),L)dá[pfl,lbaw,pfl], sem agrupar por pessoa.setof(C,A^inscrito(A,C),L)dá[lbaw,pfl].
- A recolha completa exige que a enumeração termine.
findallnão fornece um prefixo de uma procura infinita; as ligações interiores não se tornam respostas exteriores.
Diferenças de listas
[a,b|T] é uma lista aberta: T ainda não tem valor e preenchê-la acrescenta a continuação sem copiar o prefixo. Uma diferença de listas é o par entre a lista completa e a cauda por preencher, como [a,b|T]-T.
juntar_dl(A-B, B-C, A-C).
Para juntar, unifica T com [c|U] e obtém [a,b,c|U]-U; para fechar, unifica U=[]. Exige caudas abertas frescas: reutilizar uma cauda com a própria estrutura pode criar um ciclo. A ligação não percorre o prefixo; construir, converter ou copiar as listas tem outros custos.
Gramáticas e tradução DCG
s --> [a], s, [b].
s --> [].
- Uma DCG descreve uma sequência de tokens; a tradução acrescenta a entrada e o resto como argumentos, como nas diferenças de listas.
phrase(s,[a,a,b,b])sucede;phrase(s,[a,b,a,b])falha.phrase/2exige consumo completo;phrase/3permite observar o resto.- Recursão à esquerda antes de consumir um token pode entrar num ciclo. A ordem das alternativas e o modo de chamada afetam a procura.
Predicados meta e operadores
call(P,X)aplica o objetivoPa um argumento adicional.maplist(P,Lista)pede que o predicado se prove para todos os elementos; não devolve uma lista transformada. A forma com duas listas relaciona elementos correspondentes.op(Prioridade,Tipo,Nome)muda a leitura da sintaxe, não cria operações. Número menor liga mais forte;xexige prioridade menor,ypermite menor ou igual.xfyassocia à direita,yfxà esquerda: confirma comwrite_canonical/1.- O univ
=../2relaciona um termo com[Nome|Argumentos];call(Termo)tenta provar o objetivo construído. Construir e executar são operações distintas. - Para mostrar todas as tarefas com impressão por retrocesso, enumera, imprime e usa
failpara pedir a seguinte, com uma segunda cláusula para sucesso final. Pressupõe enumeração finita; os efeitos de I/O não são anulados pelo retrocesso. - Para ordenar, recolhe pares
Chave-Valor:keysort/2ordena pela chave e conserva repetidos e a ordem dos empates;sort/2também compara o valor e elimina duplicados.