2015-11-13 11 views
5

Mi chiedo come aggiungere la verifica degli errori in Prolog. Per esempio Ho un programma che troverà per quanto tempo una lista è:Argomenti di errore Prolog

listlen([],0). 
listlen([_|T],N) :- 
    listlen(T,X), 
    N is X+1. 

Come dovrei stampare un errore come "Il primo argomento deve essere una lista" quando succede?

+0

In questo caso particolare, ci sono buone ragioni per non produrre un errore. Vedi [questo confronto] (https://www.complang.tuwien.ac.at/ulrich/iso-prolog/length) per il comportamento di vari sistemi in questa situazione. – false

risposta

3

SWI-Prolog ha ISO-compliant exception handling, quindi è possibile generare errori as defined in the standard.

?- throw(error(type_error(list, foo), context(foo/0, 'Must be a list'))). 
ERROR: foo/0: Type error: `list' expected, found `foo' (an atom) (Must be a list) 

Questo non è solo difficile da digitare/utilizzare: è anche dipendente dall'implementazione. Invece, si può (e dovrebbe) utilizzare library(error), che fornisce il must_be/2 predicate (purtroppo, è molto difficile trovare questo sul sito SWI-Prolog se non si sa cosa si sta cercando):

?- must_be(list, [foo]). 
true. 

?- must_be(list, foo). 
ERROR: Type error: `list' expected, found `foo' (an atom) 

Suppongo che altre implementazioni Prolog che supportano la gestione delle eccezioni forniscano funzionalità molto simili.

+3

C'è un altro motivo per cui scrivere 'throw (error (E, Imp_def))' è problematico: il secondo argomento di 'error/2' è definito dall'implementazione. Quindi il codice che fornisce un termine esplicito che non è specifico per un'implementazione conforme ISO potrebbe non funzionare. – false

+1

@false Sì. In realtà, è piuttosto difficile (perché la documentazione) capire l'esatta "definizione del termine di errore ISO". –

+2

Sai [questo] (http://www.complang.tuwien.ac.at/ulrich/iso-prolog/error_k#error_classes)? – false