2010-11-18 8 views
3

Supposons que je souhaite créer un graphique de dépendance de règle pour un programme Prolog, en Prolog. Par exemple, dans ce qui suit étant vrai que le programme suivantGraphique de dépendance de règle dans Prolog

foo(X) :- bar(X, 0). 
bar(A, B) :- quux(A), coox(B). 
baz. 

résulterait (en utilisant assert):

depends(foo, [bar]). 
depends(bar, [quux, coox]). 
depends(baz, []). 

Ou quelque chose comme ce qui précède que je pourrais facilement utiliser pour faire un graphique. L'approche à laquelle j'ai réfléchi consiste à lire les lignes du fichier d'entrée sous forme de chaînes et à effectuer des opérations simples de recherche et de remplacement sur celles-ci, mais cela ressemble à un hack laid et non-Prologlike. Toutes les autres options qui utilisent les capacités métalogiques de Prolog?

+1

Étant donné que Prolog autorise la surcharge de noms de prédicats en fonction du nombre d'arguments, il vaut mieux utiliser les termes 'Name/NArgs' au lieu des noms simples. –

Répondre

2

Il n'y a pas besoin de lire le fichier en tant que (non structuré) chaîne: Un fichier source Prolog est une séquence de valides Prolog termes, vous pouvez lire les clauses avec (par exemple) lire/1 et raisonner sur eux comme vous le feriez pour d'autres termes. (: -)/2 est déjà un opérateur prédéfini, et vous pouvez alors facilement inspecter les clauses avec les métaprédicats intégrés de Prolog (arg/3, functor/3, = ../2 etc.). Cela prend automatiquement en charge les commentaires au niveau de la source, etc., comme vous le souhaitez.

+1

Question de suivi syntaxique: comment puis-je faire une règle qui accepte les entrées comme dépend (foo: - bar, baz, X, Y)? La façon dont je l'ai en ce moment, je dois emballer la partie "foo: - bar, baz" dans les parens. – Igor

+1

Oui vous devez bien sûr l'écrire comme dépend ((foo: - bar, baz), X, Y), sinon (en dépend (foo: - bar, baz, X, Y)), l'atome "baz" "est le deuxième argument de depends/4 au lieu d'une partie de son premier argument. Cependant, si vous lisez des clauses d'un fichier, ce problème ne se pose pas: pensez? - read (Clause). Si vous entrez "foo: - bar, baz." (sans guillemets), Clause est automatiquement unifiée avec le terme (foo: -bar, baz), et vous pouvez continuer avec? - ..., clause_dependencies (Clause, Ds), assertz (clause_depends_on (Clause, Ds)). en supposant que vous avez défini les dépendances de clause/2 comme vous le souhaitez. – mat