マテリアル条件演算子を定義する最良の方法は何ですか --> Prolog で
A
とがアトムとB
にバインドされる変数にすぎない場合、これは簡単です。true
false
cond(false, _).
cond(_, true).
しかし、一般的に、Prolog は適切な否定を提供せず、単調ではない失敗としての否定のみを提供するため、最善の方法はありません。実際の提案に最も近いものでA
あり、B
多くの場合
(\+ A ; B)
これは を証明しようとし、次に を証明できない場合A
に進みます (これは、閉じた世界の仮定のために偽であるという意味ではありません)。B
A
ただし、Prolog では否定を慎重に使用する必要があります。
また、ホーン節の非自明の利点は正確には何ですか?
彼らが簡単な手続き上の読みを持っていること。Prolog はプログラミング言語であり、定理証明ではありません。明確な論理的意味を持つプログラムを書くことは可能ですが、それでもプログラムです。
違いを確認するには、並べ替えの古典的な問題を考えてみてください。L
が重複のない数値のリストである場合、
sort(L, S) :-
permutation(L, S),
sorted(S).
sorted([]).
sorted([_]).
sorted([X,Y|L]) :-
X < Y,
sorted([Y|L]).
S
の要素をL
ソートされた順序で格納することの意味を論理的に指定したものです。ただし、これには手続き上の意味もありますL
。つまり、ソートされた順列が得られるまですべての順列を試します。この手順は、最悪の場合、すべてのn !を実行します。並べ替えは O( n lg n ) 時間で実行できますが、並べ替えプログラムとしては非常に貧弱です。
この質問も参照してください。