Prolog のドキュメントを見ると、述語の署名は次のように記述されている場合があります。
foo(:Bar, +Baz, -Qux, ?Mop)
:
、+
、-
およびfor とは何?
ですか? また、それらをどのように解釈すればよいですか? また、存在するのはこれらだけですか、それとももっとありますか?
Prolog のドキュメントを見ると、述語の署名は次のように記述されている場合があります。
foo(:Bar, +Baz, -Qux, ?Mop)
:
、+
、-
およびfor とは何?
ですか? また、それらをどのように解釈すればよいですか? また、存在するのはこれらだけですか、それとももっとありますか?
モード宣言は、1970 年代の終わりに DECsystem-10 コンパイラで初めて登場しました。1978-09 年の DECsystem-10 ユーザーズ ガイドは、最初の説明の 1 つです。動機は 1982 年 11 月 10 日に与えられます。
このような情報により、コンパイラはよりコンパクトなコードを生成し、ランタイム ストレージをより有効に活用できます。特に実行時ストレージの節約は、多くの場合非常に重要です。モード宣言は、プログラムがどのように動作するかを他の人が理解するのにも役立ちます。
+
— 引数は常に非変数になります
-
— 引数は常に変数になります
?
- 制限なし
これらの宣言は各ゴールに適用されることに注意してください。最も顕著なのは、再帰的なゴールに適用されることです。このように、次のモード宣言とその定義は、2 番目の引数が部分リストではないことを意味します。したがって、目標member(A, [c|_])
は適合しません。そのため、述語自体によって実行される統合を考慮に入れる必要がある場合、インターフェースと実装は多少相互依存しており、非常に複雑なケースにつながる可能性があります。
:- mode member(?, +).
member(X, [X|_]). % member(X, [X,.._]) in DEC10
member(X, [_|L]) :-
member(X, L).
モード宣言が具体的な目標に違反している場合、その宣言は無視されるか、またはその時点でエラー メッセージが出力されて失敗することを意味するエラーが生成されます。DECsystem-10 インタープリターは、常に宣言を無視していました。
1970 年代には、DEC 10 ユーザーズ ガイドがモード宣言に 2 つの解釈をもたらしました。2 つ目は、実行時のモード宣言を無視して、完全に形式ばらないものです。前者は Prolog 標準内で使用され、後者は一部の Prolog システムのドキュメントに記載されています。
Prolog 標準 (ISO/IEC 13211-1:1995、2007、2012) では、組み込み述語の定義に次の形式が使用されます。.1 説明、.2 テンプレートとモード、.3 エラーで始まり、任意で.4 例、.5 ブートストラップされた組み込み述語に続く。
8.1.2 テンプレートとモード
引数の型と
、組み込み述語を
満たすためにどの引数をインスタンス化するかの仕様。ケースは、相互に排他的なセットを形成します。
...
具体的なモードは次のとおりです。
+
— 引数はインスタンス化されます。
@
— 同様+
に、引数は変更されないままになります。
-
— 引数は、ゴールが成功した場合にインスタンス化される変数でなければなりません。
?
— モード要件はありません。引数は変数またはインスタンス化されたものです。
述語が異なるモードで呼び出された場合、instantiation_error
oruninstantiation_error
が生成されます。型が一致しない場合、 atype_error
が生成されます。このように、プログラマーは、詳細なエラー条件を読まなくても、テンプレートとモードの節を見るだけで、多くのエラーを予測できます。
ISO とは異なるシステムは、モードの正確な解釈においても互いに異なります。タイプエラーが適切な場合に備えて、多くはサイレントエラーを実行します。モード宣言は、述語が定義されていない意味で動作すると予想される場合を示す手段と見なされます。多くの場合、-
大まかに次のように解釈されます。意味を定義する実際の参照がないため、これは私が非公式に収集したものです。
-
— 引数は「出力引数」です。目標が実行された後、結果の用語に統一されることを意味します。だから主張は固い。多くの場合、そのような引数に関連するエラーはありません。