2016-12-02 7 views
0

私はLearn Prolog Now! 's chapter on cutsを読むのと同時に、Bratkoの人工知能のためのプロローグプログラミング、第5章:バックトラックを制御しています。最初は、他のプログラミング言語から知られているif-else節を模倣する単純な方法でした。カットを読む!プロローグ

例えば、このコードは、我々は falseを期待しても、すべての変数がインスタンス化されている場合に失敗しますラインを書き留めているようしかし
# Find the largest number 
max(X,Y,Y):- X =< Y,!. 
max(X,Y,X). 

?- max(2,3,2). 
true. 

理由はっきりしています:最初のルールは失敗し、2番目のルールはそれ以上接続されていないため、成功します。私はそれを理解したが、その後解決策が提案されている(ここではswishです):

max(X,Y,Z):- X =< Y,!, Y = Z. 
max(X,Y,X). 

そして私は、私はこれを読むべきか混乱しています。私は!が意味すると思った: 'これの前に来るものがすべて!であれば、同じ述語で他のルールも含めて終了を止める'。しかし、それは正しいとは言えません。これは、Y = Zのインスタンス化が失敗の場合にのみ発生することを意味するため、そのルールでは役に立たないからです。

こうしてカットを「人」的に読むべきですか?また、拡張として、上記のmax/3の提案されたソリューションをどのように読むべきですか?

+0

あなたの言うことはほぼ正しいですが、以下が欠落しています:操作上、 '!/ 0' **は常に成功します**。したがって、推論の誤りは、検索ツリーの終了*、*失敗*、*後続*、*切断という概念を混乱させることに起因します。この混乱は、「停止終了」という言葉に反映されます。あなたの質問に答えるには、「人間/人間」の「!/ 0」を読む方法は、「ここから、私がやっていることのすべての結果を理解できなくなった」と言うことです。これは、そのような不純な構造を含むプログラムについては、すぐに推論するのが非常に難しくなるからです。 – mat

+0

*この '!'の前に来るものがすべて真**であれば、同じ述語で他のルールを念頭に置いてはいけません(失敗の場合は続行してください) - **あなたは今のところ唯一の真実*となっています。 **** ***の前にあるものはすべて***だから、 'Y = Z'のインスタンス化は***成功の場合にのみ起こります***、失敗ではないので。 –

+0

@WillNessコメントを明確にしていただきありがとうございます。ブラットコの本の例を追加して私の理解をさらに深めました。 –

答えて

1

this answerおよびthis questionも参照してください。

上記のmax/3の解決方法はどうすればよいですか?次のように

max(X,Y,Z):- X =< Y, !, Y = Z. 
max(X,Y,X). 

あなたはこれを読むことができます。

X =< Y

は、述語の二句を忘れて、そしてYZを統一します。

カットは選択肢を投げ捨てます。選択肢のポイントは、プルーフ・ツリー内のマークで、ソリューションを見つけた後、より多くのソリューションの検索を再開する場所をPrologに指示します。そのカットはプルーフツリーの一部を切り落とします。上の最初のリンク(here it is again)では、いくつかの細部についてのカットについて説明していますが、その答えの大きな部分は、他の人がカットに関する他の言葉を引用しているだけです。

私は、Prologプログラムにカットを入れたら、宣言的にではなく、それを操作的に読むよう強制しています。プルーフツリーのどの部分が切り取られるのか理解するためには、あなたは(プログラマ)は動きを見て、節の順序を検討し、どのサブゴールが選択肢点を作ることができるかを考え、どの解決策が失われるかを考慮する必要があります。証明ツリーを作成する必要があります。

多くの場合、テクニックを使用して、必要のない選択肢ポイントを作成することを避けることができます。しかし、これは大きな話題です。利用可能な資料を読み、特定の質問をする必要があります。

+0

こんにちはボリス、ありがとうございました。私がそのコンセプトを理解するために、私はBratkoの本の例を私の元の投稿とそれに付随する私の解釈に加え、それに関する小さな質問を加えました。追加された情報と質問を確認できますか?前もって感謝します! –

+0

編集:WillNessはフォローアップの問題のために新しい質問を投稿するように勧めましたので、新しいトピック[ここ](http://stackoverflow.com/questions/40994026/how-to-interpret-this-prolog-goal-with-効率を向上させることができる。 –