1

私は、Prologのnot predicateの宣言的なビューと少し混乱していると思います。

私は、この方法で単に述語ではなく実装できることを持っています:

not(P) :- P, !, fail;
          true.

ここで、P は述語であり、P ではなく、P が TRUE の場合は FALSE、P が偽の場合は TRUE です。

私が読むことができるブラトコの本を読む:

Goal が成功した場合、not(Goal) は失敗し、それ以外の場合は not(Goal) が成功します。

このコードスニペットを解釈しようとして多くの問題を抱えているかもしれませんが、これは宣言型パラダイムとロジックを超えて、ある種の手続き型パラダイムに入るように思えます

私には、カットと失敗述語述語によって実装されたif{} else{}の形式のように思えます...私は次のように読みました。

P は、TRUE または FALSE のみのブール述語です。

IF P が TRUE の場合、強制的に失敗し (つまり、not(P) が FALSE である)、他の応答を持たないようにバックトラックを回避します。

ELSE P は FALSE であり、not P は TRUE です。

私の解釈が間違っているのか、推論に何かが欠けているのか、それともばかげた質問で多くの問題を抱えているのかわかりません...

4

1 に答える 1

4

@hardmathが言ったことに追加することはあまりありません(+1)が、それを言うにはさらに言葉が必要になるため、コメントではありません。

まず、手続き型と宣言型という難しい二分法が見られますが、物事を見る他の方法があり、多くのものが中間に位置しています。\+ほとんど宣言的な読み取りがあるため、それらの1つですが、宣言的な読み取りが不十分な場合は、マシン上で実行されることに関係しています。しかし、すべての Prolog はマシン上で実行されます。だからと言って、宣言的に考えることができないわけではありません。これはオール オア ナッシングの命題ではありません。いわゆる外論理述語またはメタ述語setof/3et。アル。厳密に言えば、一次論理ではない結果を提供しますが、それはそれらが手続き型であることを意味するわけではなく、必ずしも明らかに手続き型の方法で実装されていることを意味するものでもありません。要するに:宇宙には「手続き型」と「宣言型」よりも多くのものがあります。

第二に、条件付きロジックを本質的に手続き型として読むことを主張します。これは、低レベルの詳細へのこだわりだと思います。はい、多くの赤いカットを使用して Prolog を記述し、手続き的な読み取りのみを許可することはできますが、if/then ロジックを使用するだけではそれは必要ありません。また、一方から他方への滑りやすい斜面でもありません。あなたは「もし X なら Y でなければ Z」という読み方に固執しているようですね。しかし、このように手続き的に読む必要はありません。実際、読むべきではないでしょう。条件の順序付けはパフォーマンスに影響し、場合によっては正確さに影響しますが、宣言的な読み取りを無効にする必要はありません。結局のところ、どの言語でも、これは多かれ少なかれ真実です。停止問題と、マシン上でプログラムを実行するという事実のおかげです。Prolog でさえ、その理解を毒してしまうと、そこから抜け出すことも、宣言型プログラミングの利点を実現することもできなくなります。要するに:if/then/else は、本質的に手続き型であると理解する必要はありません

要約すると、リラックスしてください。:)

于 2013-04-09T17:13:34.993 に答える