あなたはいつもその表現を使って2*X+Y
います。最初に計算してから、その結果を実際の計算に使用してみませんか?たぶんあなたはここで問題の声明の何かを見逃しましたか?
X
、、Y
およびN
がすべて0の場合を除外するのはなぜですか?N < 0
...あなたが?の場合を除外していない間
引数の順序
Prologでは、対応する入力引数の後に結果を置くのが一般的です。この規則には例外があり(is)/2
、最も一般的な例ですが、中置演算子として記述されています。
エラーシグナリング
適切に処理できない場合のために、Prologには2つのオプションがあります。黙って失敗するか、クリーンエラーを発行します。(3つ目はループです。これは理想的ではありませんが、成功するよりはましです。)現在、テキストを書き出してから成功します。したがって、誰かがあなたのメッセージを読むと想定しています。ただし、プログラムが無人で実行されることが多く、メッセージは無視されます。
あなたの定義を使用して、あなたの定義が答えの質問であることを証明したいとします。
?-expbar(42、0、0、0)。
これは、に書き直しX =:= Y =:= N =:= 0
た後にSWIで取得するものX =:= 0, Y =:= 0, N =:= 0
です。
?-expbar(42、0、0、0)。
[78,111,32,116,119,111,32,118,97,114,105,97,98,108,101,115,32,99,97,110,32,101,113,117,97,108,32,48,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46]
本当。
それは言うtrue.
!そして、上記のこれらの数字は確かにそのような非常に複雑な計算からのいくつかの進捗メッセージです...したがって、あなたのメッセージを誤解するのは非常に簡単です。一重引用符を使用した方が少し簡単だったでしょう。一重引用符と二重引用符の詳細。しかし、より読みやすいメッセージであっても、それをスキップするのは簡単です。
このような状況を処理する適切な方法は、エラーを発行することです。
throw(error(Error_term、_More_info))
このようにして、計算は中止され、エラーはトップレベル(またはハンドルが処理する次の場所)によって処理されcatch/3
ます。これにより、エラーが誤って解釈される可能性が低くなります。
はError_term
、理想的には既存のエラー用語の1つである必要があります。これがISOPrologのエラーの完全なリストです。あなたの場合、それはべき乗evaluation_error(undefined)
の定義に似ているかもしれません。