Recolher soluções e compor estruturas em Prolog

findall, bagof, setof, variáveis livres, diferenças de listas, DCG e predicados de ordem superior.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Recolha de soluções

PredicadoRepetições e ordemVariáveis livres em GSem 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 de G. Variáveis de G ausentes de T criam grupos em bagof/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 depois A=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. findall nã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/2 exige consumo completo; phrase/3 permite 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 objetivo P a 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; x exige prioridade menor, y permite menor ou igual. xfy associa à direita, yfx à esquerda: confirma com write_canonical/1.
  • O univ =../2 relaciona 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 fail para 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/2 ordena pela chave e conserva repetidos e a ordem dos empates; sort/2 também compara o valor e elimina duplicados.

Recolha, DCG e termos.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.