2008-11-26 6 views
4

Je travaille sur une affectation de collège où je dois vérifier si une certaine clause (en fait ou en règle) existe dans la base de données de clauses actuelle.Comment vérifier si une règle existe dans une base de données de clauses de fichier prologue

L'idée est d'utiliser une règle dont la tête est verify (+ nom, + arguments). Cette règle doit être vrai si, dans la base de données existe une autre règle dont la tête est le nom (arguments)

Toute aide serait grandement appréciée ...

Répondre

5

call/1 est à l'aide pas bonne idée parce que call/1 appelle effectivement l'objectif, mais vous voulez juste savoir si le fait/règle existe, et vous ne voulez pas attendre après un long calcul que l'appel pourrait déclencher, et vous ne voulez pas avoir quelque chose imprimé sur l'écran si la règle appelée à son tour appelle par exemple writeln/1 En outre, vous voulez verify/2 pour réussir même si l'appel a échoué (mais le fait/règle est par ailleurs là).

Comme solution, SWI-Prolog offre callable/1

callable(+Term) 

True if Term is bound to an atom or a compound term, 
so it can be handed without type-error to call/1, functor/3 and =../2. 

Voici deux versions de verify/2, en utilisant un call/1 et l'autre en utilisant callable/1.

verify1(Name, Arguments) :- 
    Term =.. [Name | Arguments], 
    call(Term). 

verify2(Name, Arguments) :- 
    Term =.. [Name | Arguments], 
    callable(Term). 

father(abraham, isaac) :- 
    writeln('hello'). 

father(abraham, adam) :- 
    fail. 
+0

verify2 fonctionne également pour père (abraham, daniel). qui n'existe pas. Donc, je suppose, appelable détecte si le prédicat «père» existe et ne se soucie pas des arguments. –

1

Connaissez-vous le concept d'unification? Ce que vous avez à faire est: appelez simplement un prédicat qui ressemble à celui que vous essayez de trouver.

Alors, dites dans votre base de données est:

father(abraham,isaac). 

Maintenant que vous voulez appeler quelque chose comme:

verify(father,[abraham,isaac]). 

Votre corps prédicat devra alors contenir un mécanisme d'appel father(abraham,isaac). qui devrait alors return true. L'appel father(abraham,adam) devrait échouer. Vous aurez besoin de deux prédicats pour cela: =../2 et call/2. Si vous utilisez SWI-Prolog, appelez help(=..). et help(call) à partir de la ligne de commande de l'interpréteur pour accéder à la documentation. J'espère que je n'ai pas gâché la mission pour vous. Vous devez toujours savoir quoi faire avec prédicats partiellement instanciés (donc, dites quelque chose comme verify(father,[abraham,X]). sur votre propre, mais il ne devrait pas être difficile d'ici.

Bonne chance.

Questions connexes