7

私はPrologとHornの節に順応しようとしてきましたが、正式な論理からの移行は依然として厄介で強制されているように感じます。すべてを標準形式にすることには利点があることを理解していますが、次のようになります。

Prologでマテリアル条件演算子を定義するための最良の方法は何ですか?どちらかとORのときに成功しますか?つまり、がない場合はそうではないステートメントです。-->A --> BA = trueB = trueB = falseif->thenfailiffalseelse

真理値表

また、ホーン節の非自明な利点は正確には何ですか?

4

1 に答える 1

3

マテリアル条件演算子を定義する最良の方法は何ですか --> Prolog で

AとがアトムとBにバインドされる変数にすぎない場合、これは簡単です。truefalse

cond(false, _).
cond(_, true).

しかし、一般的に、Prolog は適切な否定を提供せず、単調ではない失敗としての否定のみを提供するため、最善の方法はありません。実際の提案に最も近いものでAあり、B多くの場合

(\+ A ; B)

これは を証明しようとし、次に を証明できない場合Aに進みます (これは、閉じた世界の仮定のために偽であるという意味ではありません)。BA

ただし、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 ) 時間で実行できますが、並べ替えプログラムとしては非常に貧弱です。

この質問も参照してください。

于 2012-11-26T20:06:31.993 に答える