2015-11-13 5 views
5

Prologでエラーチェックを追加する方法を知りたいと思います。Prologエラーの引数

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

それが起こるとき、「第一引数はリストである必要があります」のように、私はエラーをプリントアウトする方法を:たとえば 私はリストがどのくらいありますプログラムがありますか?

+0

この場合、エラーが発生しない理由があります。この状況でのさまざまなシステムの動作については、[この比較](https://www.complang.tuwien.ac.at/ulrich/iso-prolog/length)を参照してください。 – false

答えて

3

SWI-PrologはISO-compliant exception handlingなので、実際にはエラー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) 

これは、入力/使用が難しいだけでなく、実装にも依存します。代わりに、あなたは(とすべきである)を提供library(error)を、使用することができますmust_be/2 predicate(悲しいことに、あなたが探しているかわからない場合はSWI-Prologのウェブサイト上でこれを見つけることは非常に困難である):

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

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

例外処理をサポートする他のPrologの実装は、非常によく似た機能を提供すると私は推測しています。

+3

'throw(error(E、Imp_def))'に問題があるもう一つの理由があります: 'error/2'の第2引数は実装定義です。したがって、ISO準拠の実装に特有ではない明示的な用語を提供するコードは機能しない可能性があります。 – false

+1

@falseはい。実際、正確な「ISOエラー用語定義」を理解することは、(文書化のために)非常に困難です。 –

+2

あなたは[this](http://www.complang.tuwien.ac.at/ulrich/iso-prolog/error_k#error_classes)を知っていますか? – false