2015-11-13 12 views
5

Ich frage mich, wie man Fehler in Prolog hinzufügen. Zum Beispiel ich ein Programm, das, wie lange eine Liste finden:Prolog Fehlerargumente

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

Wie würde ich einen Fehler auszudrucken wie „Das erste Argument hat eine Liste sein“, wenn es passiert?

+0

In diesem speziellen Fall gibt es gute Gründe, keinen Fehler zu erzeugen. Siehe [dieser Vergleich] (https://www.complang.tuwien.ac.at/ulrich/iso-prolog/length) für das Verhalten verschiedener Systeme in dieser Situation. – false

Antwort

3

SWI-Prolog hat ISO-compliant exception handling, so können Sie tatsächlich Fehler as defined in the standard werfen.

?- 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) 

Dies ist nicht nur schwierig zu tippen/verwenden: es ist auch abhängig von der Implementierung. Stattdessen können Sie (und sollte) verwenden library(error), die das bietet must_be/2 predicate (leider, ist es sehr schwierig ist, diese auf der SWI-Prolog Webseite zu finden, wenn Sie nicht wissen, was Sie suchen):

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

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

Ich nehme an, dass andere Prolog-Implementierungen, die die Ausnahmebehandlung unterstützen, sehr ähnliche Möglichkeiten bieten.

+3

Es gibt noch einen anderen Grund, warum das Schreiben von 'throw (error (E, Imp_def)) problematisch ist: Das zweite Argument von' error/2' ist Implementierung definiert. Ein Code, der einen expliziten Begriff enthält, der nicht spezifisch für eine ISO-konforme Implementierung ist, funktioniert möglicherweise nicht. – false

+1

@false Ja. Tatsächlich ist es ziemlich schwierig (weil Dokumentation), die genaue "ISO-Fehlertermdefinition" herauszufinden. –

+2

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