2 votes

SWI Prolog bases de connaissances multiples

Dans mon application, j'ai un certain nombre d'agents, chacun ayant sa propre base de connaissances.
Mon idée initiale était d'avoir plusieurs instances de moteur, mais le prologue de Swi ne permet qu'une seule instance.
L'autre solution consiste à ajouter un terme supplémentaire représentant l'identifiant de l'agent à chaque fait et règle, mais cela semble très lourd.

Par exemple, au lieu de :

position(10, 20).
do(action(X)):-...

Il faudrait que j'écrive partout :

position(agent0, 10, 20).
do(Agent, action(X)):-...

Parce que je mettrai à jour un agent à la fois, même sauvegarder et restaurer tout à chaque fois pourrait être acceptable, même si je ne sais pas comment le faire. Ou en utilisant des modules ?
Quelle serait une bonne façon de séparer les différentes bases de connaissances ?

4voto

Je pense que votre suggestion d'ajouter un ID atomique à vos faits pour identifier l'agent auquel il correspond est intéressante, mais je suis d'accord pour dire que cela pourrait être lourd à ajouter à votre code rétrospectivement.

Voici quelques autres suggestions, en gros dans l'ordre de mes préférences...

  1. Utilisez le base de données enregistrée . Avec cela, vous pouvez réellement enregistrer des faits avec des clés atomiques, donc vraisemblablement, vous pourriez utiliser recorda/3 et des prédicats similaires pour enregistrer les faits pour chaque agent séparément avec des ID d'agent, puis utilisez recorded/2,3 pour les récupérer. C'est presque exactement ce que vous voulez.
  2. Utilice modules . Vous pourriez probablement créer de nouveaux noms de modules pour chaque agent, séparant ainsi les faits pour chacun d'entre eux, de la même manière que les espaces de noms sont utilisés. Par exemple, en affirmant agent0:position(10,20) .
  3. Gardez une trace explicite des faits que vous affirmez pour chaque agent en utilisant assert/2 qui renvoie les références des clauses. En conservant une liste de références qui identifient tous les faits affirmés pour un agent particulier, vous pouvez rapidement les rétracter à l'aide de la fonction erase/1 . Sachez que l'utilisation de références de clauses avec une combinaison de clause/3 pour récupérer les clauses via leur référence avec retract/1 peut potentiellement rétracter des clauses similaires appartenant à d'autres agents.
  4. En fonction de la structure de votre programme, vous pouvez simplement faire circuler une grande structure de données contenant toutes les données de chaque agent dans une liste : [agent0-[fact1(..), fact2(..), ...], agent1-[...], ...] et mettez à jour ce terme au fur et à mesure. Notez que cette méthode n'est pas aussi efficace que l'utilisation de la base de données elle-même, car elle nécessiterait de nombreux balayages linéaires pour des faits particuliers ; les recherches de hachage ne peuvent pas être utilisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X