Comment vérifier si une règle existe dans une base de données de clause de fichier prolog

StackOverflow https://stackoverflow.com/questions/321974

  •  11-07-2019
  •  | 
  •  

Question

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

L’idée est d’utiliser une règle dont la tête est vérifiée (+ nom, + arguments). Cette règle doit être vraie s'il existe dans la base de données une autre règle dont l'en-tête est name (arguments)

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

Était-ce utile?

La solution

Utiliser call / 1 n'est pas une bonne idée car call / 1 appelle en réalité l'objectif, mais vous voulez simplement savoir si le fait / règle existe , et vous ne voulez pas attendre après un long calcul que l'appel peut déclencher, et vous ne voulez pas que quelque chose soit imprimé à l'écran si la règle appelée appelle à son tour, par exemple writeeln / 1 . De plus, vous voudriez que verify / 2 réussisse même si l'appel échoue (mais le fait / la règle s'y trouve sinon).

En guise de solution, SWI-Prolog propose 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 , l'une utilisant call / 1 et l'autre 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.

Autres conseils

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

Donc, disons dans votre base de données:

father(abraham,isaac).

Maintenant, vous voulez appeler quelque chose comme:

verify(father,[abraham,isaac]).

Votre corps de prédicat devra alors contenir un mécanisme appelant père (abraham, isaac). qui devrait ensuite renvoyer true. Appeler père (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 (appel) à 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 tâche pour vous. Vous devez toujours savoir quoi faire avec les prédicats partiellement instanciés (donc, disons quelque chose comme verify (père, [abraham, X]). vous-même, mais cela ne devrait pas être difficile à partir d'ici. .

Bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top