Prolog でクリーンなインターフェイスを設計するには、Prolog 標準を読むことをお勧めします。 iso-prologを参照してください。
特に、組み込みの述語がどのように成文化されるかという特定のフォーマットには、特定のスタイルのドキュメンテーションだけでなく、エラーの通知方法も含まれます。8.1 ISO/IEC 13211-1:1995の組み込み述語定義の形式を参照してください。このスタイルの定義は、Cor.2および
Prolog prologueでオンラインで見つけることができます。
ISOエラー信号規則に完全に従う(そして標準化されていない)ライブラリの非常に良い例は、library(clpfd)
SICStusおよびSWIでの実装です。どちらの実装もアプローチが根本的に異なりますが、エラー規則を最大限に活用しています。
ISOに戻ります。これは、組み込み述語の ISO の形式です。
xyz 名前/アリティ
最初に、任意の短い非公式の発言がある場合があります。
xyz1 説明
後で参照できるように、説明的な変数名を使用して最も一般的な目標から始まる宣言的な記述が与えられます。述語の意味がまったく宣言的でない場合は、「真である」と述べられるか、「統合する」、「組み立てる」などの不要な操作語が使用されます。例を挙げましょう:
8.5.4 copy_term/2
8.5.4.1 説明
copy_term(Term_1, Term_2)
の名前が変更されたコピー (7.1.6.2) でTerm_2
ある用語と統一する場合は真です。T
Term_1
したがって、これは大きな赤い警告サインです。この述語が関係であると考えてはいけません。手続き的にしか理解できません。さらに、2 番目の引数で定義が不変であることを (暗黙のうちに) 述べています。
別の例: sort/2
. これは今関係ですか?
8.4.3 並べ替え/2
8.4.3.1 説明
sort(List, Sorted)
(7.1.6.5)Sorted
のソートされたリストと統合する場合は true です。List
というわけで、やはり関係なし。驚いた?8.4.3.4 の例を見てください:
8.4.3.4 例
...
sort([X, 1], [1, 1]).
Succeeds, unifying X with 1.
sort([1, 1], [1, 1]).
Fails.
必要に応じて、「手続き的に」で始まる別の手続きの説明が追加されます。ここでも、エラーはまったくカバーされません。これは、標準記述の大きな利点の 1 つです。エラーはすべて「実行」から分離されているため、プログラマー (= 組み込みのユーザー) がエラーをより体系的に把握するのに役立ちます。公平を期すために、手動でケースバイケースで最適化したい実装者の負担がわずかに増加します。このように最適化されたコードは、いずれにせよ、微妙なエラーが発生しやすいことがよくあります。
xyz2 テンプレートとモード
ここでは、引数のモードと型を 1 行または 2 行で包括的に指定します。この表記法は、1978 年のDECsystem-10 モード宣言に由来する他の表記法と非常によく似ています。
8.5.2.2 テンプレートとモード
arg(+integer, +compound_term, ?term)
ただし、ISO のアプローチと Covington らのガイドラインとの間には大きな違いがあります。Covington らの非公式な性質のものであり、プログラマが述語をどのように使用すべきかを述べているものです。ISO のアプローチは、ビルトインがどのように動作するか、特にどのエラーが予想されるかを説明しています。(上記に続く 4 つのエラーに加えて、上記の仕様からは確認できない 1 つの余分なエラーがあります。以下を参照してください)。
xyz3 エラー
すべてのエラー条件は、アルファベット順に番号が付けられた独自の節に記載されています。7.12 エラーのコーデックス:
複数のエラー条件が満たされた場合、Prolog プロセッサによって報告されるエラーは実装に依存します。
つまり、各エラー条件には、それが適用されるすべての前提条件が記載されている必要があります。それらのすべて。エラー条件は、if-then-elsif-then... のようには読み取られません。
また、適切なエラー条件を見つけるためにコード作成者が特別な努力をしなければならないことも意味します。これはすべて、実際のユーザー プログラマーにとっては有利なことですが、コード作成者と実装者にとっては確かに多少の苦痛です。
多くのエラー条件は、 8.1.3 エラーの注記および7.12.2エラー分類(概要)に従って、 xyz2で指定された仕様に直接従います。組み込みの predicateの場合、エラー a、b、c、d が仕様に続きます。エラー e のみが続きません。arg/3
8.5.2.3 エラー
a)N
は変数
—instantiation_error
です。
b)Term
は変数
—instantiation_error
です。
c)N
変数でも整数でもない
— type_error(integer, N)
.
d)Term
変数でも複合項でもない
— type_error(compound, Term)
.
e)N
ゼロ未満の整数
ですdomain_error(not_less_than_zero, N)
。
xyz4 の例
(オプション)。
xyz5 ブートストラップされた組み込み述語
(オプション)。非常に似ている他の述語を定義し、「ブートストラップ」することができます。