したがって、特定の述語は+、+モードで機能する必要があると言われています。それはPrologでどういう意味ですか?
3 に答える
プロローグの述語に関する情報を提供したい場合、これらの規則がよく使用されます。
arity:predicate / 3は、述語が3つの引数を取ることを意味します。
パラメータ:predicate(+ Element、+ List、-Result)は、要素とリストが自由変数であってはならず、述語が正しく機能するために結果が自由変数であることを意味します。?両方が可能な場合に使用されます。@は上記の回答で言及されていますが、実際にはあまり使用されておらず(少なくとも、swi-pl docでは)、呼び出し中に入力がバインドされないことを意味します。
したがって、いくつかの述語が+、+モードで機能することを伝えることは、次のことを伝えるためのショートカットです。
% somepredicate/2 : somepredicate(+Input1, +Input2)
あなたに明確な答えを与えるために、あなたはただ+、+以上のものを私たちに話す必要があります。引数がアトムのみである述語の場合、物事は明確に定義されています。p(+、+)は、両方の引数がアトムである場合にのみ述語を呼び出す必要があることを意味します。
しかし、たとえばリストがある場合、事態はより複雑になります。その場合、2つの意味があります。member/2
どちらが成功するかを検討してくださいmember(2,[1,2,3])
。
クエリですか、member(2,[X])
それともmember(2,[X|Xs])
+、+ですか?
ISO Prologでも使用されている直接解釈は、次のように述べています(ISO / IEC 13211-1:1995からの8.1.2.2引数のモードを引用):
+
引数はインスタンス化されます、
その意味で、上記の両方のクエリは+、+です。
ただし、述語の定義にアクセスできることを暗黙的に想定する別の解釈があります。この解釈は、最初のPrologシステムの1つであるDEC-10Prologのモード宣言に由来します。だから見てみましょうmember/2
:
member(X, [X|_]).
member(X, [_|Xs]) :-
member(X, Xs).
モードmember(+,+)
は、ゴールを実行するときに、このモードがすべてのサブゴールに適用されることを意味します。つまり、member(2,[X])
+、+になります
が、サブゴールが原因でmember(2,[X|Xs])
はありませんmember(2,Xs)
。
人々はこれらの概念をかなり頻繁に混乱させます。したがって、リストやその他の複合用語について話しているときは、何を意味するのかを尋ねるのに役立ちます。
モードの詳細については、この回答を参照してください。
これは、述語への引数が両方とも入力引数になることを意味します(ただし、純粋な入力ではありません)。
このページには、Prologのすべての呼び出しモードの簡潔な説明があります。