2012-02-03 9 views
2

J'appelle un moteur SWI Prolog à partir d'une DLL C++ et je voudrais pouvoir accéder à tous les prédicats affirmés/dynamiques (similaire à ce que fait normalement la liste). Dans Prolog GNU, j'appellerais le prédicat dynamic/1 avec une Variable et Prolog l'unifierait avec tous les indicateurs de prédicats dynamiques. Dans l'étape suivante, j'appellerais ces prédicats avec des variables et obtiendrais une liste complète.Unifier les prédicats dynamiques dans SWI Prolog

Malheureusement, je ne peux pas le faire dans SWI Prolog (ERREUR: les arguments ne sont pas suffisamment instanciés). Existe-t-il un autre moyen?

Répondre

2

Pourquoi ne pas simplement rouler votre propre, par exemple:

get_dynamic_predicates(M, H, B, R) :- 
    current_predicate(_, P), 
    strip_module(P, M, H), 
    predicate_property(P, dynamic), 
    \+ predicate_property(P, built_in), 
    \+ predicate_property(P, imported_from(_)), 
    clause(P, B, R). 

L'appel de cette backtracks pour lier les instances de prédicats avec la tête H dans le module M avec le corps B et la clause de référence R. Si tout ce que vous vouliez récupérer sont les noms des prédicats dynamiques, vous pouvez appeler ceci pour récupérer l'ensemble de toutes les liaisons pour H, ou leurs foncteurs.

Modifiez les propriétés de prédicat à celles que vous préférez (ou, mieux encore, transmettez-les en arguments); la définition ci-dessus récupérera tous les prédicats dynamiques définis par l'utilisateur, ce que je suppose que vous recherchez.

+0

Merci. Ma dernière idée utilisait quelque chose comme ceci: myIndicators (Nom, Arité): - predicate_property (tête, dynamique), \ + predicate_property (tête, built_in), foncteur (chef, Nom, Arity). – aLu

+0

C'est assez proche de ce que j'ai suggéré ici; la seule différence étant que je m'assurais que des prédicats dynamiques affirmés dans différents modules étaient trouvés. Si vous n'utilisez pas plusieurs modules, alors ce que vous avez suggéré semble bien! – sharky