2016-07-03 1 views
5

Comment choisir entre bagof, setof et findall? Y a-t-il des différences importantes? Lequel est le plus couramment utilisé et quel est le plus sûr? Merci pour vos commentaires/réponses.Comment choisir entre bagof, setof et findall dans Prolog

J'ai vérifié le SWI-Prolog manual page on findall/3 et je les ai trouvés très semblables.

+2

Le lien que vous avez donné explique 'findall/3' versus' bagof/3'. 'setof/3' est comme' bagof/3', sauf qu'il supprime les solutions redondantes (les éléments de la liste de résultats sont uniques) et il classe les résultats dans l'ordre croissant. – lurker

+0

Réponse courte: dépend de ce que vous voulez réaliser. Vous pourriez obtenir plus de réponses _useful_ si vous décrivez un cas d'utilisation concret et comparez les trois ('bagof/3',' setof/3', et 'findall/3') dans le contexte de votre cas d'utilisation. –

Répondre

4

C'est une bonne question!

Je ne cherche pas à donner une réponse exhaustive, mais je voudrais suggérer quelques pistes de réflexion qui peuvent vous aider à comprendre ces prédicats mieux:

  • Pensez à laquelle de ces prédicats sont plus fondamental dans le sens de ce qui peut être exprimé en termes de ce que. Par exemple, pouvez-vous exprimer findall/3 en termes de setof/3? Et qu'en est-il de l'inverse? Cela aide à voir ce que vous devez fournir au moins pour implémenter tous ces prédicats. Pensez aux propriétés déclaratives qui sont conservées par ces prédicats. Par exemple, l'ordre dans lequel les solutions sont trouvées influence-t-il les résultats? Pour lequel de ces prédicats précisément? Est-ce que l'un de ces prédicats peut échouer? Dans quels cas précisément?
  • Pensez à la complexité de l'espace et du temps de chacun de ces prédicats. Lequel de ces prédicats, le cas échéant, peut-il être mis en œuvre et utilisé plus efficacement que d'autres? Et à quel coût et compromis?

De plus, je vous recommande de lire le livre de Richard O'Keefe Le Craft de Prolog pour obtenir des informations précieuses sur ces prédicats.

1

une différence importante que j'ai trouvé entre findall/3 et bagof/3, c'est que ce dernier ne copie pas les termes qu'il accumule dans la liste. Cela peut être fondamental, par exemple, lorsque votre liste va collecter variables attribuées, comme celles que vous utilisez lors de la modélisation d'un problème avec la bibliothèque (clpfd).