2010-03-07 4 views
2

Vu:Prolog Erreur Attraper

fruitid('Apple', 'Granny Smith', 1). 
fruitid('Pear', 'Bartlett', 2). 

Si j'avais la clause

type_of_fruit(ID):- 
     fruitid(Fruit, _, ID), write(Fruit). 

Comment pourrais-je mettre en œuvre une méthode pour intercepter les entrées erronées?

Par exemple

fruitid(5). 

Merci.

AS

Répondre

4

Set Drapeaux Prolog et utilisation Catch/3

En supposant SWI Prolog

1) Les prolog_flags peuvent modifier le comportement d'erreur. D'abord permettre au système d'attraper l'erreur et de le signaler. Le drapeau unknown est pour des prédicats inconnels tels que fruitID/1.

set_prolog_flag(report_error,true). 
set_prolog_flag(unknown,error). 

Maintenant, quand le mauvais arité sous-jacente est utilisé, il devrait y avoir un message d'erreur comme ceci:

?- fruitid(5). 
ERROR: toplevel: Undefined procedure: fruitid/1 (DWIM could not correct goal) 

2) Pour intercepter des exceptions comme celle-ci dans le code, Enroulez le but dans une prise/3 prédicat. Les settigs de 1) sont encore nécessaires. C'est le moyen de piéger le prédicat non défini dans le code, ou de piéger n'importe quelle exception pour cela. Remplacer format/3 avec le gestionnaire de votre choix:

while_running_some_program:- 
    catch(foodid(5), 
     error(Err,_Context), 
     format('You done goofed! ~w\n', [Err])), 
    rest_of_code.